diff options
| -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); | 
