From b77d5979653b47b1c303fe2dbdb1297b6ce2bc10 Mon Sep 17 00:00:00 2001 From: James R Date: Sun, 2 Feb 2020 15:08:22 -0800 Subject: [PATCH 1/3] userdataType can check light userdata too! --- src/lua_baselib.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/lua_baselib.c b/src/lua_baselib.c index 66bd30e32..7c53fa99a 100644 --- a/src/lua_baselib.c +++ b/src/lua_baselib.c @@ -220,10 +220,16 @@ static const char *GetUserdataUType(lua_State *L) // or players[0].powers -> "player_t.powers" static int lib_userdataType(lua_State *L) { + int type; lua_settop(L, 1); // pop everything except arg 1 (in case somebody decided to add more) - luaL_checktype(L, 1, LUA_TUSERDATA); - lua_pushstring(L, GetUserdataUType(L)); - return 1; + type = lua_type(L, 1); + if (type == LUA_TLIGHTUSERDATA || type == LUA_TUSERDATA) + { + lua_pushstring(L, GetUserdataUType(L)); + return 1; + } + else + return luaL_typerror(L, 1, "userdata"); } static int lib_isPlayerAdmin(lua_State *L) From 0f3a44887c9349ca9c883cd8d8e138fcfb32724f Mon Sep 17 00:00:00 2001 From: James R Date: Sun, 2 Feb 2020 15:19:19 -0800 Subject: [PATCH 2/3] LUA_PushLightUserdata takes the fun out of lib_cvFindVar --- src/lua_consolelib.c | 18 ++---------------- src/lua_script.c | 22 ++++++++++++++++++++++ src/lua_script.h | 1 + 3 files changed, 25 insertions(+), 16 deletions(-) diff --git a/src/lua_consolelib.c b/src/lua_consolelib.c index 48f2e20a8..62d59e582 100644 --- a/src/lua_consolelib.c +++ b/src/lua_consolelib.c @@ -431,22 +431,8 @@ static int lib_cvRegisterVar(lua_State *L) static int lib_cvFindVar(lua_State *L) { - consvar_t *cv; - if (( cv = CV_FindVar(luaL_checkstring(L,1)) )) - { - lua_settop(L,1);/* We only want one argument in the stack. */ - lua_pushlightuserdata(L, cv);/* Now the second value on stack. */ - luaL_getmetatable(L, META_CVAR); - /* - The metatable is the last value on the stack, so this - applies it to the second value, which is the cvar. - */ - lua_setmetatable(L,2); - lua_pushvalue(L,2); - return 1; - } - else - return 0; + LUA_PushLightUserdata(L, CV_FindVar(luaL_checkstring(L,1)), META_CVAR); + return 1; } // CONS_Printf for a single player diff --git a/src/lua_script.c b/src/lua_script.c index 2538fb711..9d0a80f90 100644 --- a/src/lua_script.c +++ b/src/lua_script.c @@ -568,6 +568,28 @@ fixed_t LUA_EvalMath(const char *word) return res; } +/* +LUA_PushUserdata but no userdata is created. +You can't invalidate it therefore. +*/ + +void LUA_PushLightUserdata (lua_State *L, void *data, const char *meta) +{ + if (data) + { + lua_pushlightuserdata(L, data); + luaL_getmetatable(L, meta); + /* + The metatable is the last value on the stack, so this + applies it to the second value, which is the userdata. + */ + lua_setmetatable(L, -2); + lua_pushvalue(L, -1); + } + else + lua_pushnil(L); +} + // Takes a pointer, any pointer, and a metatable name // Creates a userdata for that pointer with the given metatable // Pushes it to the stack and stores it in the registry. diff --git a/src/lua_script.h b/src/lua_script.h index 8f27dcb4c..d54387175 100644 --- a/src/lua_script.h +++ b/src/lua_script.h @@ -46,6 +46,7 @@ void LUA_LoadLump(UINT16 wad, UINT16 lump); void LUA_DumpFile(const char *filename); #endif fixed_t LUA_EvalMath(const char *word); +void LUA_PushLightUserdata(lua_State *L, void *data, const char *meta); void LUA_PushUserdata(lua_State *L, void *data, const char *meta); void LUA_InvalidateUserdata(void *data); void LUA_InvalidateLevel(void); From 21794e7a949b9f746cb86c6986b95be52d57e7ec Mon Sep 17 00:00:00 2001 From: James R Date: Sun, 2 Feb 2020 17:22:28 -0800 Subject: [PATCH 3/3] lua_pushvalue is unneeded --- src/lua_script.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/lua_script.c b/src/lua_script.c index 9d0a80f90..02f78cd35 100644 --- a/src/lua_script.c +++ b/src/lua_script.c @@ -584,7 +584,6 @@ void LUA_PushLightUserdata (lua_State *L, void *data, const char *meta) applies it to the second value, which is the userdata. */ lua_setmetatable(L, -2); - lua_pushvalue(L, -1); } else lua_pushnil(L);