diff options
author | Colin Walters <walters@src.gnome.org> | 2008-09-06 20:33:51 (GMT) |
---|---|---|
committer | Colin Walters <walters@src.gnome.org> | 2008-09-06 20:33:51 (GMT) |
commit | e28078c70cbf4a57c7dbd39626f43f9bd2674145 (patch) | |
tree | 1ab870b5a41cbc3e3a8a70f62b83f6e419049737 /girepository/girnode.c | |
parent | c5eb6a47cedf58210b4d3d73baced9a253e8ae51 (diff) |
Allow both union and struct to be boxed or not
* girepository/girnode.c: Allow gtype_name
and gtype_init in struct and union.
* girepository/girparser.c: Parse glib:
boxed bits for both structure and union.
* girepository/gtypelib.c: Don't barf
if structure is boxed.
* giscanner/girparser.py: Parse new XML
format.
* giscanner/girwriter.py: Write out new
XML format.
* giscanner/glibast.py: Define new classes
which are both Boxed and Struct/Union, as
well as an "Other" for everything else.
* giscanner/glibtransformer.py: Handle
boxed types specially; we try to merge
them with a struct/union if one exists,
otherwise fall back to generic boxed.
* tests/*: Update.
* tools/generate.c: Write out new format.
svn path=/trunk/; revision=575
Diffstat (limited to 'girepository/girnode.c')
-rw-r--r-- | girepository/girnode.c | 26 |
1 files changed, 23 insertions, 3 deletions
diff --git a/girepository/girnode.c b/girepository/girnode.c index fd74dd9..2c557b5 100644 --- a/girepository/girnode.c +++ b/girepository/girnode.c @@ -339,6 +339,9 @@ g_ir_node_free (GIrNode *node) GIrNodeStruct *struct_ = (GIrNodeStruct *)node; g_free (node->name); + g_free (struct_->gtype_name); + g_free (struct_->gtype_init); + for (l = struct_->members; l; l = l->next) g_ir_node_free ((GIrNode *)l->data); g_list_free (struct_->members); @@ -706,6 +709,10 @@ g_ir_node_get_full_size_internal (GIrNode *parent, size = 20; size += ALIGN_VALUE (strlen (node->name) + 1, 4); + if (struct_->gtype_name) + size += ALIGN_VALUE (strlen (struct_->gtype_name) + 1, 4); + if (struct_->gtype_init) + size += ALIGN_VALUE (strlen (struct_->gtype_init) + 1, 4); for (l = struct_->members; l; l = l->next) size += g_ir_node_get_full_size_internal (node, (GIrNode *)l->data); } @@ -809,6 +816,10 @@ g_ir_node_get_full_size_internal (GIrNode *parent, size = 28; size += ALIGN_VALUE (strlen (node->name) + 1, 4); + if (union_->gtype_name) + size += ALIGN_VALUE (strlen (union_->gtype_name) + 1, 4); + if (union_->gtype_init) + size += ALIGN_VALUE (strlen (union_->gtype_init) + 1, 4); for (l = union_->members; l; l = l->next) size += g_ir_node_get_full_size_internal (node, (GIrNode *)l->data); for (l = union_->discriminators; l; l = l->next) @@ -1594,11 +1605,20 @@ g_ir_node_build_typelib (GIrNode *node, blob->blob_type = BLOB_TYPE_STRUCT; blob->deprecated = struct_->deprecated; - blob->unregistered = TRUE; blob->reserved = 0; blob->name = write_string (node->name, strings, data, offset2); - blob->gtype_name = 0; - blob->gtype_init = 0; + if (struct_->gtype_name) + { + blob->unregistered = FALSE; + blob->gtype_name = write_string (struct_->gtype_name, strings, data, offset2); + blob->gtype_init = write_string (struct_->gtype_init, strings, data, offset2); + } + else + { + blob->unregistered = TRUE; + blob->gtype_name = 0; + blob->gtype_init = 0; + } blob->n_fields = 0; blob->n_methods = 0; |