+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.
+
2008-11-11 Owen Taylor <otaylor@redhat.com>
* girepository/girparser.c: Remove an unused variable.
}
}
- return *alignment != -1;
+ return *alignment > 0;
}
static gboolean
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;
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;
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
void
g_ir_node_compute_offsets (GIrNode *node,
GIrModule *module,
- GList *modules)
+ GList *modules)
{
switch (node->type)
{
{
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,
{
GIrNodeStruct *struct_ = (GIrNodeStruct *)node;
- if (struct_->alignment != 0)
+ if (!check_needs_computation (node, module, struct_->alignment))
return;
compute_struct_field_offsets (struct_->members,
{
GIrNodeUnion *union_ = (GIrNodeUnion *)node;
- if (union_->alignment != 0)
+ if (!check_needs_computation (node, module, union_->alignment))
return;
compute_union_field_offsets (union_->members,