# HG changeset patch # User David Demelier # Date 1479156028 -3600 # Node ID 6fa04fe563c693751d0a25e3cd76a8632efd522f # Parent ace71e2b8e2af72977a93a8a90cc60a738b87be6 Irccd: delete plugin in Irccd.Plugin API diff -r ace71e2b8e2a -r 6fa04fe563c6 libirccd-js/irccd/mod-plugin.cpp --- 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(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 *>(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 *>(duk_to_pointer(ctx, -1)); + auto plugin = static_cast *>(duk_to_pointer(ctx, -1)); duk_pop(ctx); - return *plugin; + return plugin->lock(); } } // !irccd