diff --git a/ravicomp/src/codegen.c b/ravicomp/src/codegen.c index df80dcc..7830dca 100644 --- a/ravicomp/src/codegen.c +++ b/ravicomp/src/codegen.c @@ -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" diff --git a/src/lcode.c b/src/lcode.c index be67d56..a943358 100644 --- a/src/lcode.c +++ b/src/lcode.c @@ -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*/ diff --git a/src/lobject.h b/src/lobject.h index 49dd297..5389621 100644 --- a/src/lobject.h +++ b/src/lobject.h @@ -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; /* diff --git a/src/lparser.c b/src/lparser.c index 3b6695c..ee3d7f2 100644 --- a/src/lparser.c +++ b/src/lparser.c @@ -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 diff --git a/src/lundump.c b/src/lundump.c index 268cfa9..bcc7f09 100644 --- a/src/lundump.c +++ b/src/lundump.c @@ -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; } } diff --git a/src/ravi_jitshared.c b/src/ravi_jitshared.c index 91fe8ac..d940710 100644 --- a/src/ravi_jitshared.c +++ b/src/ravi_jitshared.c @@ -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"