Add luax_pushstash helper;

This commit is contained in:
bjorn 2024-04-20 18:48:44 -07:00
parent bd3abe9470
commit c896541356
5 changed files with 25 additions and 60 deletions

View File

@ -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);

View File

@ -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);

View File

@ -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);

View File

@ -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);

View File

@ -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);