Allow Fixture:setUserData and Fixture:getUserData to be called in coroutines (resolves issue #850.)

Bad things will still happen if you call them from a love Thread which didn't create the World and the Fixture object. Don't do it!
This commit is contained in:
Alex Szpakowski
2014-02-15 20:59:57 -04:00
parent 31134ada13
commit 2a19a4444e
3 changed files with 48 additions and 22 deletions
+16 -6
View File
@@ -64,21 +64,31 @@ void Reference::unref()
}
}
void Reference::push()
void Reference::push(lua_State *newL)
{
if (idx != LUA_REFNIL)
{
luax_insist(L, LUA_REGISTRYINDEX, REFERENCE_TABLE_NAME);
lua_rawgeti(L, -1, idx);
lua_remove(L, -2);
luax_insist(newL, LUA_REGISTRYINDEX, REFERENCE_TABLE_NAME);
lua_rawgeti(newL, -1, idx);
lua_remove(newL, -2);
}
else
lua_pushnil(L);
lua_pushnil(newL);
}
lua_State *Reference::getL()
void Reference::push()
{
push(L);
}
lua_State *Reference::getL() const
{
return L;
}
void Reference::setL(lua_State *newL)
{
L = newL;
}
} // love
+17 -1
View File
@@ -63,6 +63,14 @@ public:
**/
void unref();
/**
* Pushes the referred value onto the stack of a different coroutine
* in the same main Lua state.
* THIS SHOULD NOT BE USED FOR DIFFERENT LUA STATES (created with
* luaL_newstate)! Only with different coroutines!
**/
void push(lua_State *newL);
/**
* Pushes the referred value onto the stack.
**/
@@ -72,7 +80,15 @@ public:
* Gets the Lua state associated with this
* reference.
**/
lua_State *getL();
lua_State *getL() const;
/**
* Associates a new Lua state with this reference.
* THIS IS DANGEROUS! It is only designed to be
* used with different coroutines from the same
* main Lua state!
**/
void setL(lua_State *newL);
private: