From fbfd20a142d2d4a9b0863006799364582c9f2ab8 Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Thu, 12 Jan 2012 11:24:05 +0100 Subject: [PATCH] Move the references from _G to the registry --- src/common/Reference.cpp | 17 ++++++++++++++--- src/common/runtime.cpp | 6 +++++- 2 files changed, 19 insertions(+), 4 deletions(-) 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;