From 836fb5bbd3a0d48cf3e4de70535925a85aea835f Mon Sep 17 00:00:00 2001 From: Mike Pall Date: Thu, 25 Mar 2021 02:15:26 +0100 Subject: [PATCH] Reorganize lightuserdata interning code. --- src/lj_api.c | 30 ++---------------------------- src/lj_udata.c | 27 +++++++++++++++++++++++++++ src/lj_udata.h | 3 +++ 3 files changed, 32 insertions(+), 28 deletions(-) diff --git a/src/lj_api.c b/src/lj_api.c index 8b00436d..18a7ecbc 100644 --- a/src/lj_api.c +++ b/src/lj_api.c @@ -707,36 +707,10 @@ LUA_API void lua_pushboolean(lua_State *L, int b) incr_top(L); } -#if LJ_64 -static void *lightud_intern(lua_State *L, void *p) -{ - global_State *g = G(L); - uint64_t u = (uint64_t)p; - uint32_t up = lightudup(u); - uint32_t *segmap = mref(g->gc.lightudseg, uint32_t); - MSize segnum = g->gc.lightudnum; - if (segmap) { - MSize seg; - for (seg = 0; seg <= segnum; seg++) - if (segmap[seg] == up) /* Fast path. */ - return (void *)(((uint64_t)seg << LJ_LIGHTUD_BITS_LO) | lightudlo(u)); - segnum++; - } - if (!((segnum-1) & segnum) && segnum != 1) { - if (segnum >= (1 << LJ_LIGHTUD_BITS_SEG)) lj_err_msg(L, LJ_ERR_BADLU); - lj_mem_reallocvec(L, segmap, segnum, segnum ? 2*segnum : 2u, uint32_t); - setmref(g->gc.lightudseg, segmap); - } - g->gc.lightudnum = segnum; - segmap[segnum] = up; - return (void *)(((uint64_t)segnum << LJ_LIGHTUD_BITS_LO) | lightudlo(u)); -} -#endif - LUA_API void lua_pushlightuserdata(lua_State *L, void *p) { #if LJ_64 - p = lightud_intern(L, p); + p = lj_lightud_intern(L, p); #endif setrawlightudV(L->top, p); incr_top(L); @@ -1179,7 +1153,7 @@ static TValue *cpcall(lua_State *L, lua_CFunction func, void *ud) setfuncV(L, top++, fn); if (LJ_FR2) setnilV(top++); #if LJ_64 - ud = lightud_intern(L, ud); + ud = lj_lightud_intern(L, ud); #endif setrawlightudV(top++, ud); cframe_nres(L->cframe) = 1+0; /* Zero results. */ diff --git a/src/lj_udata.c b/src/lj_udata.c index ec3478c8..b2ea8031 100644 --- a/src/lj_udata.c +++ b/src/lj_udata.c @@ -8,6 +8,7 @@ #include "lj_obj.h" #include "lj_gc.h" +#include "lj_err.h" #include "lj_udata.h" GCudata *lj_udata_new(lua_State *L, MSize sz, GCtab *env) @@ -32,3 +33,29 @@ void LJ_FASTCALL lj_udata_free(global_State *g, GCudata *ud) lj_mem_free(g, ud, sizeudata(ud)); } +#if LJ_64 +void *lj_lightud_intern(lua_State *L, void *p) +{ + global_State *g = G(L); + uint64_t u = (uint64_t)p; + uint32_t up = lightudup(u); + uint32_t *segmap = mref(g->gc.lightudseg, uint32_t); + MSize segnum = g->gc.lightudnum; + if (segmap) { + MSize seg; + for (seg = 0; seg <= segnum; seg++) + if (segmap[seg] == up) /* Fast path. */ + return (void *)(((uint64_t)seg << LJ_LIGHTUD_BITS_LO) | lightudlo(u)); + segnum++; + } + if (!((segnum-1) & segnum) && segnum != 1) { + if (segnum >= (1 << LJ_LIGHTUD_BITS_SEG)) lj_err_msg(L, LJ_ERR_BADLU); + lj_mem_reallocvec(L, segmap, segnum, segnum ? 2*segnum : 2u, uint32_t); + setmref(g->gc.lightudseg, segmap); + } + g->gc.lightudnum = segnum; + segmap[segnum] = up; + return (void *)(((uint64_t)segnum << LJ_LIGHTUD_BITS_LO) | lightudlo(u)); +} +#endif + diff --git a/src/lj_udata.h b/src/lj_udata.h index 1873b694..78522ecc 100644 --- a/src/lj_udata.h +++ b/src/lj_udata.h @@ -10,5 +10,8 @@ LJ_FUNC GCudata *lj_udata_new(lua_State *L, MSize sz, GCtab *env); LJ_FUNC void LJ_FASTCALL lj_udata_free(global_State *g, GCudata *ud); +#if LJ_64 +LJ_FUNC void * LJ_FASTCALL lj_lightud_intern(lua_State *L, void *p); +#endif #endif