ext/glib2/rbgobj_closure.c in glib2-4.1.5 vs ext/glib2/rbgobj_closure.c in glib2-4.1.6

- old
+ new

@@ -1,8 +1,8 @@ /* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */ /* - * Copyright (C) 2002-2022 Ruby-GNOME Project Team + * Copyright (C) 2002-2023 Ruby-GNOME Project Team * Copyright (C) 2002,2003 Masahiro Sakai * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either @@ -21,11 +21,11 @@ #include "rbgprivate.h" #define RG_TARGET_NAMESPACE cClosure -static ID id_call, id_closures; +static ID id_call; static gboolean rclosure_initialized = FALSE; #define TAG_SIZE 64 typedef struct _GRClosure GRClosure; struct _GRClosure @@ -153,26 +153,26 @@ arg.marshal_data = marshal_data; G_PROTECT_CALLBACK(rclosure_marshal_do, &arg); } +static void g_rclosure_detach_raw_gobject(GClosure *closure, GObject *gobject); static void rclosure_weak_notify(gpointer data, GObject* where_the_object_was); static void rclosure_invalidate(G_GNUC_UNUSED gpointer data, GClosure *closure) { GRClosure *rclosure = (GRClosure *)closure; GList *next; for (next = rclosure->objects; next; next = next->next) { GObject *object = G_OBJECT(next->data); + if (!NIL_P(rclosure->rb_holder)) { + g_rclosure_detach_raw_gobject(closure, object); + } g_object_weak_unref(object, rclosure_weak_notify, rclosure); g_closure_unref(closure); - VALUE obj = rbgobj_ruby_object_from_instance2(object, FALSE); - if (!NIL_P(rclosure->rb_holder) && !NIL_P(obj)) { - rbgobj_object_remove_relative(obj, rclosure->rb_holder); - } } g_list_free(rclosure->objects); rclosure->objects = NULL; if (!NIL_P(rclosure->rb_holder)) { @@ -277,14 +277,11 @@ void g_rclosure_attach(GClosure *closure, VALUE object) { GRClosure *rclosure = (GRClosure *)closure; - rbgobj_add_relative_removable(object, - Qnil, - id_closures, - rclosure->rb_holder); + rbgobj_add_relative(object, rclosure->rb_holder); } void g_rclosure_attach_gobject(GClosure *closure, VALUE object) { @@ -295,15 +292,22 @@ g_closure_ref(closure); g_object_weak_ref(gobject, rclosure_weak_notify, rclosure); rclosure->objects = g_list_prepend(rclosure->objects, gobject); } +static void +g_rclosure_detach_raw_gobject(GClosure *closure, GObject *gobject) +{ + GRClosure *rclosure = (GRClosure *)closure; + rbgobj_gobject_remove_relative(gobject, rclosure->rb_holder); +} + void g_rclosure_detach(GClosure *closure, VALUE object) { GRClosure *rclosure = (GRClosure *)closure; - rbgobj_remove_relative(object, id_closures, rclosure->rb_holder); + rbgobj_remove_relative(object, 0, rclosure->rb_holder); } void g_rclosure_detach_gobject(GClosure *closure, VALUE object) { @@ -336,10 +340,9 @@ static void init_rclosure(void) { id_call = rb_intern("call"); - id_closures = rb_intern("closures"); rclosure_initialized = TRUE; rb_set_end_proc(rclosure_end_proc, Qnil); } /**********************************************************************/