diff --git a/src/common/Reference.cpp b/src/common/Reference.cpp index d3002b6d1..5ba5cd5c7 100644 --- a/src/common/Reference.cpp +++ b/src/common/Reference.cpp @@ -22,6 +22,8 @@ namespace love { + const char REFERENCE_TABLE_NAME[] = "love-references"; + Reference::Reference() : L(0), idx(LUA_REFNIL) { @@ -42,14 +44,19 @@ namespace love { unref(); // Just to be safe. this->L = L; - idx = luaL_ref(L, LUA_GLOBALSINDEX); + luax_insist(L, LUA_REGISTRYINDEX, REFERENCE_TABLE_NAME); + lua_insert(L, -2); // Move reference table behind value. + idx = luaL_ref(L, -2); + lua_pop(L, 1); } void Reference::unref() { if (idx != LUA_REFNIL) { - luaL_unref(L, LUA_GLOBALSINDEX, idx); + luax_insist(L, LUA_REGISTRYINDEX, REFERENCE_TABLE_NAME); + luaL_unref(L, -1, idx); + lua_pop(L, 1); idx = LUA_REFNIL; } } @@ -57,7 +64,11 @@ namespace love void Reference::push() { if (idx != LUA_REFNIL) - lua_rawgeti(L, LUA_GLOBALSINDEX, idx); + { + luax_insist(L, LUA_REGISTRYINDEX, REFERENCE_TABLE_NAME); + lua_rawgeti(L, -1, idx); + lua_remove(L, -2); + } else lua_pushnil(L); } diff --git a/src/common/runtime.cpp b/src/common/runtime.cpp index d67ed091e..ccab8862c 100644 --- a/src/common/runtime.cpp +++ b/src/common/runtime.cpp @@ -352,6 +352,10 @@ namespace love int luax_insist(lua_State * L, int idx, const char * k) { + // Convert to absolute index if necessary. + if (idx < 0 && idx > LUA_REGISTRYINDEX) + idx = lua_gettop(L) + ++idx; + lua_getfield(L, idx, k); // Create if necessary. @@ -360,7 +364,7 @@ namespace love lua_pop(L, 1); // Pop the non-table. lua_newtable(L); lua_pushvalue(L, -1); // Duplicate the table to leave on top. - lua_setfield(L, -3, k); // k[idx] = table + lua_setfield(L, idx, k); // lua_stack[idx][k] = lua_stack[-1] (table) } return 1;