From 911276b2630fcc43df0ac53dbc0adb699be94227 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C5=99emysl=20Janouch?= Date: Thu, 27 Oct 2016 20:02:25 +0200 Subject: [PATCH] degesch: add introspection for "app_context" --- degesch.c | 53 +++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 47 insertions(+), 6 deletions(-) diff --git a/degesch.c b/degesch.c index d6cfdec..4f42fc5 100644 --- a/degesch.c +++ b/degesch.c @@ -2110,6 +2110,18 @@ struct app_context } *g_ctx; +static struct ispect_field g_ctx_ispect_fields[] = +{ + ISPECT_( app_context, global_buffer, REF, buffer ) + ISPECT_( app_context, current_buffer, REF, buffer ) + {} +}; + +static struct ispect g_ctx_ispect = +{ + .fields = g_ctx_ispect_fields, +}; + static int * filter_color_cube_for_acceptable_nick_colors (size_t *len) { @@ -8570,7 +8582,9 @@ lua_weak_push (struct lua_plugin *plugin, void *object, wrapper->plugin = plugin; wrapper->info = info; wrapper->object = object; - wrapper->weak_ref = info->ref (object, lua_weak_invalidate, wrapper); + wrapper->weak_ref = NULL; + if (info->ref) + wrapper->weak_ref = info->ref (object, lua_weak_invalidate, wrapper); lua_cache_store (L, object, -1); } @@ -8581,7 +8595,8 @@ lua_weak_gc (lua_State *L, const struct lua_weak_info *info) if (wrapper->object) { lua_cache_invalidate (L, wrapper->object); - info->unref (wrapper->object, &wrapper->weak_ref); + if (info->unref) + info->unref (wrapper->object, &wrapper->weak_ref); wrapper->object = NULL; } return 0; @@ -8616,6 +8631,14 @@ LUA_WEAK_DECLARE (channel, XLUA_CHANNEL_METATABLE) LUA_WEAK_DECLARE (buffer, XLUA_BUFFER_METATABLE) LUA_WEAK_DECLARE (server, XLUA_SERVER_METATABLE) +// The global context is kind of fake and don't have any ref-counting, +// however it's still very much an object +static struct lua_weak_info lua_ctx_info = +{ + .name = PROGRAM_NAME, + .ispect = &g_ctx_ispect, +}; + // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - static int @@ -9730,8 +9753,18 @@ lua_plugin_connect (lua_State *L) return 1; } +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +static int +lua_ctx_gc (lua_State *L) +{ + return lua_weak_gc (L, &lua_ctx_info); +} + static luaL_Reg lua_plugin_library[] = { + // These are global functions: + { "parse", lua_plugin_parse }, { "hook_input", lua_plugin_hook_input }, { "hook_irc", lua_plugin_hook_irc }, @@ -9739,6 +9772,10 @@ static luaL_Reg lua_plugin_library[] = { "hook_timer", lua_plugin_hook_timer }, { "setup_config", lua_plugin_setup_config }, { "connect", lua_plugin_connect }, + + // And these are methods: + { "__gc", lua_ctx_gc }, + // TODO: get_prompt_ignore_markers() { NULL, NULL }, }; @@ -9908,7 +9945,6 @@ lua_plugin_reg_finish (lua_State *L, struct lua_weak_info *info) lua_setfield (L, -2, "__index"); lua_pushcfunction (L, lua_plugin_property_set); lua_setfield (L, -2, "__newindex"); - lua_pop (L, 1); } @@ -9948,12 +9984,17 @@ lua_plugin_load (struct app_context *ctx, const char *filename, plugin->ctx = ctx; plugin->L = L; - // Register the degesch library with "plugin" as an upvalue luaL_checkversion (L); - luaL_newlibtable (L, lua_plugin_library); + + // Register the degesch library as a singleton with "plugin" as an upvalue + // (mostly historical, but rather convenient) + luaL_newmetatable (L, lua_ctx_info.name); lua_pushlightuserdata (L, plugin); luaL_setfuncs (L, lua_plugin_library, 1); - lua_setglobal (L, PROGRAM_NAME); + lua_plugin_reg_finish (L, &lua_ctx_info); + + lua_weak_push (plugin, ctx, &lua_ctx_info); + lua_setglobal (L, lua_ctx_info.name); // Create metatables for our objects lua_plugin_reg_meta (L, XLUA_HOOK_METATABLE, lua_hook_table);