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