|
|
@ -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*/
|
|
|
|