From 09840f8f324e6391de5d6f15a26e12691dbf4b86 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petri=20H=C3=A4kkinen?= Date: Tue, 7 Nov 2023 11:20:54 +0200 Subject: [PATCH] Add lightuserdatatag macro --- VM/src/lapi.cpp | 4 ++-- VM/src/lobject.cpp | 4 ++-- VM/src/lobject.h | 2 ++ VM/src/ltm.cpp | 2 +- VM/src/lvmexecute.cpp | 4 ++-- VM/src/lvmutils.cpp | 2 +- 6 files changed, 10 insertions(+), 8 deletions(-) diff --git a/VM/src/lapi.cpp b/VM/src/lapi.cpp index 63babca2..2b9d9849 100644 --- a/VM/src/lapi.cpp +++ b/VM/src/lapi.cpp @@ -508,7 +508,7 @@ void* lua_tolightuserdata(lua_State* L, int idx) void* lua_tolightuserdatatagged(lua_State* L, int idx, int tag) { StkId o = index2addr(L, idx); - return (!ttislightuserdata(o) || o->extra[0] != tag) ? NULL : pvalue(o); + return (!ttislightuserdata(o) || lightuserdatatag(o) != tag) ? NULL : pvalue(o); } void* lua_touserdata(lua_State* L, int idx) @@ -540,7 +540,7 @@ int lua_lightuserdatatag(lua_State* L, int idx) { StkId o = index2addr(L, idx); if (ttislightuserdata(o)) - return o->extra[0]; + return lightuserdatatag(o); return -1; } diff --git a/VM/src/lobject.cpp b/VM/src/lobject.cpp index 8fb8b6b6..640bd96e 100644 --- a/VM/src/lobject.cpp +++ b/VM/src/lobject.cpp @@ -48,7 +48,7 @@ int luaO_rawequalObj(const TValue* t1, const TValue* t2) case LUA_TBOOLEAN: return bvalue(t1) == bvalue(t2); // boolean true must be 1 !! case LUA_TLIGHTUSERDATA: - return pvalue(t1) == pvalue(t2) && t1->extra[0] == t2->extra[0]; + return pvalue(t1) == pvalue(t2) && lightuserdatatag(t1) == lightuserdatatag(t2); default: LUAU_ASSERT(iscollectable(t1)); return gcvalue(t1) == gcvalue(t2); @@ -71,7 +71,7 @@ int luaO_rawequalKey(const TKey* t1, const TValue* t2) case LUA_TBOOLEAN: return bvalue(t1) == bvalue(t2); // boolean true must be 1 !! case LUA_TLIGHTUSERDATA: - return pvalue(t1) == pvalue(t2) && t1->extra[0] == t2->extra[0]; + return pvalue(t1) == pvalue(t2) && lightuserdatatag(t1) == lightuserdatatag(t2); default: LUAU_ASSERT(iscollectable(t1)); return gcvalue(t1) == gcvalue(t2); diff --git a/VM/src/lobject.h b/VM/src/lobject.h index 71640140..eb2975ff 100644 --- a/VM/src/lobject.h +++ b/VM/src/lobject.h @@ -80,6 +80,8 @@ typedef struct lua_TValue #define l_isfalse(o) (ttisnil(o) || (ttisboolean(o) && bvalue(o) == 0)) +#define lightuserdatatag(o) check_exp(ttislightuserdata(o), (o)->extra[0]) + /* ** for internal debug only */ diff --git a/VM/src/ltm.cpp b/VM/src/ltm.cpp index 6ed42edd..a1838b6a 100644 --- a/VM/src/ltm.cpp +++ b/VM/src/ltm.cpp @@ -131,7 +131,7 @@ const TString* luaT_objtypenamestr(lua_State* L, const TValue* o) } else if (ttislightuserdata(o)) { - const TString* name = L->global->lightuserdataname[o->extra[0]]; + const TString* name = L->global->lightuserdataname[lightuserdatatag(o)]; if (name) return name; diff --git a/VM/src/lvmexecute.cpp b/VM/src/lvmexecute.cpp index 6ae7a70b..7778bf56 100644 --- a/VM/src/lvmexecute.cpp +++ b/VM/src/lvmexecute.cpp @@ -1112,7 +1112,7 @@ reentry: VM_NEXT(); case LUA_TLIGHTUSERDATA: - pc += pvalue(ra) == pvalue(rb) && ra->extra[0] == rb->extra[0] ? LUAU_INSN_D(insn) : 1; + pc += (pvalue(ra) == pvalue(rb) && lightuserdatatag(ra) == lightuserdatatag(rb)) ? LUAU_INSN_D(insn) : 1; LUAU_ASSERT(unsigned(pc - cl->l.p->code) < unsigned(cl->l.p->sizecode)); VM_NEXT(); @@ -1227,7 +1227,7 @@ reentry: VM_NEXT(); case LUA_TLIGHTUSERDATA: - pc += pvalue(ra) != pvalue(rb) || ra->extra[0] != rb->extra[0] ? LUAU_INSN_D(insn) : 1; + pc += (pvalue(ra) != pvalue(rb) || lightuserdatatag(ra) != lightuserdatatag(rb)) ? LUAU_INSN_D(insn) : 1; LUAU_ASSERT(unsigned(pc - cl->l.p->code) < unsigned(cl->l.p->sizecode)); VM_NEXT(); diff --git a/VM/src/lvmutils.cpp b/VM/src/lvmutils.cpp index 3985f199..ade8d694 100644 --- a/VM/src/lvmutils.cpp +++ b/VM/src/lvmutils.cpp @@ -288,7 +288,7 @@ int luaV_equalval(lua_State* L, const TValue* t1, const TValue* t2) case LUA_TBOOLEAN: return bvalue(t1) == bvalue(t2); // true must be 1 !! case LUA_TLIGHTUSERDATA: - return pvalue(t1) == pvalue(t2) && t1->extra[0] == t2->extra[0]; + return pvalue(t1) == pvalue(t2) && lightuserdatatag(t1) == lightuserdatatag(t2); case LUA_TUSERDATA: { tm = get_compTM(L, uvalue(t1)->metatable, uvalue(t2)->metatable, TM_EQ);