master
Dibyendu Majumdar 3 years ago
parent 53ec0c19b3
commit e3d8203bd9

@ -344,6 +344,10 @@ static const char Lua_header[] =
"#define RAVI_TM_BOOLEAN (RAVI_TM_FALSE | RAVI_TM_TRUE)\n"
"#define RAVI_TM_NUMBER (RAVI_TM_INTEGER | RAVI_TM_FLOAT)\n"
"#define RAVI_TM_INDEXABLE (RAVI_TM_INTEGER_ARRAY | RAVI_TM_FLOAT_ARRAY | RAVI_TM_TABLE)\n"
"#define RAVI_TM_STRING_OR_NIL (RAVI_TM_STRING | RAVI_TM_NIL)\n"
"#define RAVI_TM_FUNCTION_OR_NIL (RAVI_TM_FUNCTION | RAVI_TM_NIL)\n"
"#define RAVI_TM_BOOLEAN_OR_NIL (RAVI_TM_BOOLEAN | RAVI_TM_NIL)\n"
"#define RAVI_TM_USERDATA_OR_NIL (RAVI_TM_USERDATA | RAVI_TM_NIL)\n"
"#define RAVI_TM_ANY (~0)\n"
"typedef enum {\n"
"RAVI_TNIL = RAVI_TM_NIL, /* NIL */\n"
@ -353,12 +357,12 @@ static const char Lua_header[] =
"RAVI_TARRAYINT = RAVI_TM_INTEGER_ARRAY, /* array of ints */\n"
"RAVI_TARRAYFLT = RAVI_TM_FLOAT_ARRAY, /* array of doubles */\n"
"RAVI_TTABLE = RAVI_TM_TABLE, /* Lua table */\n"
"RAVI_TSTRING = RAVI_TM_STRING | RAVI_TM_NIL, /* string */\n"
"RAVI_TFUNCTION = RAVI_TM_FUNCTION | RAVI_TM_NIL, /* Lua or C Function */\n"
"RAVI_TBOOLEAN = RAVI_TM_BOOLEAN | RAVI_TM_NIL, /* boolean */\n"
"RAVI_TSTRING = RAVI_TM_STRING_OR_NIL, /* string */\n"
"RAVI_TFUNCTION = RAVI_TM_FUNCTION_OR_NIL, /* Lua or C Function */\n"
"RAVI_TBOOLEAN = RAVI_TM_BOOLEAN_OR_NIL, /* boolean */\n"
"RAVI_TTRUE = RAVI_TM_TRUE,\n"
"RAVI_TFALSE = RAVI_TM_FALSE,\n"
"RAVI_TUSERDATA = RAVI_TM_USERDATA | RAVI_TM_NIL, /* userdata or lightuserdata */\n"
"RAVI_TUSERDATA = RAVI_TM_USERDATA_OR_NIL, /* userdata or lightuserdata */\n"
"RAVI_TANY = RAVI_TM_ANY, /* Lua dynamic type */\n"
"} ravitype_t;\n"
"typedef struct Upvaldesc {\n"

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

@ -90,23 +90,27 @@ typedef uint32_t ravi_type_map;
#define RAVI_TM_BOOLEAN (RAVI_TM_FALSE | RAVI_TM_TRUE)
#define RAVI_TM_NUMBER (RAVI_TM_INTEGER | RAVI_TM_FLOAT)
#define RAVI_TM_INDEXABLE (RAVI_TM_INTEGER_ARRAY | RAVI_TM_FLOAT_ARRAY | RAVI_TM_TABLE)
#define RAVI_TM_STRING_OR_NIL (RAVI_TM_STRING | RAVI_TM_NIL)
#define RAVI_TM_FUNCTION_OR_NIL (RAVI_TM_FUNCTION | RAVI_TM_NIL)
#define RAVI_TM_BOOLEAN_OR_NIL (RAVI_TM_BOOLEAN | RAVI_TM_NIL)
#define RAVI_TM_USERDATA_OR_NIL (RAVI_TM_USERDATA | RAVI_TM_NIL)
#define RAVI_TM_ANY (~0)
typedef enum {
RAVI_TNIL = RAVI_TM_NIL, /* NIL */
RAVI_TNUMINT = RAVI_TM_INTEGER, /* integer number */
RAVI_TNUMFLT = RAVI_TM_FLOAT, /* floating point number */
RAVI_TNIL = RAVI_TM_NIL, /* NIL */
RAVI_TNUMINT = RAVI_TM_INTEGER, /* integer number */
RAVI_TNUMFLT = RAVI_TM_FLOAT, /* floating point number */
RAVI_TNUMBER = RAVI_TM_NUMBER,
RAVI_TARRAYINT = RAVI_TM_INTEGER_ARRAY, /* array of ints */
RAVI_TARRAYFLT = RAVI_TM_FLOAT_ARRAY, /* array of doubles */
RAVI_TTABLE = RAVI_TM_TABLE, /* Lua table */
RAVI_TSTRING = RAVI_TM_STRING | RAVI_TM_NIL, /* string */
RAVI_TFUNCTION = RAVI_TM_FUNCTION | RAVI_TM_NIL, /* Lua or C Function */
RAVI_TBOOLEAN = RAVI_TM_BOOLEAN | RAVI_TM_NIL, /* boolean */
RAVI_TARRAYINT = RAVI_TM_INTEGER_ARRAY, /* array of ints */
RAVI_TARRAYFLT = RAVI_TM_FLOAT_ARRAY, /* array of doubles */
RAVI_TTABLE = RAVI_TM_TABLE, /* Lua table */
RAVI_TSTRING = RAVI_TM_STRING_OR_NIL, /* string */
RAVI_TFUNCTION = RAVI_TM_FUNCTION_OR_NIL, /* Lua or C Function */
RAVI_TBOOLEAN = RAVI_TM_BOOLEAN_OR_NIL, /* boolean */
RAVI_TTRUE = RAVI_TM_TRUE,
RAVI_TFALSE = RAVI_TM_FALSE,
RAVI_TUSERDATA = RAVI_TM_USERDATA | RAVI_TM_NIL, /* userdata or lightuserdata */
RAVI_TANY = RAVI_TM_ANY, /* Lua dynamic type */
RAVI_TUSERDATA = RAVI_TM_USERDATA_OR_NIL, /* userdata or lightuserdata */
RAVI_TANY = RAVI_TM_ANY, /* Lua dynamic type */
} ravitype_t;
/*

@ -635,11 +635,11 @@ static void ravi_code_typecoersion(LexState *ls, int reg, ravi_type_map tm,
luaK_codeABC(ls->fs, tm == RAVI_TM_INTEGER_ARRAY ? OP_RAVI_TOIARRAY : OP_RAVI_TOFARRAY, reg, 0, 0);
else if (tm == RAVI_TM_TABLE)
luaK_codeABC(ls->fs, OP_RAVI_TOTAB, reg, 0, 0);
else if (tm == (RAVI_TM_USERDATA | RAVI_TM_NIL))
else if (tm == RAVI_TM_USERDATA_OR_NIL)
luaK_codeABx(ls->fs, OP_RAVI_TOTYPE, reg, luaK_stringK(ls->fs, typename));
else if (tm == (RAVI_TM_STRING | RAVI_TM_NIL))
else if (tm == RAVI_TM_STRING_OR_NIL)
luaK_codeABC(ls->fs, OP_RAVI_TOSTRING, reg, 0, 0);
else if (tm == (RAVI_TM_FUNCTION | RAVI_TM_NIL))
else if (tm == RAVI_TM_FUNCTION_OR_NIL)
luaK_codeABC(ls->fs, OP_RAVI_TOCLOSURE, reg, 0, 0);
// TODO coerse to boolean
}
@ -1274,18 +1274,18 @@ static ravi_type_map declare_localvar(LexState *ls, TString **pusertype) {
else if (strcmp(str, "number") == 0)
tm = RAVI_TM_FLOAT;
else if (strcmp(str, "closure") == 0)
tm = RAVI_TM_FUNCTION | RAVI_TM_NIL;
tm = RAVI_TM_FUNCTION_OR_NIL;
else if (strcmp(str, "table") == 0)
tm = RAVI_TM_TABLE;
else if (strcmp(str, "string") == 0)
tm = RAVI_TM_STRING | RAVI_TM_NIL;
tm = RAVI_TM_STRING_OR_NIL;
//else if (strcmp(str, "boolean") == 0)
// tm = RAVI_TM_BOOLEAN | RAVI_TM_NIL;
// tm = RAVI_TM_BOOLEAN_OR_NIL;
else if (strcmp(str, "any") == 0)
tm = RAVI_TM_ANY;
else {
/* default is a userdata type */
tm = RAVI_TM_USERDATA | RAVI_TM_NIL;
tm = RAVI_TM_USERDATA_OR_NIL;
typename = user_defined_type_name(ls, typename);
str = getstr(typename);
*pusertype = typename;
@ -1458,8 +1458,8 @@ static void ravi_typecheck(LexState *ls, expdesc *v, ravi_type_map *var_types,
/* if we are calling a function then convert return types */
else if ((vartype == RAVI_TM_FLOAT || vartype == RAVI_TM_INTEGER ||
vartype == RAVI_TM_FLOAT_ARRAY || vartype == RAVI_TM_INTEGER_ARRAY ||
vartype == RAVI_TM_TABLE || vartype == (RAVI_TM_STRING | RAVI_TM_NIL) ||
vartype == (RAVI_TM_FUNCTION | RAVI_TM_NIL) || vartype == (RAVI_TM_USERDATA | RAVI_TM_NIL)) &&
vartype == RAVI_TM_TABLE || vartype == RAVI_TM_STRING_OR_NIL ||
vartype == RAVI_TM_FUNCTION_OR_NIL || vartype == RAVI_TM_USERDATA_OR_NIL) &&
v->k == VCALL) {
/* For local variable declarations that call functions e.g.
* local i = func()
@ -1486,9 +1486,9 @@ static void ravi_typecheck(LexState *ls, expdesc *v, ravi_type_map *var_types,
/* do we need to convert ? */
ravi_code_typecoersion(ls, a + (i - n), var_types[i], NULL);
}
else if (vartype == (RAVI_TM_STRING | RAVI_TM_NIL) ||
vartype == (RAVI_TM_FUNCTION | RAVI_TM_NIL) ||
vartype == (RAVI_TM_USERDATA | RAVI_TM_NIL)) {
else if (vartype == RAVI_TM_STRING_OR_NIL ||
vartype == RAVI_TM_FUNCTION_OR_NIL ||
vartype == RAVI_TM_USERDATA_OR_NIL) {
TString *usertype = usertypes[n]; // NULL if var_types[n] is not userdata
/* we need to make sure that a register is assigned to 'v'
so that we can emit type assertion instructions. This would have

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

@ -331,6 +331,10 @@ static const char Lua_header[] =
"#define RAVI_TM_BOOLEAN (RAVI_TM_FALSE | RAVI_TM_TRUE)\n"
"#define RAVI_TM_NUMBER (RAVI_TM_INTEGER | RAVI_TM_FLOAT)\n"
"#define RAVI_TM_INDEXABLE (RAVI_TM_INTEGER_ARRAY | RAVI_TM_FLOAT_ARRAY | RAVI_TM_TABLE)\n"
"#define RAVI_TM_STRING_OR_NIL (RAVI_TM_STRING | RAVI_TM_NIL)\n"
"#define RAVI_TM_FUNCTION_OR_NIL (RAVI_TM_FUNCTION | RAVI_TM_NIL)\n"
"#define RAVI_TM_BOOLEAN_OR_NIL (RAVI_TM_BOOLEAN | RAVI_TM_NIL)\n"
"#define RAVI_TM_USERDATA_OR_NIL (RAVI_TM_USERDATA | RAVI_TM_NIL)\n"
"#define RAVI_TM_ANY (~0)\n"
"typedef enum {\n"
"RAVI_TNIL = RAVI_TM_NIL, /* NIL */\n"
@ -340,12 +344,12 @@ static const char Lua_header[] =
"RAVI_TARRAYINT = RAVI_TM_INTEGER_ARRAY, /* array of ints */\n"
"RAVI_TARRAYFLT = RAVI_TM_FLOAT_ARRAY, /* array of doubles */\n"
"RAVI_TTABLE = RAVI_TM_TABLE, /* Lua table */\n"
"RAVI_TSTRING = RAVI_TM_STRING | RAVI_TM_NIL, /* string */\n"
"RAVI_TFUNCTION = RAVI_TM_FUNCTION | RAVI_TM_NIL, /* Lua or C Function */\n"
"RAVI_TBOOLEAN = RAVI_TM_BOOLEAN | RAVI_TM_NIL, /* boolean */\n"
"RAVI_TSTRING = RAVI_TM_STRING_OR_NIL, /* string */\n"
"RAVI_TFUNCTION = RAVI_TM_FUNCTION_OR_NIL, /* Lua or C Function */\n"
"RAVI_TBOOLEAN = RAVI_TM_BOOLEAN_OR_NIL, /* boolean */\n"
"RAVI_TTRUE = RAVI_TM_TRUE,\n"
"RAVI_TFALSE = RAVI_TM_FALSE,\n"
"RAVI_TUSERDATA = RAVI_TM_USERDATA | RAVI_TM_NIL, /* userdata or lightuserdata */\n"
"RAVI_TUSERDATA = RAVI_TM_USERDATA_OR_NIL, /* userdata or lightuserdata */\n"
"RAVI_TANY = RAVI_TM_ANY, /* Lua dynamic type */\n"
"} ravitype_t;\n"
"typedef struct Upvaldesc {\n"

Loading…
Cancel
Save