degesch: optimize Lua weak refs
This commit is contained in:
parent
95c7ababc3
commit
c8a826f016
41
degesch.c
41
degesch.c
|
@ -9860,19 +9860,6 @@ static luaL_Reg lua_plugin_library[] =
|
|||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
|
||||
static struct lua_ispect_mapping
|
||||
{
|
||||
struct ispect_field *ispect; ///< Type info
|
||||
struct lua_weak_info *info; ///< Lua-specific additions
|
||||
}
|
||||
lua_types[] =
|
||||
{
|
||||
{ g_user_ispect, &lua_user_info },
|
||||
{ g_channel_ispect, &lua_channel_info },
|
||||
{ g_buffer_ispect, &lua_buffer_info },
|
||||
{ g_server_ispect, &lua_server_info },
|
||||
};
|
||||
|
||||
static void *
|
||||
lua_plugin_alloc (void *ud, void *ptr, size_t o_size, size_t n_size)
|
||||
{
|
||||
|
@ -9896,27 +9883,14 @@ lua_plugin_panic (lua_State *L)
|
|||
return 0;
|
||||
}
|
||||
|
||||
// As a rule in this codebase, these fields are right at the top of structs
|
||||
struct list_header
|
||||
{
|
||||
void *next; ///< Next item
|
||||
void *prev; ///< Previous item
|
||||
};
|
||||
|
||||
static void
|
||||
lua_plugin_push_ref (struct lua_plugin *self, void *object,
|
||||
struct ispect_field *field)
|
||||
{
|
||||
// TODO: we can definitely make a resolution table right in Lua,
|
||||
// lua_plugin_reg_weak() can fill it automatically (lightud->lightud)
|
||||
struct lua_weak_info *info = NULL;
|
||||
for (size_t i = 0; i < N_ELEMENTS (lua_types); i++)
|
||||
if (lua_types[i].ispect == field->fields)
|
||||
{
|
||||
info = lua_types[i].info;
|
||||
break;
|
||||
}
|
||||
hard_assert (info != NULL);
|
||||
// We create a mapping on object type registration
|
||||
hard_assert (lua_rawgetp (self->L, LUA_REGISTRYINDEX, field->fields));
|
||||
struct lua_weak_info *info = lua_touserdata (self->L, -1);
|
||||
lua_pop (self->L, 1);
|
||||
|
||||
if (!field->is_list)
|
||||
{
|
||||
|
@ -9924,6 +9898,9 @@ lua_plugin_push_ref (struct lua_plugin *self, void *object,
|
|||
return;
|
||||
}
|
||||
|
||||
// As a rule in this codebase, these fields are right at the top of structs
|
||||
struct list_header { LIST_HEADER (void) };
|
||||
|
||||
int i = 1;
|
||||
lua_newtable (self->L);
|
||||
LIST_FOR_EACH (struct list_header, iter, object)
|
||||
|
@ -10097,6 +10074,10 @@ lua_plugin_reg_meta (lua_State *L, const char *name, luaL_Reg *fns)
|
|||
static void
|
||||
lua_plugin_reg_weak (lua_State *L, struct lua_weak_info *info, luaL_Reg *fns)
|
||||
{
|
||||
// Create a mapping from the object type back to our metadata
|
||||
lua_pushlightuserdata (L, info);
|
||||
lua_rawsetp (L, LUA_REGISTRYINDEX, info->ispect);
|
||||
|
||||
luaL_newmetatable (L, info->name);
|
||||
luaL_setfuncs (L, fns, 0);
|
||||
lua_plugin_reg_finish (L, info);
|
||||
|
|
Loading…
Reference in New Issue