diff --git a/src/api/api.c b/src/api/api.c index 05bc2260..93d631d0 100644 --- a/src/api/api.c +++ b/src/api/api.c @@ -392,6 +392,24 @@ int luax_setconf(lua_State* L) { return 0; } +void luax_pushstash(lua_State* L, const char* name) { + lua_getfield(L, LUA_REGISTRYINDEX, name); + + if (lua_isnil(L, -1)) { + lua_newtable(L); + lua_replace(L, -2); + + // metatable + lua_newtable(L); + lua_pushliteral(L, "k"); + lua_setfield(L, -2, "__mode"); + lua_setmetatable(L, -2); + + lua_pushvalue(L, -1); + lua_setfield(L, LUA_REGISTRYINDEX, name); + } +} + void luax_setmainthread(lua_State *L) { #if LUA_VERSION_NUM < 502 lua_pushthread(L); diff --git a/src/api/api.h b/src/api/api.h index 61be5669..e5037f76 100644 --- a/src/api/api.h +++ b/src/api/api.h @@ -123,6 +123,7 @@ void luax_traceback(lua_State* L, lua_State* T, const char* message, int level); int luax_getstack(lua_State* L); void luax_pushconf(lua_State* L); int luax_setconf(lua_State* L); +void luax_pushstash(lua_State* L, const char* name); void luax_setmainthread(lua_State* L); void luax_atexit(lua_State* L, void (*finalizer)(void)); uint32_t _luax_checku32(lua_State* L, int index); diff --git a/src/api/l_physics_collider.c b/src/api/l_physics_collider.c index 41f38756..6d2b297b 100644 --- a/src/api/l_physics_collider.c +++ b/src/api/l_physics_collider.c @@ -94,27 +94,9 @@ static int l_lovrColliderGetJoints(lua_State* L) { return 1; } -static void luax_pushcolliderstash(lua_State* L) { - lua_getfield(L, LUA_REGISTRYINDEX, "_lovrcolliderstash"); - - if (lua_isnil(L, -1)) { - lua_newtable(L); - lua_replace(L, -2); - - // metatable - lua_newtable(L); - lua_pushliteral(L, "k"); - lua_setfield(L, -2, "__mode"); - lua_setmetatable(L, -2); - - lua_pushvalue(L, -1); - lua_setfield(L, LUA_REGISTRYINDEX, "_lovrcolliderstash"); - } -} - static int l_lovrColliderGetUserData(lua_State* L) { luax_checktype(L, 1, Collider); - luax_pushcolliderstash(L); + luax_pushstash(L, "lovr.collider.userdata"); lua_pushvalue(L, 1); lua_rawget(L, -2); return 1; @@ -122,7 +104,7 @@ static int l_lovrColliderGetUserData(lua_State* L) { static int l_lovrColliderSetUserData(lua_State* L) { luax_checktype(L, 1, Collider); - luax_pushcolliderstash(L); + luax_pushstash(L, "lovr.collider.userdata"); lua_pushvalue(L, 1); lua_pushvalue(L, 2); lua_rawset(L, -3); diff --git a/src/api/l_physics_joints.c b/src/api/l_physics_joints.c index 768f6d42..2b7c06a1 100644 --- a/src/api/l_physics_joints.c +++ b/src/api/l_physics_joints.c @@ -63,27 +63,9 @@ static int l_lovrJointGetColliders(lua_State* L) { return 2; } -static void luax_pushjointstash(lua_State* L) { - lua_getfield(L, LUA_REGISTRYINDEX, "_lovrjointstash"); - - if (lua_isnil(L, -1)) { - lua_newtable(L); - lua_replace(L, -2); - - // metatable - lua_newtable(L); - lua_pushliteral(L, "k"); - lua_setfield(L, -2, "__mode"); - lua_setmetatable(L, -2); - - lua_pushvalue(L, -1); - lua_setfield(L, LUA_REGISTRYINDEX, "_lovrjointstash"); - } -} - static int l_lovrJointGetUserData(lua_State* L) { luax_checktype(L, 1, Joint); - luax_pushjointstash(L); + luax_pushstash(L, "lovr.joint.userdata"); lua_pushvalue(L, 1); lua_rawget(L, -2); return 1; @@ -91,7 +73,7 @@ static int l_lovrJointGetUserData(lua_State* L) { static int l_lovrJointSetUserData(lua_State* L) { luax_checktype(L, 1, Joint); - luax_pushjointstash(L); + luax_pushstash(L, "lovr.joint.userdata"); lua_pushvalue(L, 1); lua_pushvalue(L, 2); lua_rawset(L, -3); diff --git a/src/api/l_physics_shapes.c b/src/api/l_physics_shapes.c index 66e4a7ae..08fd3410 100644 --- a/src/api/l_physics_shapes.c +++ b/src/api/l_physics_shapes.c @@ -240,27 +240,9 @@ static int l_lovrShapeGetType(lua_State* L) { return 1; } -static void luax_pushshapestash(lua_State* L) { - lua_getfield(L, LUA_REGISTRYINDEX, "_lovrshapestash"); - - if (lua_isnil(L, -1)) { - lua_newtable(L); - lua_replace(L, -2); - - // metatable - lua_newtable(L); - lua_pushliteral(L, "k"); - lua_setfield(L, -2, "__mode"); - lua_setmetatable(L, -2); - - lua_pushvalue(L, -1); - lua_setfield(L, LUA_REGISTRYINDEX, "_lovrshapestash"); - } -} - static int l_lovrShapeGetUserData(lua_State* L) { luax_checktype(L, 1, Shape); - luax_pushshapestash(L); + luax_pushstash(L, "lovr.shape.userdata"); lua_pushvalue(L, 1); lua_rawget(L, -2); return 1; @@ -268,7 +250,7 @@ static int l_lovrShapeGetUserData(lua_State* L) { static int l_lovrShapeSetUserData(lua_State* L) { luax_checktype(L, 1, Shape); - luax_pushshapestash(L); + luax_pushstash(L, "lovr.shape.userdata"); lua_pushvalue(L, 1); lua_pushvalue(L, 2); lua_rawset(L, -3);