Mercurial > irccd
changeset 356:6fa04fe563c6
Irccd: delete plugin in Irccd.Plugin API
author | David Demelier <markand@malikania.fr> |
---|---|
date | Mon, 14 Nov 2016 21:40:28 +0100 |
parents | ace71e2b8e2a |
children | c50769df3493 |
files | libirccd-js/irccd/mod-plugin.cpp |
diffstat | 1 files changed, 14 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- a/libirccd-js/irccd/mod-plugin.cpp Mon Nov 14 21:40:10 2016 +0100 +++ b/libirccd-js/irccd/mod-plugin.cpp Mon Nov 14 21:40:28 2016 +0100 @@ -308,7 +308,18 @@ { StackAssert sa(plugin->context()); - duk_push_pointer(plugin->context(), &plugin); + duk_push_pointer(plugin->context(), new std::weak_ptr<JsPlugin>(plugin)); + duk_push_object(plugin->context()); + duk_push_c_function(plugin->context(), [] (auto *ctx) -> duk_ret_t { + duk_get_global_string(ctx, PluginGlobal); + delete static_cast<std::shared_ptr<JsPlugin> *>(duk_to_pointer(ctx, -1)); + duk_pop(ctx); + duk_push_null(ctx); + duk_put_global_string(ctx, PluginGlobal); + return 0; + }, 1); + duk_set_finalizer(plugin->context(), -2); + duk_put_global_string(plugin->context(), "\xff""\xff""dummy-shared-ptr"); duk_put_global_string(plugin->context(), PluginGlobal); duk_get_global_string(plugin->context(), "Irccd"); duk_push_object(plugin->context()); @@ -335,10 +346,10 @@ StackAssert sa(ctx); duk_get_global_string(ctx, PluginGlobal); - auto plugin = static_cast<std::shared_ptr<JsPlugin> *>(duk_to_pointer(ctx, -1)); + auto plugin = static_cast<std::weak_ptr<JsPlugin> *>(duk_to_pointer(ctx, -1)); duk_pop(ctx); - return *plugin; + return plugin->lock(); } } // !irccd