summaryrefslogtreecommitdiff
path: root/girepository/giroffsets.c
diff options
context:
space:
mode:
authorOwen Taylor <otaylor@redhat.com>2008-11-11 13:45:13 +0000
committerOwen Taylor <otaylor@src.gnome.org>2008-11-11 13:45:13 +0000
commit0553931b811bebbcde40f362c36eaa56c958a894 (patch)
tree4bdca9f084cc384290e69435f3857607e71a8e06 /girepository/giroffsets.c
parentfb585197cb3326b0ba9ce5e072fecaa6096986ab (diff)
downloadgobject-introspection-0553931b811bebbcde40f362c36eaa56c958a894.tar.gz
Fail gracefully with an informative error message when recursion is
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. svn path=/trunk/; revision=882
Diffstat (limited to 'girepository/giroffsets.c')
-rw-r--r--girepository/giroffsets.c34
1 files changed, 29 insertions, 5 deletions
diff --git a/girepository/giroffsets.c b/girepository/giroffsets.c
index 8489dc43..f78e4792 100644
--- a/girepository/giroffsets.c
+++ b/girepository/giroffsets.c
@@ -176,7 +176,7 @@ get_interface_size_alignment (GIrNodeType *type,
}
}
- return *alignment != -1;
+ return *alignment > 0;
}
static gboolean
@@ -245,6 +245,8 @@ compute_struct_field_offsets (GList *members,
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 @@ compute_union_field_offsets (GList *members,
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 @@ compute_union_field_offsets (GList *members,
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 @@ compute_union_field_offsets (GList *members,
void
g_ir_node_compute_offsets (GIrNode *node,
GIrModule *module,
- GList *modules)
+ GList *modules)
{
switch (node->type)
{
@@ -374,7 +398,7 @@ g_ir_node_compute_offsets (GIrNode *node,
{
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 @@ g_ir_node_compute_offsets (GIrNode *node,
{
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 @@ g_ir_node_compute_offsets (GIrNode *node,
{
GIrNodeUnion *union_ = (GIrNodeUnion *)node;
- if (union_->alignment != 0)
+ if (!check_needs_computation (node, module, union_->alignment))
return;
compute_union_field_offsets (union_->members,