From: Michael Natterer Date: Wed, 18 Dec 2002 18:16:07 +0000 (+0000) Subject: applied patch I got from Tim Janik for testing which fixes bug #101521. X-Git-Url: http://git.openbox.org/?a=commitdiff_plain;h=63f5a15fc61ccd0583e4202ce72120100dd8628b;p=dana%2Fcg-glib.git applied patch I got from Tim Janik for testing which fixes bug #101521. 2002-12-18 Michael Natterer * gobject/gtype.c (type_data_finalize_class_ifaces_Wm): applied patch I got from Tim Janik for testing which fixes bug #101521. (restart iterating the interface enties each time we finalized one because they might have been modified). --- diff --git a/gobject/ChangeLog b/gobject/ChangeLog index 77edfff0..552e01d5 100644 --- a/gobject/ChangeLog +++ b/gobject/ChangeLog @@ -1,3 +1,10 @@ +2002-12-18 Michael Natterer + + * gobject/gtype.c (type_data_finalize_class_ifaces_Wm): applied + patch I got from Tim Janik for testing which fixes bug #101521. + (restart iterating the interface enties each time we finalized one + because they might have been modified). + 2002-12-17 Matthias Clasen * gparam.c (g_param_spec_internal): Remove markup from doc diff --git a/gobject/gtype.c b/gobject/gtype.c index be8ac0db..97422393 100644 --- a/gobject/gtype.c +++ b/gobject/gtype.c @@ -1624,34 +1624,33 @@ type_class_init_Wm (TypeNode *node, static void type_data_finalize_class_ifaces_Wm (TypeNode *node) { - IFaceEntry *entry; guint i; - + g_assert (node->is_instantiatable && node->data && node->data->class.class && node->data->common.ref_count == 0); - + g_message ("finalizing interfaces for %sClass `%s'", type_descriptive_name_I (NODE_FUNDAMENTAL_TYPE (node)), type_descriptive_name_I (NODE_TYPE (node))); - - for (entry = NULL, i = 0; i < CLASSED_NODE_N_IFACES (node); i++) - if (CLASSED_NODE_IFACES_ENTRIES (node)[i].vtable && - CLASSED_NODE_IFACES_ENTRIES (node)[i].vtable->g_instance_type == NODE_TYPE (node)) - entry = CLASSED_NODE_IFACES_ENTRIES (node) + i; - while (entry) + + reiterate: + for (i = 0; i < CLASSED_NODE_N_IFACES (node); i++) { - if (!type_iface_vtable_finalize_Wm (lookup_type_node_I (entry->iface_type), node, entry->vtable)) + IFaceEntry *entry = CLASSED_NODE_IFACES_ENTRIES (node) + i; + if (entry->vtable) { - /* type_iface_vtable_finalize_Wm() doesn't modify write lock upon FALSE, - * iface vtable came from parent - */ - entry->vtable = NULL; + if (type_iface_vtable_finalize_Wm (lookup_type_node_I (entry->iface_type), node, entry->vtable)) + { + /* refetch entries, IFACES_ENTRIES might be modified */ + goto reiterate; + } + else + { + /* type_iface_vtable_finalize_Wm() doesn't modify write lock upon FALSE, + * iface vtable came from parent + */ + entry->vtable = NULL; + } } - - /* refetch entry, IFACES_ENTRIES might be modified */ - for (entry = NULL, i = 0; i < CLASSED_NODE_N_IFACES (node); i++) - if (CLASSED_NODE_IFACES_ENTRIES (node)[i].vtable && - CLASSED_NODE_IFACES_ENTRIES (node)[i].vtable->g_instance_type == NODE_TYPE (node)) - entry = CLASSED_NODE_IFACES_ENTRIES (node) + i; } }