Compute field offsets and overall size for object structures

2008-11-11  Owen Taylor  <otaylor@redhat.com>

        Compute field offsets and overall size for object structures

        Bug 560326 – Fails to build Gtk-2.0.typelib with "Unexpected non-pointer
        field of type object in structure"

        Do basic computation of field offsets for objects and interfaces;
        this doesn't attempt to address all of the "mess" for virtual
        functions described in Bug 560281.

svn path=/trunk/; revision=888
This commit is contained in:
Owen Taylor 2008-11-11 21:10:12 +00:00 committed by Owen Taylor
parent ecc78cf338
commit 7c221ce28b
2 changed files with 24 additions and 0 deletions

View File

@ -228,6 +228,9 @@ struct _GIrNodeInterface
GList *interfaces;
GList *prerequisites;
gint alignment;
gint size;
GList *members;
};

View File

@ -150,6 +150,14 @@ get_interface_size_alignment (GIrNodeField *field,
*alignment = struct_->alignment;
break;
}
case G_IR_NODE_OBJECT:
case G_IR_NODE_INTERFACE:
{
GIrNodeInterface *interface = (GIrNodeInterface *)iface;
*size = interface->size;
*alignment = interface->alignment;
break;
}
case G_IR_NODE_UNION:
{
GIrNodeUnion *union_ = (GIrNodeUnion *)iface;
@ -426,6 +434,19 @@ g_ir_node_compute_offsets (GIrNode *node,
&struct_->size, &struct_->alignment);
break;
}
case G_IR_NODE_OBJECT:
case G_IR_NODE_INTERFACE:
{
GIrNodeInterface *iface = (GIrNodeInterface *)node;
if (!check_needs_computation (node, module, iface->alignment))
return;
compute_struct_field_offsets (node, iface->members,
module, modules,
&iface->size, &iface->alignment);
break;
}
case G_IR_NODE_UNION:
{
GIrNodeUnion *union_ = (GIrNodeUnion *)node;