From 8897c4ddfd5279929edb422250e5b5e554e7df2e Mon Sep 17 00:00:00 2001 From: Alug Date: Sun, 15 Mar 2026 17:45:34 +0100 Subject: [PATCH] wipe this --- src/blua/lapi.c | 58 ++++++------------ src/blua/lauxlib.c | 2 +- src/blua/lcode.c | 12 ---- src/blua/lopcodes.h | 2 - src/blua/ltm.c | 2 +- src/blua/ltm.h | 2 +- src/blua/lvm.c | 139 +++++++++++++------------------------------- src/blua/lvm.h | 55 ++---------------- 8 files changed, 64 insertions(+), 208 deletions(-) diff --git a/src/blua/lapi.c b/src/blua/lapi.c index f9714ffbd..6a33983fe 100644 --- a/src/blua/lapi.c +++ b/src/blua/lapi.c @@ -519,23 +519,6 @@ LUA_API int lua_pushthread (lua_State *L) { ** get functions (Lua -> stack) */ -static void auxgetstr (lua_State *L, const TValue *t, const char *k) { - const TValue *slot; - TValue key; - TString *str = luaS_new(L, k); - api_checkvalidindex(L, t); - if (luaV_fastget(L, t, str, slot, luaH_getstr)) { - setobj2s(L, L->top, slot); - api_incr_top(L); - } - else { - setsvalue(L, &key, str); - luaV_finishget(L, t, L->top, L->top, slot); - api_incr_top(L); - } - lua_unlock(L); -} - LUA_API void lua_gettable (lua_State *L, int idx) { StkId t; @@ -548,8 +531,15 @@ LUA_API void lua_gettable (lua_State *L, int idx) { LUA_API void lua_getfield (lua_State *L, int idx, const char *k) { + StkId t; + TValue key; lua_lock(L); - auxgetstr(L, index2adr(L, idx), k); + t = index2adr(L, idx); + api_checkvalidindex(L, t); + setsvalue(L, &key, luaS_new(L, k)); + luaV_gettable(L, t, &key, L->top); + api_incr_top(L); + lua_unlock(L); } @@ -640,26 +630,6 @@ LUA_API void lua_getfenv (lua_State *L, int idx) { ** set functions (stack -> Lua) */ -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wcast-qual" -static void auxsetstr (lua_State *L, const TValue *t, const char *k) { - TValue key; - const TValue *slot; - TString *str = luaS_new(L, k); - api_checknelems(L, 1); - api_checkvalidindex(L, t); - if (luaV_fastset(L, t, str, slot, luaH_setstr, L->top)) { - setobj2t(L, cast(TValue *, slot), L->top - 1); - L->top--; /* pop value */ - } - else { - setsvalue2s(L, &key, str); - luaV_finishset(L, t, &key, L->top - 1, slot); - L->top--; /* pop value */ - } - lua_unlock(L); -} - LUA_API void lua_settable (lua_State *L, int idx) { StkId t; @@ -672,12 +642,18 @@ LUA_API void lua_settable (lua_State *L, int idx) { lua_unlock(L); } -#pragma GCC diagnostic pop - LUA_API void lua_setfield (lua_State *L, int idx, const char *k) { + StkId t; + TValue key; lua_lock(L); - auxsetstr(L, index2adr(L, idx), k); + api_checknelems(L, 1); + t = index2adr(L, idx); + api_checkvalidindex(L, t); + setsvalue(L, &key, luaS_new(L, k)); + luaV_settable(L, t, &key, L->top - 1); + L->top--; /* pop value */ + lua_unlock(L); } diff --git a/src/blua/lauxlib.c b/src/blua/lauxlib.c index 3434f0aca..05a115002 100644 --- a/src/blua/lauxlib.c +++ b/src/blua/lauxlib.c @@ -172,7 +172,7 @@ LUALIB_API int luaL_newmetatable (lua_State *L, const char *tname) { LUALIB_API void *luaL_checkudata (lua_State *L, int ud, const char *tname) { void *p = lua_touserdata(L, ud); - if (l_likely(p != NULL)) { /* value is a userdata? */ + if (p != NULL) { /* value is a userdata? */ if (lua_getmetatable(L, ud)) { /* does it have a metatable? */ lua_getfield(L, LUA_REGISTRYINDEX, tname); /* get correct metatable */ if (lua_rawequal(L, -1, -2)) { /* does it have the correct mt? */ diff --git a/src/blua/lcode.c b/src/blua/lcode.c index 562ad3506..567b88500 100644 --- a/src/blua/lcode.c +++ b/src/blua/lcode.c @@ -626,20 +626,8 @@ static void codenot (FuncState *fs, expdesc *e) { removevalues(fs, e->t); } -/* -** Check whether expression 'e' is a literal string -*/ -static int isKstr (FuncState *fs, expdesc *e) { - return (e->k == VK && ttisstring(&fs->f->k[e->u.s.info])); -} -/* -** Create expression 't[k]'. 't' must have its final result already in a -** register or upvalue. Upvalues can only be indexed by literal strings. -*/ void luaK_indexed (FuncState *fs, expdesc *t, expdesc *k) { - if (t->k == VUPVAL && !isKstr(fs, k)) /* upvalue indexed by non string? */ - luaK_exp2anyreg(fs, t); /* put it in a register */ t->u.s.aux = luaK_exp2RK(fs, k); t->k = VINDEXED; } diff --git a/src/blua/lopcodes.h b/src/blua/lopcodes.h index aa84da8d0..8b08b04e0 100644 --- a/src/blua/lopcodes.h +++ b/src/blua/lopcodes.h @@ -232,8 +232,6 @@ OP_VARARG/* A B R(A), R(A+1), ..., R(A+B-1) = vararg */ (*) In OP_SETLIST, if (B == 0) then B = `top'; if (C == 0) then next `instruction' is real C - (*) In OP_SELF, the index must be a string. - (*) For comparisons, A specifies what condition the test should accept (true or false). diff --git a/src/blua/ltm.c b/src/blua/ltm.c index 22add1891..031a2811e 100644 --- a/src/blua/ltm.c +++ b/src/blua/ltm.c @@ -61,7 +61,7 @@ TValue *luaT_gettm (Table *events, TMS event, TString *ename) { } -TValue *luaT_gettmbyobj (lua_State *L, const TValue *o, TMS event) { +TValue *luaT_gettmbyobj (lua_State *L, TValue *o, TMS event) { Table *mt; switch (ttype(o)) { case LUA_TTABLE: diff --git a/src/blua/ltm.h b/src/blua/ltm.h index 08b07b20a..3d4ac8c0e 100644 --- a/src/blua/ltm.h +++ b/src/blua/ltm.h @@ -55,7 +55,7 @@ LUAI_DATA const char *const luaT_typenames[]; LUAI_FUNC TValue *luaT_gettm (Table *events, TMS event, TString *ename); -LUAI_FUNC TValue *luaT_gettmbyobj (lua_State *L, const TValue *o, TMS event); +LUAI_FUNC TValue *luaT_gettmbyobj (lua_State *L, TValue *o, TMS event); LUAI_FUNC void luaT_init (lua_State *L); #endif diff --git a/src/blua/lvm.c b/src/blua/lvm.c index b7015e0a2..7afbbd572 100644 --- a/src/blua/lvm.c +++ b/src/blua/lvm.c @@ -105,94 +105,61 @@ static void callTM (lua_State *L, const TValue *f, const TValue *p1, } -/* -** Finish the table access 'val = t[key]'. -** if 'slot' is NULL, 't' is not a table; otherwise, 'slot' points to -** t[k] entry (which must be nil). -*/ -void luaV_finishget (lua_State *L, const TValue *t, TValue *key, StkId val, - const TValue *slot) { - int loop; /* counter to avoid infinite loops */ - const TValue *tm; /* metamethod */ +void luaV_gettable (lua_State *L, TValue *t, TValue *key, StkId val) { + int loop; for (loop = 0; loop < MAXTAGLOOP; loop++) { - if (slot == NULL) { /* 't' is not a table? */ - lua_assert(!ttistable(t)); - tm = luaT_gettmbyobj(L, t, TM_INDEX); - if (l_unlikely(ttisnil(tm))) - luaG_typeerror(L, t, "index"); /* no metamethod */ - /* else will try the metamethod */ - } - else { /* 't' is a table */ - lua_assert(ttisnil(slot)); - tm = fasttm(L, hvalue(t)->metatable, TM_INDEX); /* table's metamethod */ - if (tm == NULL) { /* no metamethod? */ - setnilvalue(val); /* result is nil */ + TValue *tm; + if (ttistable(t)) { /* `t' is a table? */ + Table *h = hvalue(t); + const TValue *res = luaH_get(h, key); /* do a primitive get */ + if (!ttisnil(res) || /* result is no nil? */ + (tm = fasttm(L, h->metatable, TM_INDEX)) == NULL) { /* or no TM? */ + setobj2s(L, val, res); return; } - /* else will try the metamethod */ + /* else will try the tag method */ } - if (ttisfunction(tm)) { /* is metamethod a function? */ - callTMres(L, val, tm, t, key); /* call it */ + else if (l_unlikely(ttisnil(tm = luaT_gettmbyobj(L, t, TM_INDEX)))) + luaG_typeerror(L, t, "index"); + if (ttisfunction(tm)) { + callTMres(L, val, tm, t, key); return; } - t = tm; /* else try to access 'tm[key]' */ - if (luaV_fastget(L,t,key,slot,luaH_get)) { /* fast track? */ - setobj2s(L, val, slot); /* done */ - return; - } - /* else repeat (tail call 'luaV_finishget') */ + t = tm; /* else repeat with `tm' */ } - luaG_runerror(L, "'__index' chain too long; possible loop"); + luaG_runerror(L, "loop in gettable"); } -/* -** Finish a table assignment 't[key] = val'. -** If 'slot' is NULL, 't' is not a table. Otherwise, 'slot' points -** to the entry 't[key]', or to 'luaO_nilobject' if there is no such -** entry. (The value at 'slot' must be nil, otherwise 'luaV_fastset' -** would have done the job.) -*/ -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wcast-qual" -void luaV_finishset (lua_State *L, const TValue *t, TValue *key, - StkId val, const TValue *slot) { - int loop; /* counter to avoid infinite loops */ + +void luaV_settable (lua_State *L, TValue *t, TValue *key, StkId val) { + int loop; for (loop = 0; loop < MAXTAGLOOP; loop++) { - const TValue *tm; - if (slot != NULL) { - lua_assert(ttistable(t) && ttisnil(slot)); + TValue *tm = NULL; + if (ttistable(t)) { /* `t' is a table? */ Table *h = hvalue(t); - /* must check the metamethod */ - /* slot is nil=> look for newindex, slot is not nil => look for usedindex */ - if (!((ttisnil(slot) && ((tm = fasttm(L, h->metatable, TM_NEWINDEX)) != NULL)) || - ((!ttisnil(slot)) && ((tm = fasttm(L, h->metatable, TM_USEDINDEX)) != NULL)))) { - /* no metamethod and (now) there is an entry with given key */ - setobj2t(L, cast(TValue *, slot), val); + TValue *oldval = luaH_set(L, h, key); /* do a primitive set */ + /* oldval is nil=> look for newindex, oldval is not nil => look for usedindex */ + if (!((ttisnil(oldval) && ((tm = fasttm(L, h->metatable, TM_NEWINDEX)) != NULL)) || + ((!ttisnil(oldval)) && ((tm = fasttm(L, h->metatable, TM_USEDINDEX)) != NULL)))) { + setobj2t(L, oldval, val); luaC_barriert(L, h, val); return; } - /* else will try the metamethod */ + /* else will try the tag method */ } - else { /* not a table; check metamethod */ - if (l_unlikely(ttisnil(tm = luaT_gettmbyobj(L, t, TM_NEWINDEX)))) - luaG_typeerror(L, t, "index"); - } - /* try the metamethod */ + else if (l_unlikely(ttisnil(tm = luaT_gettmbyobj(L, t, TM_NEWINDEX)))) + luaG_typeerror(L, t, "index"); if (ttisfunction(tm)) { callTM(L, tm, t, key, val); return; } - t = tm; /* else repeat assignment over 'tm' */ - if (luaV_fastset(L, t, key, slot, luaH_set, val)) - return; /* done */ - /* else loop */ + t = tm; /* else repeat with `tm' */ } - luaG_runerror(L, "settable chain too long; possible loop"); + luaG_runerror(L, "loop in settable"); } -#pragma GCC diagnostic pop -static int call_binTM (lua_State *L, const TValue *p1, const TValue *p2, +static int call_binTM (lua_State *L, TValue *p1, TValue *p2, StkId res, TMS event) { const TValue *tm = luaT_gettmbyobj(L, p1, event); /* try first operand */ if (ttisnil(tm)) @@ -217,7 +184,7 @@ static const TValue *get_compTM (lua_State *L, Table *mt1, Table *mt2, } -static int call_orderTM (lua_State *L, const TValue *p1, const TValue *p2, +static int call_orderTM (lua_State *L, TValue *p1, TValue *p2, TMS event) { const TValue *tm1 = luaT_gettmbyobj(L, p1, event); const TValue *tm2; @@ -411,24 +378,6 @@ static void Arith (lua_State *L, StkId ra, TValue *rb, } -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wcast-qual" - -/* -** copy of 'luaV_gettable', but protecting call to potential metamethod -** (which can reallocate the stack) -*/ -#define gettableProtected(L,t,k,v) { const TValue *slot; \ - if (luaV_fastget(L,t,k,slot,luaH_get)) { setobj2s(L, v, slot); } \ - else Protect(luaV_finishget(L,t,k,v,slot)); } - - -/* same for 'luaV_settable' */ -#define settableProtected(L,t,k,v) { const TValue *slot; \ - if (!luaV_fastset(L,t,k,slot,luaH_set,v)) \ - Protect(luaV_finishset(L,t,k,v,slot)); } - - void luaV_execute (lua_State *L, int nexeccalls) { LClosure *cl; @@ -438,9 +387,9 @@ void luaV_execute (lua_State *L, int nexeccalls) { reentry: /* entry point */ lua_assert(isLua(L->ci)); pc = L->savedpc; - cl = &clvalue(L->ci->func)->l; /* local reference to function's closure */ - k = cl->p->k; /* local reference to function's constant table */ - base = L->base; /* local copy of function's base */ + cl = &clvalue(L->ci->func)->l; + base = L->base; + k = cl->p->k; /* main loop of interpreter */ for (;;) { const Instruction i = *pc++; @@ -500,7 +449,7 @@ void luaV_execute (lua_State *L, int nexeccalls) { StkId ra = RA(i); StkId rb = RB(i); TValue *rc = RKC(i); - gettableProtected(L, rb, rc, ra); + Protect(luaV_gettable(L, rb, rc, ra)); continue; } case OP_SETGLOBAL: { @@ -522,7 +471,7 @@ void luaV_execute (lua_State *L, int nexeccalls) { StkId ra = RA(i); TValue *rb = RKB(i); TValue *rc = RKC(i); - settableProtected(L, ra, rb, rc); + Protect(luaV_settable(L, ra, rb, rc)); continue; } case OP_NEWTABLE: { @@ -535,15 +484,9 @@ void luaV_execute (lua_State *L, int nexeccalls) { } case OP_SELF: { StkId ra = RA(i); - const TValue *slot; StkId rb = RB(i); - TValue *rc = RKC(i); - TString *key = rawtsvalue(rc); /* key must be a string */ - setobjs2s(L, ra + 1, rb); - if (luaV_fastget(L, rb, key, slot, luaH_getstr)) { - setobj2s(L, ra, slot); - } - else Protect(luaV_finishget(L, rb, rc, ra, slot)); + setobjs2s(L, ra+1, rb); + Protect(luaV_gettable(L, rb, RKC(i), ra)); continue; } case OP_ADD: { @@ -911,5 +854,3 @@ void luaV_execute (lua_State *L, int nexeccalls) { } } } - -#pragma GCC diagnostic pop diff --git a/src/blua/lvm.h b/src/blua/lvm.h index a14ce827e..f9226ee5d 100644 --- a/src/blua/lvm.h +++ b/src/blua/lvm.h @@ -22,61 +22,14 @@ (ttype(o1) == ttype(o2) && luaV_equalval(L, o1, o2)) -/* -** fast track for 'gettable': if 't' is a table and 't[k]' is not nil, -** return 1 with 'slot' pointing to 't[k]' (final result). Otherwise, -** return 0 (meaning it will have to check metamethod) with 'slot' -** pointing to a nil 't[k]' (if 't' is a table) or NULL (otherwise). -** 'f' is the raw get function to use. -*/ -#define luaV_fastget(L,t,k,slot,f) \ - (!ttistable(t) \ - ? (slot = NULL, 0) /* not a table; 'slot' is NULL and result is 0 */ \ - : (slot = f(hvalue(t), k), /* else, do raw access */ \ - !ttisnil(slot))) /* result not nil? */ - -/* -** standard implementation for 'gettable' -*/ -#define luaV_gettable(L,t,k,v) { const TValue *slot; \ - if (luaV_fastget(L,t,k,slot,luaH_get)) { setobj2s(L, v, slot); } \ - else luaV_finishget(L,t,k,v,slot); } - - -/* -** Fast track for set table. If 't' is a table and 't[k]' is not nil, -** call GC barrier, do a raw 't[k]=v', and return true; otherwise, -** return false with 'slot' equal to NULL (if 't' is not a table) or -** 'nil'. (This is needed by 'luaV_finishget'.) Note that, if the macro -** returns true, there is no need to 'invalidateTMcache', because the -** call is not creating a new entry. -*/ -#define luaV_fastset(L,t,k,slot,f,v) \ - (!ttistable(t) \ - ? (slot = NULL, 0) \ - : (slot = f(L, hvalue(t), k), \ - ttisnil(slot) ? 0 \ - : (__extension__ ({ \ - if (valiswhite(v) && isblack(obj2gco(hvalue(t)))) \ - luaC_barrierback(L, hvalue(t)); \ - setobj2t(L, cast(TValue *,slot), v); \ - 1; \ - })))) - -#define luaV_settable(L,t,k,v) { const TValue *slot; \ - if (!luaV_fastset(L,t,k,slot,luaH_set,v)) \ - luaV_finishset(L,t,k,v,slot); } - - - LUAI_FUNC int luaV_lessthan (lua_State *L, TValue *l, TValue *r); LUAI_FUNC int luaV_equalval (lua_State *L, const TValue *t1, const TValue *t2); LUAI_FUNC const TValue *luaV_tonumber (const TValue *obj, TValue *n); LUAI_FUNC int luaV_tostring (lua_State *L, StkId obj); -LUAI_FUNC void luaV_finishget (lua_State *L, const TValue *t, TValue *key, - StkId val, const TValue *tm); -LUAI_FUNC void luaV_finishset (lua_State *L, const TValue *t, TValue *key, - StkId val, const TValue *oldval); +LUAI_FUNC void luaV_gettable (lua_State *L, TValue *t, TValue *key, + StkId val); +LUAI_FUNC void luaV_settable (lua_State *L, TValue *t, TValue *key, + StkId val); LUAI_FUNC void luaV_execute (lua_State *L, int nexeccalls); LUAI_FUNC void luaV_concat (lua_State *L, int total, int last);