diff --git a/library/LuaTypes.cpp b/library/LuaTypes.cpp index 089ead0dd..8b2974534 100644 --- a/library/LuaTypes.cpp +++ b/library/LuaTypes.cpp @@ -215,12 +215,19 @@ static void autovivify_ptr(lua_State *state, int fname_idx, void **pptr, lua_pop(state, 1); } +static bool is_null(lua_State *state, int val_index) +{ + return lua_isnil(state, val_index) || + (lua_islightuserdata(state, val_index) && + !lua_touserdata(state, val_index)); +} + void df::pointer_identity::lua_write(lua_State *state, int fname_idx, void *ptr, type_identity *target, int val_index) { auto pptr = (void**)ptr; - if (lua_isnil(state, val_index)) + if (is_null(state, val_index)) *pptr = NULL; else if (lua_istable(state, val_index)) { diff --git a/library/LuaWrapper.cpp b/library/LuaWrapper.cpp index 4e1c6205c..8e3bff7de 100644 --- a/library/LuaWrapper.cpp +++ b/library/LuaWrapper.cpp @@ -496,14 +496,7 @@ static int meta_sizeof(lua_State *state) luaL_error(state, "Usage: object:sizeof() or df.sizeof(object)"); // Two special cases: nil and lightuserdata for NULL and void* - if (lua_isnil(state, 1)) - { - lua_pushnil(state); - lua_pushinteger(state, 0); - return 2; - } - - if (lua_islightuserdata(state, 1)) + if (lua_isnil(state, 1) || lua_islightuserdata(state, 1)) { lua_pushnil(state); lua_pushnumber(state, (size_t)lua_touserdata(state, 1)); @@ -1314,6 +1307,11 @@ static void DoAttach(lua_State *state) lua_getfield(state, LUA_REGISTRYINDEX, DFHACK_ASSIGN_NAME); lua_setfield(state, -2, "assign"); + lua_pushlightuserdata(state, NULL); + lua_setfield(state, -2, "NULL"); + lua_pushlightuserdata(state, NULL); + lua_setglobal(state, "NULL"); + freeze_table(state, true, "df"); lua_remove(state, -2); lua_setmetatable(state, -2);