Add lightuserdatatag macro

This commit is contained in:
Petri Häkkinen 2023-11-07 11:20:54 +02:00
parent 23b516e158
commit 09840f8f32
6 changed files with 10 additions and 8 deletions

View file

@ -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;
}

View file

@ -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);

View file

@ -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
*/

View file

@ -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;

View file

@ -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();

View file

@ -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);