Move the references from _G to the registry

This commit is contained in:
Bart van Strien
2012-01-12 11:24:05 +01:00
parent 9bf6f43a4e
commit fbfd20a142
2 changed files with 19 additions and 4 deletions
+14 -3
View File
@@ -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);
}
+5 -1
View File
@@ -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;