Merge branch 'lightmemedata' into 'next'

Cvars returned by CV_FindVar did not work with userdataType

See merge request STJr/SRB2!754
This commit is contained in:
James R 2020-04-09 19:48:39 -04:00
commit 7ff3e7f18b
4 changed files with 33 additions and 19 deletions

View file

@ -218,10 +218,16 @@ static const char *GetUserdataUType(lua_State *L)
// or players[0].powers -> "player_t.powers" // or players[0].powers -> "player_t.powers"
static int lib_userdataType(lua_State *L) 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) lua_settop(L, 1); // pop everything except arg 1 (in case somebody decided to add more)
luaL_checktype(L, 1, LUA_TUSERDATA); type = lua_type(L, 1);
lua_pushstring(L, GetUserdataUType(L)); if (type == LUA_TLIGHTUSERDATA || type == LUA_TUSERDATA)
return 1; {
lua_pushstring(L, GetUserdataUType(L));
return 1;
}
else
return luaL_typerror(L, 1, "userdata");
} }
static int lib_isPlayerAdmin(lua_State *L) static int lib_isPlayerAdmin(lua_State *L)

View file

@ -430,22 +430,8 @@ static int lib_cvRegisterVar(lua_State *L)
static int lib_cvFindVar(lua_State *L) static int lib_cvFindVar(lua_State *L)
{ {
consvar_t *cv; LUA_PushLightUserdata(L, CV_FindVar(luaL_checkstring(L,1)), META_CVAR);
if (( cv = CV_FindVar(luaL_checkstring(L,1)) )) return 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;
} }
// CONS_Printf for a single player // CONS_Printf for a single player

View file

@ -568,6 +568,27 @@ fixed_t LUA_EvalMath(const char *word)
return res; 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);
}
else
lua_pushnil(L);
}
// Takes a pointer, any pointer, and a metatable name // Takes a pointer, any pointer, and a metatable name
// Creates a userdata for that pointer with the given metatable // Creates a userdata for that pointer with the given metatable
// Pushes it to the stack and stores it in the registry. // Pushes it to the stack and stores it in the registry.

View file

@ -44,6 +44,7 @@ void LUA_LoadLump(UINT16 wad, UINT16 lump);
void LUA_DumpFile(const char *filename); void LUA_DumpFile(const char *filename);
#endif #endif
fixed_t LUA_EvalMath(const char *word); 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_PushUserdata(lua_State *L, void *data, const char *meta);
void LUA_InvalidateUserdata(void *data); void LUA_InvalidateUserdata(void *data);
void LUA_InvalidateLevel(void); void LUA_InvalidateLevel(void);