diff options
author | Owen Taylor <otaylor@redhat.com> | 2008-11-11 13:45:13 +0000 |
---|---|---|
committer | Owen Taylor <otaylor@src.gnome.org> | 2008-11-11 13:45:13 +0000 |
commit | 0553931b811bebbcde40f362c36eaa56c958a894 (patch) | |
tree | 4bdca9f084cc384290e69435f3857607e71a8e06 /girepository/giroffsets.c | |
parent | fb585197cb3326b0ba9ce5e072fecaa6096986ab (diff) | |
download | gobject-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.c | 34 |
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, |