Compile getfenv(0).

This commit is contained in:
Mike Pall 2013-10-09 20:34:40 +02:00
parent 88c7785b87
commit e6e760ca9f
5 changed files with 31 additions and 2 deletions

View File

@ -136,7 +136,7 @@ LJLIB_ASM(setmetatable) LJLIB_REC(.)
return FFH_RES(1);
}
LJLIB_CF(getfenv)
LJLIB_CF(getfenv) LJLIB_REC(.)
{
GCfunc *fn;
cTValue *o = L->base;

View File

@ -699,7 +699,7 @@ static void ra_left(ASMState *as, Reg dest, IRRef lref)
emit_loadu64(as, dest, ir_kint64(ir)->u64);
return;
#endif
} else {
} else if (ir->o != IR_KPRI) {
lua_assert(ir->o == IR_KINT || ir->o == IR_KGC ||
ir->o == IR_KPTR || ir->o == IR_KKPTR || ir->o == IR_KNULL);
emit_loadi(as, dest, ir->i);
@ -1191,6 +1191,16 @@ static void asm_newref(ASMState *as, IRIns *ir)
asm_tvptr(as, ra_releasetmp(as, ASMREF_TMP1), ir->op2);
}
static void asm_lref(ASMState *as, IRIns *ir)
{
Reg r = ra_dest(as, ir, RSET_GPR);
#if LJ_TARGET_X86ORX64
ra_left(as, r, ASMREF_L);
#else
ra_leftov(as, r, ASMREF_L);
#endif
}
/* -- Calls --------------------------------------------------------------- */
/* Collect arguments from CALL* and CARG instructions. */
@ -1624,6 +1634,7 @@ static void asm_ir(ASMState *as, IRIns *ir)
case IR_UREFO: case IR_UREFC: asm_uref(as, ir); break;
case IR_FREF: asm_fref(as, ir); break;
case IR_STRREF: asm_strref(as, ir); break;
case IR_LREF: asm_lref(as, ir); break;
/* Loads and stores. */
case IR_ALOAD: case IR_HLOAD: case IR_ULOAD: case IR_VLOAD:

View File

@ -422,6 +422,19 @@ static void LJ_FASTCALL recff_xpcall(jit_State *J, RecordFFData *rd)
} /* else: Interpreter will throw. */
}
static void LJ_FASTCALL recff_getfenv(jit_State *J, RecordFFData *rd)
{
TRef tr = J->base[0];
/* Only support getfenv(0) for now. */
if (tref_isint(tr) && tref_isk(tr) && IR(tref_ref(tr))->i == 0) {
TRef trl = emitir(IRT(IR_LREF, IRT_THREAD), 0, 0);
J->base[0] = emitir(IRT(IR_FLOAD, IRT_TAB), trl, IRFL_THREAD_ENV);
return;
}
recff_nyiu(J);
UNUSED(rd);
}
/* -- Math library fast functions ----------------------------------------- */
static void LJ_FASTCALL recff_math_abs(jit_State *J, RecordFFData *rd)

View File

@ -97,6 +97,7 @@
_(UREFC, LW, ref, lit) \
_(FREF, R , ref, lit) \
_(STRREF, N , ref, ref) \
_(LREF, L , ___, ___) \
\
/* Loads and Stores. These must be in the same order. */ \
_(ALOAD, L , ref, ___) \
@ -193,6 +194,7 @@ IRFPMDEF(FPMENUM)
_(STR_LEN, offsetof(GCstr, len)) \
_(FUNC_ENV, offsetof(GCfunc, l.env)) \
_(FUNC_PC, offsetof(GCfunc, l.pc)) \
_(THREAD_ENV, offsetof(lua_State, env)) \
_(TAB_META, offsetof(GCtab, metatable)) \
_(TAB_ARRAY, offsetof(GCtab, array)) \
_(TAB_NODE, offsetof(GCtab, node)) \

View File

@ -2104,6 +2104,7 @@ LJFOLDF(fwd_href_tdup)
** an aliased table, as it may invalidate all of the pointers and fields.
** Only HREF needs the NEWREF check -- AREF and HREFK already depend on
** FLOADs. And NEWREF itself is treated like a store (see below).
** LREF is constant (per trace) since coroutine switches are not inlined.
*/
LJFOLD(FLOAD TNEW IRFL_TAB_ASIZE)
LJFOLDF(fload_tab_tnew_asize)
@ -2221,6 +2222,8 @@ LJFOLDF(fload_cdata_ptr_int64_cnew)
}
LJFOLD(FLOAD any IRFL_STR_LEN)
LJFOLD(FLOAD any IRFL_FUNC_ENV)
LJFOLD(FLOAD any IRFL_THREAD_ENV)
LJFOLD(FLOAD any IRFL_CDATA_CTYPEID)
LJFOLD(FLOAD any IRFL_CDATA_PTR)
LJFOLD(FLOAD any IRFL_CDATA_INT)