Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/girepository/girnode.c
diff options
context:
space:
mode:
authorColin 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)
commite28078c70cbf4a57c7dbd39626f43f9bd2674145 (patch)
tree1ab870b5a41cbc3e3a8a70f62b83f6e419049737 /girepository/girnode.c
parentc5eb6a47cedf58210b4d3d73baced9a253e8ae51 (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.c26
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;