changed types to strict (nil disallowed) in lcode.c

master
Pavel R. 3 years ago
parent 072d2c37f0
commit 7adbc171f6

@ -700,11 +700,11 @@ static void discharge2reg (FuncState *fs, expdesc *e, int reg) {
break; break;
default: default:
luaK_codeABC(fs, OP_MOVE, reg, e->u.info, 0); luaK_codeABC(fs, OP_MOVE, reg, e->u.info, 0);
if (ravi_type == RAVI_TM_STRING_OR_NIL) if (ravi_type == RAVI_TM_STRING)
luaK_codeABC(fs, OP_RAVI_TOSTRING, reg, 0, 0); luaK_codeABC(fs, OP_RAVI_TOSTRING, reg, 0, 0);
else if (ravi_type == RAVI_TM_FUNCTION_OR_NIL) else if (ravi_type == RAVI_TM_FUNCTION)
luaK_codeABC(fs, OP_RAVI_TOCLOSURE, reg, 0, 0); luaK_codeABC(fs, OP_RAVI_TOCLOSURE, reg, 0, 0);
else if (ravi_type == RAVI_TM_USERDATA_OR_NIL && usertype) else if (ravi_type == RAVI_TM_USERDATA && usertype)
luaK_codeABx(fs, OP_RAVI_TOTYPE, reg, luaK_stringK(fs, usertype)); luaK_codeABx(fs, OP_RAVI_TOTYPE, reg, luaK_stringK(fs, usertype));
break; break;
} }
@ -869,9 +869,9 @@ static void check_valid_store(FuncState *fs, expdesc *var, expdesc *ex) {
var->ravi_type_map == RAVI_TM_FLOAT_ARRAY || var->ravi_type_map == RAVI_TM_FLOAT_ARRAY ||
var->ravi_type_map == RAVI_TM_INTEGER_ARRAY || var->ravi_type_map == RAVI_TM_INTEGER_ARRAY ||
var->ravi_type_map == RAVI_TM_TABLE || var->ravi_type_map == RAVI_TM_TABLE ||
var->ravi_type_map == RAVI_TM_STRING_OR_NIL || var->ravi_type_map == RAVI_TM_STRING ||
var->ravi_type_map == RAVI_TM_FUNCTION_OR_NIL || var->ravi_type_map == RAVI_TM_FUNCTION ||
var->ravi_type_map == RAVI_TM_USERDATA_OR_NIL)) { var->ravi_type_map == RAVI_TM_USERDATA)) {
/* handled by MOVEI, MOVEF, MOVEIARRAY, MOVEFARRAY at runtime */ /* handled by MOVEI, MOVEF, MOVEIARRAY, MOVEFARRAY at runtime */
return; return;
} }
@ -913,8 +913,8 @@ static void check_valid_store(FuncState *fs, expdesc *var, expdesc *ex) {
"Invalid assignment: %s expected", "Invalid assignment: %s expected",
var->ravi_type_map == RAVI_TM_TABLE ? "table" : (var->ravi_type_map == RAVI_TM_FLOAT_ARRAY ? "number[]" : "integer[]"))); var->ravi_type_map == RAVI_TM_TABLE ? "table" : (var->ravi_type_map == RAVI_TM_FLOAT_ARRAY ? "number[]" : "integer[]")));
} }
else if (var->ravi_type_map == RAVI_TM_STRING_OR_NIL) { else if (var->ravi_type_map == RAVI_TM_STRING) {
if ((ex_ravi_type_map & ~RAVI_TM_STRING_OR_NIL) == 0) if ((ex_ravi_type_map & ~RAVI_TM_STRING) == 0)
return; return;
luaX_syntaxerror( luaX_syntaxerror(
fs->ls, fs->ls,
@ -922,8 +922,8 @@ static void check_valid_store(FuncState *fs, expdesc *var, expdesc *ex) {
fs->ls->L, fs->ls->L,
"Invalid assignment: string expected")); "Invalid assignment: string expected"));
} }
else if (var->ravi_type_map == RAVI_TM_FUNCTION_OR_NIL) { else if (var->ravi_type_map == RAVI_TM_FUNCTION) {
if ((ex_ravi_type_map & ~RAVI_TM_FUNCTION_OR_NIL) == 0) if ((ex_ravi_type_map & ~RAVI_TM_FUNCTION) == 0)
return; return;
luaX_syntaxerror( luaX_syntaxerror(
fs->ls, fs->ls,
@ -931,8 +931,8 @@ static void check_valid_store(FuncState *fs, expdesc *var, expdesc *ex) {
fs->ls->L, fs->ls->L,
"Invalid assignment: function expected")); "Invalid assignment: function expected"));
} }
else if (var->ravi_type_map == RAVI_TM_USERDATA_OR_NIL) { else if (var->ravi_type_map == RAVI_TM_USERDATA) {
if ((ex_ravi_type_map & ~RAVI_TM_USERDATA_OR_NIL) == 0 && if ((ex_ravi_type_map & ~RAVI_TM_USERDATA) == 0 &&
(!(ex_ravi_type_map & RAVI_TM_USERDATA) || (var->usertype && var->usertype == ex->usertype))) (!(ex_ravi_type_map & RAVI_TM_USERDATA) || (var->usertype && var->usertype == ex->usertype)))
return; return;
luaX_syntaxerror( luaX_syntaxerror(
@ -948,8 +948,8 @@ static OpCode check_valid_setupval(FuncState *fs, expdesc *var, expdesc *ex,
OpCode op = OP_SETUPVAL; OpCode op = OP_SETUPVAL;
if ((var->ravi_type_map == RAVI_TM_INTEGER || var->ravi_type_map == RAVI_TM_FLOAT || if ((var->ravi_type_map == RAVI_TM_INTEGER || var->ravi_type_map == RAVI_TM_FLOAT ||
var->ravi_type_map == RAVI_TM_INTEGER_ARRAY || var->ravi_type_map == RAVI_TM_FLOAT_ARRAY || var->ravi_type_map == RAVI_TM_INTEGER_ARRAY || var->ravi_type_map == RAVI_TM_FLOAT_ARRAY ||
var->ravi_type_map == RAVI_TM_TABLE || var->ravi_type_map == RAVI_TM_STRING_OR_NIL || var->ravi_type_map == RAVI_TM_TABLE || var->ravi_type_map == RAVI_TM_STRING ||
var->ravi_type_map == RAVI_TM_FUNCTION_OR_NIL || var->ravi_type_map == RAVI_TM_USERDATA_OR_NIL) && var->ravi_type_map == RAVI_TM_FUNCTION || var->ravi_type_map == RAVI_TM_USERDATA) &&
ex->ravi_type_map & ~var->ravi_type_map) { ex->ravi_type_map & ~var->ravi_type_map) {
if (var->ravi_type_map == RAVI_TM_INTEGER) if (var->ravi_type_map == RAVI_TM_INTEGER)
op = OP_RAVI_SETUPVALI; op = OP_RAVI_SETUPVALI;
@ -961,11 +961,11 @@ static OpCode check_valid_setupval(FuncState *fs, expdesc *var, expdesc *ex,
op = OP_RAVI_SETUPVAL_FARRAY; op = OP_RAVI_SETUPVAL_FARRAY;
else if (var->ravi_type_map == RAVI_TM_TABLE) else if (var->ravi_type_map == RAVI_TM_TABLE)
op = OP_RAVI_SETUPVALT; op = OP_RAVI_SETUPVALT;
else if (var->ravi_type_map == RAVI_TM_STRING_OR_NIL) else if (var->ravi_type_map == RAVI_TM_STRING)
luaK_codeABC(fs, OP_RAVI_TOSTRING, reg, 0, 0); luaK_codeABC(fs, OP_RAVI_TOSTRING, reg, 0, 0);
else if (var->ravi_type_map == RAVI_TM_FUNCTION_OR_NIL) else if (var->ravi_type_map == RAVI_TM_FUNCTION)
luaK_codeABC(fs, OP_RAVI_TOCLOSURE, reg, 0, 0); luaK_codeABC(fs, OP_RAVI_TOCLOSURE, reg, 0, 0);
else if (var->ravi_type_map == RAVI_TM_USERDATA_OR_NIL) { else if (var->ravi_type_map == RAVI_TM_USERDATA) {
TString *usertype = fs->f->upvalues[var->u.info].usertype; TString *usertype = fs->f->upvalues[var->u.info].usertype;
luaK_codeABx(fs, OP_RAVI_TOTYPE, reg, luaK_stringK(fs, usertype)); luaK_codeABx(fs, OP_RAVI_TOTYPE, reg, luaK_stringK(fs, usertype));
} }
@ -1547,17 +1547,17 @@ static void code_type_assertion(FuncState *fs, UnOpr op, expdesc *e, TString *us
opcode = OP_RAVI_TOTAB; opcode = OP_RAVI_TOTAB;
tm = RAVI_TM_TABLE; tm = RAVI_TM_TABLE;
} }
else if (op == OPR_TO_STRING && (e->ravi_type_map & (~RAVI_TM_STRING_OR_NIL)) != 0) { else if (op == OPR_TO_STRING && (e->ravi_type_map & (~RAVI_TM_STRING)) != 0) {
opcode = OP_RAVI_TOSTRING; opcode = OP_RAVI_TOSTRING;
tm = RAVI_TM_STRING_OR_NIL; tm = RAVI_TM_STRING;
} }
else if (op == OPR_TO_CLOSURE && (e->ravi_type_map & (~RAVI_TM_FUNCTION_OR_NIL)) != 0) { else if (op == OPR_TO_CLOSURE && (e->ravi_type_map & (~RAVI_TM_FUNCTION)) != 0) {
opcode = OP_RAVI_TOCLOSURE; opcode = OP_RAVI_TOCLOSURE;
tm = RAVI_TM_FUNCTION_OR_NIL; tm = RAVI_TM_FUNCTION;
} }
else if (op == OPR_TO_TYPE) { else if (op == OPR_TO_TYPE) {
opcode = OP_RAVI_TOTYPE; opcode = OP_RAVI_TOTYPE;
tm = RAVI_TM_USERDATA_OR_NIL; tm = RAVI_TM_USERDATA;
} }
else { else {
/* nothing to do*/ /* nothing to do*/

@ -192,12 +192,12 @@ static ravi_type_map ravi_map_old_type_to_new(lu_byte type) {
case 2: return RAVI_TM_FLOAT; case 2: return RAVI_TM_FLOAT;
case 3: return RAVI_TM_INTEGER_ARRAY; case 3: return RAVI_TM_INTEGER_ARRAY;
case 4: return RAVI_TM_FLOAT_ARRAY; case 4: return RAVI_TM_FLOAT_ARRAY;
case 5: return RAVI_TM_FUNCTION_OR_NIL; case 5: return RAVI_TM_FUNCTION;
case 6: return RAVI_TM_TABLE; case 6: return RAVI_TM_TABLE;
case 7: return RAVI_TM_STRING_OR_NIL; case 7: return RAVI_TM_STRING;
case 8: return RAVI_TM_NIL; case 8: return RAVI_TM_NIL;
case 9: return RAVI_TM_BOOLEAN_OR_NIL; case 9: return RAVI_TM_BOOLEAN;
case 10: return RAVI_TM_USERDATA_OR_NIL; case 10: return RAVI_TM_USERDATA;
default: return RAVI_TM_ANY; default: return RAVI_TM_ANY;
} }
} }

Loading…
Cancel
Save