applied patch I got from Tim Janik for testing which fixes bug #101521.
authorMichael Natterer <mitch@gimp.org>
Wed, 18 Dec 2002 18:16:07 +0000 (18:16 +0000)
committerMichael Natterer <mitch@src.gnome.org>
Wed, 18 Dec 2002 18:16:07 +0000 (18:16 +0000)
2002-12-18  Michael Natterer  <mitch@gimp.org>

* 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).

gobject/ChangeLog
gobject/gtype.c

index 77edfff..552e01d 100644 (file)
@@ -1,3 +1,10 @@
+2002-12-18  Michael Natterer  <mitch@gimp.org>
+
+       * 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  <maclas@gmx.de>
 
        * gparam.c (g_param_spec_internal): Remove markup from doc
index be8ac0d..9742239 100644 (file)
@@ -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;
     }
 }