gobject-introspection r882 - in trunk: . girepository



Author: otaylor
Date: Tue Nov 11 13:45:13 2008
New Revision: 882
URL: http://svn.gnome.org/viewvc/gobject-introspection?rev=882&view=rev

Log:
2008-11-11  Owen Taylor  <otaylor redhat com>

        * girepository/giroffsets.c: Fail gracefully with an informative
        error message when recursion is encountered when computing a
        structure size.

Modified:
   trunk/ChangeLog
   trunk/girepository/giroffsets.c

Modified: trunk/girepository/giroffsets.c
==============================================================================
--- trunk/girepository/giroffsets.c	(original)
+++ trunk/girepository/giroffsets.c	Tue Nov 11 13:45:13 2008
@@ -176,7 +176,7 @@
       }
     }
 
-  return *alignment != -1;
+  return *alignment > 0;
 }
 
 static gboolean
@@ -245,6 +245,8 @@
   GList *l;
   gboolean have_error = FALSE;
 
+  *alignment_out = -2; /* mark to detect recursion */
+
   for (l = members; l; l = l->next)
     {
       GIrNode *member = (GIrNode *)l->data;
@@ -310,6 +312,8 @@
   GList *l;
   gboolean have_error = FALSE;
 
+  *alignment_out = -2; /* mark to detect recursion */
+
   for (l = members; l; l = l->next)
     {
       GIrNode *member = (GIrNode *)l->data;
@@ -353,6 +357,26 @@
   return !have_error;
 }
 
+static gboolean
+check_needs_computation (GIrNode   *node,
+			 GIrModule *module,
+			 gint       alignment)
+{
+  /*
+   *  0: Not yet computed
+   * >0: Previously succeeded
+   * -1: Previously failed
+   * -2: In progress
+   */
+  if (alignment == -2)
+    {
+      g_warning ("Recursion encountered when computing the size of %s.%s",
+		 module->name, node->name);
+    }
+
+  return alignment == 0;
+}
+
 /**
  * g_ir_node_compute_offsets:
  * @node: a #GIrNode
@@ -366,7 +390,7 @@
 void
 g_ir_node_compute_offsets (GIrNode   *node,
 			   GIrModule *module,
-		   GList     *modules)
+			   GList     *modules)
 {
   switch (node->type)
     {
@@ -374,7 +398,7 @@
       {
 	GIrNodeBoxed *boxed = (GIrNodeBoxed *)node;
 
-	if (boxed->alignment != 0) /* Already done */
+	if (!check_needs_computation (node, module, boxed->alignment))
 	  return;
 
 	compute_struct_field_offsets (boxed->members,
@@ -386,7 +410,7 @@
       {
 	GIrNodeStruct *struct_ = (GIrNodeStruct *)node;
 
-	if (struct_->alignment != 0)
+	if (!check_needs_computation (node, module, struct_->alignment))
 	  return;
 
 	compute_struct_field_offsets (struct_->members,
@@ -398,7 +422,7 @@
       {
 	GIrNodeUnion *union_ = (GIrNodeUnion *)node;
 
-	if (union_->alignment != 0)
+	if (!check_needs_computation (node, module, union_->alignment))
 	  return;
 
 	compute_union_field_offsets (union_->members,



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]