diff options
author | Přemysl Janouch <p.janouch@gmail.com> | 2016-10-27 20:02:25 +0200 |
---|---|---|
committer | Přemysl Janouch <p.janouch@gmail.com> | 2016-10-28 04:12:05 +0200 |
commit | 911276b2630fcc43df0ac53dbc0adb699be94227 (patch) | |
tree | 15f8d6b5efe2a074a51203d8fc0a95ea44561bea | |
parent | cb5ad675a62323d5d8e24bf49aa6df4acad135a2 (diff) | |
download | xK-911276b2630fcc43df0ac53dbc0adb699be94227.tar.gz xK-911276b2630fcc43df0ac53dbc0adb699be94227.tar.xz xK-911276b2630fcc43df0ac53dbc0adb699be94227.zip |
degesch: add introspection for "app_context"
-rw-r--r-- | degesch.c | 53 |
1 files changed, 47 insertions, 6 deletions
@@ -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); |