mirror of
https://github.com/LuaJIT/LuaJIT.git
synced 2025-02-07 23:24:09 +00:00
Rearrange library functions to get a fixed FF_next.
This commit is contained in:
parent
d9c5eba1bb
commit
4c7c2c8319
100
src/lib_base.c
100
src/lib_base.c
@ -68,6 +68,56 @@ LJLIB_PUSH("number")
|
|||||||
LJLIB_ASM_(type) LJLIB_REC(.)
|
LJLIB_ASM_(type) LJLIB_REC(.)
|
||||||
/* Recycle the lj_lib_checkany(L, 1) from assert. */
|
/* Recycle the lj_lib_checkany(L, 1) from assert. */
|
||||||
|
|
||||||
|
/* -- Base library: iterators --------------------------------------------- */
|
||||||
|
|
||||||
|
/* This solves a circular dependency problem -- change FF_next_N as needed. */
|
||||||
|
LJ_STATIC_ASSERT((int)FF_next == FF_next_N);
|
||||||
|
|
||||||
|
LJLIB_ASM(next)
|
||||||
|
{
|
||||||
|
lj_lib_checktab(L, 1);
|
||||||
|
return FFH_UNREACHABLE;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if LJ_52 || LJ_HASFFI
|
||||||
|
static int ffh_pairs(lua_State *L, MMS mm)
|
||||||
|
{
|
||||||
|
TValue *o = lj_lib_checkany(L, 1);
|
||||||
|
cTValue *mo = lj_meta_lookup(L, o, mm);
|
||||||
|
if ((LJ_52 || tviscdata(o)) && !tvisnil(mo)) {
|
||||||
|
L->top = o+1; /* Only keep one argument. */
|
||||||
|
copyTV(L, L->base-1, mo); /* Replace callable. */
|
||||||
|
return FFH_TAILCALL;
|
||||||
|
} else {
|
||||||
|
if (!tvistab(o)) lj_err_argt(L, 1, LUA_TTABLE);
|
||||||
|
setfuncV(L, o-1, funcV(lj_lib_upvalue(L, 1)));
|
||||||
|
if (mm == MM_pairs) setnilV(o+1); else setintV(o+1, 0);
|
||||||
|
return FFH_RES(3);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
#define ffh_pairs(L, mm) (lj_lib_checktab(L, 1), FFH_UNREACHABLE)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
LJLIB_PUSH(lastcl)
|
||||||
|
LJLIB_ASM(pairs)
|
||||||
|
{
|
||||||
|
return ffh_pairs(L, MM_pairs);
|
||||||
|
}
|
||||||
|
|
||||||
|
LJLIB_NOREGUV LJLIB_ASM(ipairs_aux) LJLIB_REC(.)
|
||||||
|
{
|
||||||
|
lj_lib_checktab(L, 1);
|
||||||
|
lj_lib_checkint(L, 2);
|
||||||
|
return FFH_UNREACHABLE;
|
||||||
|
}
|
||||||
|
|
||||||
|
LJLIB_PUSH(lastcl)
|
||||||
|
LJLIB_ASM(ipairs) LJLIB_REC(.)
|
||||||
|
{
|
||||||
|
return ffh_pairs(L, MM_ipairs);
|
||||||
|
}
|
||||||
|
|
||||||
/* -- Base library: getters and setters ----------------------------------- */
|
/* -- Base library: getters and setters ----------------------------------- */
|
||||||
|
|
||||||
LJLIB_ASM_(getmetatable) LJLIB_REC(.)
|
LJLIB_ASM_(getmetatable) LJLIB_REC(.)
|
||||||
@ -267,56 +317,6 @@ LJLIB_ASM(tostring) LJLIB_REC(.)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -- Base library: iterators --------------------------------------------- */
|
|
||||||
|
|
||||||
/* This solves a circular dependency problem -- change FF_next_N as needed. */
|
|
||||||
LJ_STATIC_ASSERT((int)FF_next == FF_next_N);
|
|
||||||
|
|
||||||
LJLIB_ASM(next)
|
|
||||||
{
|
|
||||||
lj_lib_checktab(L, 1);
|
|
||||||
return FFH_UNREACHABLE;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if LJ_52 || LJ_HASFFI
|
|
||||||
static int ffh_pairs(lua_State *L, MMS mm)
|
|
||||||
{
|
|
||||||
TValue *o = lj_lib_checkany(L, 1);
|
|
||||||
cTValue *mo = lj_meta_lookup(L, o, mm);
|
|
||||||
if ((LJ_52 || tviscdata(o)) && !tvisnil(mo)) {
|
|
||||||
L->top = o+1; /* Only keep one argument. */
|
|
||||||
copyTV(L, L->base-1, mo); /* Replace callable. */
|
|
||||||
return FFH_TAILCALL;
|
|
||||||
} else {
|
|
||||||
if (!tvistab(o)) lj_err_argt(L, 1, LUA_TTABLE);
|
|
||||||
setfuncV(L, o-1, funcV(lj_lib_upvalue(L, 1)));
|
|
||||||
if (mm == MM_pairs) setnilV(o+1); else setintV(o+1, 0);
|
|
||||||
return FFH_RES(3);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
#define ffh_pairs(L, mm) (lj_lib_checktab(L, 1), FFH_UNREACHABLE)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
LJLIB_PUSH(lastcl)
|
|
||||||
LJLIB_ASM(pairs)
|
|
||||||
{
|
|
||||||
return ffh_pairs(L, MM_pairs);
|
|
||||||
}
|
|
||||||
|
|
||||||
LJLIB_NOREGUV LJLIB_ASM(ipairs_aux) LJLIB_REC(.)
|
|
||||||
{
|
|
||||||
lj_lib_checktab(L, 1);
|
|
||||||
lj_lib_checkint(L, 2);
|
|
||||||
return FFH_UNREACHABLE;
|
|
||||||
}
|
|
||||||
|
|
||||||
LJLIB_PUSH(lastcl)
|
|
||||||
LJLIB_ASM(ipairs) LJLIB_REC(.)
|
|
||||||
{
|
|
||||||
return ffh_pairs(L, MM_ipairs);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -- Base library: throw and catch errors -------------------------------- */
|
/* -- Base library: throw and catch errors -------------------------------- */
|
||||||
|
|
||||||
LJLIB_CF(error)
|
LJLIB_CF(error)
|
||||||
|
@ -224,7 +224,7 @@ LJ_STATIC_ASSERT((int)BC_FUNCV + 1 == (int)BC_IFUNCV);
|
|||||||
LJ_STATIC_ASSERT((int)BC_FUNCV + 2 == (int)BC_JFUNCV);
|
LJ_STATIC_ASSERT((int)BC_FUNCV + 2 == (int)BC_JFUNCV);
|
||||||
|
|
||||||
/* This solves a circular dependency problem, change as needed. */
|
/* This solves a circular dependency problem, change as needed. */
|
||||||
#define FF_next_N 15
|
#define FF_next_N 4
|
||||||
|
|
||||||
/* Stack slots used by FORI/FORL, relative to operand A. */
|
/* Stack slots used by FORI/FORL, relative to operand A. */
|
||||||
enum {
|
enum {
|
||||||
|
Loading…
Reference in New Issue
Block a user