issue #110 add support for a few more op codes

pull/167/head
Dibyendu Majumdar 6 years ago
parent 31bb288c2c
commit 3e1d1bc752

@ -143,5 +143,6 @@ LUAI_FUNC void raviV_settable_sskey(lua_State *L, const TValue *t, TValue *key,
LUAI_FUNC void raviV_gettable_i(lua_State *L, const TValue *t, TValue *key, StkId val);
LUAI_FUNC void raviV_settable_i(lua_State *L, const TValue *t, TValue *key, StkId val);
LUAI_FUNC void raviV_op_totype(lua_State *L, TValue *ra, TValue *rb);
LUAI_FUNC int raviV_check_usertype(lua_State *L, TString *name, const TValue *o);
#endif

@ -89,6 +89,9 @@ enum errorcode {
Error_for_step_must_be_number,
Error_for_initial_value_must_be_number,
Error_array_out_of_bounds,
Error_string_expected,
Error_closure_expected,
Error_type_mismatch,
};
enum ravi_codegen_type {

@ -1117,7 +1117,7 @@ void luaV_finishOp (lua_State *L) {
Protect(luaV_finishset(L,t,k,v,slot)); }
static int check_usertype(lua_State *L, TString *name, const TValue *o)
int raviV_check_usertype(lua_State *L, TString *name, const TValue *o)
{
Table *mt;
switch (ttnov(o)) {
@ -2439,7 +2439,7 @@ int luaV_execute (lua_State *L) {
if (!ttisshrstring(rb))
luaG_runerror(L, "type name must be string");
TString *key = tsvalue(rb);
if (!check_usertype(L, key, ra))
if (!raviV_check_usertype(L, key, ra))
luaG_runerror(L, "type mismatch: expected %s", getstr(key));
}
vmbreak;
@ -2973,7 +2973,7 @@ void raviV_op_totype(lua_State *L, TValue *ra, TValue *rb) {
return;
if (!ttisshrstring(rb)) luaG_runerror(L, "type name must be string");
TString *key = tsvalue(rb);
if (!check_usertype(L, key, ra))
if (!raviV_check_usertype(L, key, ra))
luaG_runerror(L, "type mismatch: expected %s", getstr(key));
}

@ -563,6 +563,7 @@ static const char Lua_header[] = ""
"extern void luaD_call (lua_State *L, StkId func, int nResults);\n"
"extern void raviH_set_int(lua_State *L, Table *t, lua_Unsigned key, lua_Integer value);\n"
"extern void raviH_set_float(lua_State *L, Table *t, lua_Unsigned key, lua_Number value);\n"
"extern int raviV_check_usertype(lua_State *L, TString *name, const TValue *o);\n"
"#define R(i) (base + i)\n"
"#define K(i) (k + i)\n"
;
@ -679,11 +680,11 @@ bool raviJ_cancompile(Proto *p) {
case OP_CLOSURE:
case OP_LEN:
case OP_NOT:
case OP_SETLIST: break;
#if 0
case OP_SETLIST:
case OP_RAVI_TOCLOSURE:
case OP_RAVI_TOSTRING:
case OP_RAVI_TOTYPE:
case OP_RAVI_TOTYPE: break;
#if 0
case OP_LOADKX:
case OP_UNM:
case OP_BNOT:
@ -1450,6 +1451,48 @@ static void emit_op_totab(struct function *fn, int A, int pc) {
membuff_add_string(&fn->body, "}\n");
}
static void emit_op_toclosure(struct function *fn, int A, int pc) {
(void)pc;
emit_reg(fn, "ra", A);
membuff_add_string(&fn->body, "if (!ttisclosure(ra)) {\n");
#if GOTO_ON_ERROR
membuff_add_fstring(&fn->body, " error_code = %d;\n", Error_closure_expected);
membuff_add_string(&fn->body, " goto Lraise_error;\n");
#else
membuff_add_fstring(&fn->body, " raise_error(L, %d);\n", Error_closure_expected);
#endif
membuff_add_string(&fn->body, "}\n");
}
static void emit_op_tostring(struct function *fn, int A, int pc) {
(void)pc;
emit_reg(fn, "ra", A);
membuff_add_string(&fn->body, "if (!ttisstring(ra)) {\n");
#if GOTO_ON_ERROR
membuff_add_fstring(&fn->body, " error_code = %d;\n", Error_string_expected);
membuff_add_string(&fn->body, " goto Lraise_error;\n");
#else
membuff_add_fstring(&fn->body, " raise_error(L, %d);\n", Error_string_expected);
#endif
membuff_add_string(&fn->body, "}\n");
}
static void emit_op_totype(struct function *fn, int A, int Bx, int pc) {
(void)pc;
emit_reg(fn, "ra", A);
membuff_add_string(&fn->body, "if (!ttisnil(ra)) {\n");
membuff_add_fstring(&fn->body, " rb = K(%d);\n", Bx);
membuff_add_string(&fn->body, " if (!ttisshrstring(rb) || !raviV_check_usertype(L, tsvalue(rb), ra)) {\n");
#if GOTO_ON_ERROR
membuff_add_fstring(&fn->body, " error_code = %d;\n", Error_type_mismatch);
membuff_add_string(&fn->body, " goto Lraise_error;\n");
#else
membuff_add_fstring(&fn->body, " raise_error(L, %d);\n", Error_type_mismatch);
#endif
membuff_add_string(&fn->body, " }\n");
membuff_add_string(&fn->body, "}\n");
}
static void emit_op_setlist(struct function *fn, int A, int B, int C, int pc) {
(void)pc;
emit_reg(fn, "ra", A);
@ -2003,6 +2046,15 @@ bool raviJ_codegen(struct lua_State *L, struct Proto *p,
case OP_RAVI_TOARRAYF: {
emit_op_toaf(&fn, A, pc);
} break;
case OP_RAVI_TOSTRING: {
emit_op_tostring(&fn, A, pc);
} break;
case OP_RAVI_TOCLOSURE: {
emit_op_toclosure(&fn, A, pc);
} break;
case OP_RAVI_TOTYPE: {
emit_op_totype(&fn, A, GETARG_Bx(i), pc);
} break;
case OP_RAVI_MOVEI: {
int B = GETARG_B(i);
emit_op_movei(&fn, A, B, pc);

@ -47,10 +47,13 @@ static const char *errortext[] = {"integer expected",
"for step must be a number",
"for initial value must be a number",
"array index is out of bounds",
"string expected",
"closure expected",
"type mismatch: wrong userdata type",
NULL};
static void raise_error(lua_State *L, int errorcode) {
assert(errorcode >= 0 && errorcode <= Error_array_out_of_bounds);
assert(errorcode >= 0 && errorcode <= Error_type_mismatch);
luaG_runerror(L, errortext[errorcode]);
}
@ -181,6 +184,8 @@ int raviV_initjit(struct lua_State *L) {
register_builtin_arg4(jit->jit, "raviH_set_int", raviH_set_int, JIT_NoType, JIT_Address, JIT_Address, JIT_Int64, JIT_Int64);
//"extern void raviH_set_float(lua_State *L, Table *t, lua_Unsigned key, lua_Number value);\n"
register_builtin_arg4(jit->jit, "raviH_set_float", raviH_set_float, JIT_NoType, JIT_Address, JIT_Address, JIT_Int64, JIT_Double);
//int raviV_check_usertype(lua_State *L, TString *name, const TValue *o);
register_builtin_arg3(jit->jit, "raviV_check_usertype", raviV_check_usertype, JIT_Int32, JIT_Address, JIT_Address, JIT_Address);
G->ravi_state = jit;
return 0;

Loading…
Cancel
Save