1 /* GObject introspection: Typelib creation
3 * Copyright (C) 2005 Matthias Clasen
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2 of the License, or (at your option) any later version.
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, write to the
17 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 * Boston, MA 02111-1307, USA.
25 #include "girmodule.h"
29 static gulong string_count = 0;
30 static gulong unique_string_count = 0;
31 static gulong string_size = 0;
32 static gulong unique_string_size = 0;
33 static gulong types_count = 0;
34 static gulong unique_types_count = 0;
37 _g_irnode_init_stats (void)
40 unique_string_count = 0;
42 unique_string_size = 0;
44 unique_types_count = 0;
48 _g_irnode_dump_stats (void)
50 g_message ("%lu strings (%lu before sharing), %lu bytes (%lu before sharing)",
51 unique_string_count, string_count, unique_string_size, string_size);
52 g_message ("%lu types (%lu before sharing)", unique_types_count, types_count);
55 #define ALIGN_VALUE(this, boundary) \
56 (( ((unsigned long)(this)) + (((unsigned long)(boundary)) -1)) & (~(((unsigned long)(boundary))-1)))
60 g_ir_node_type_to_string (GIrNodeTypeId type)
64 case G_IR_NODE_FUNCTION:
66 case G_IR_NODE_CALLBACK:
72 case G_IR_NODE_OBJECT:
74 case G_IR_NODE_INTERFACE:
76 case G_IR_NODE_SIGNAL:
78 case G_IR_NODE_PROPERTY:
90 case G_IR_NODE_STRUCT:
94 case G_IR_NODE_CONSTANT:
96 case G_IR_NODE_ERROR_DOMAIN:
97 return "error-domain";
100 case G_IR_NODE_UNION:
108 g_ir_node_new (GIrNodeTypeId type)
110 GIrNode *node = NULL;
114 case G_IR_NODE_FUNCTION:
115 case G_IR_NODE_CALLBACK:
116 node = g_malloc0 (sizeof (GIrNodeFunction));
119 case G_IR_NODE_PARAM:
120 node = g_malloc0 (sizeof (GIrNodeParam));
124 node = g_malloc0 (sizeof (GIrNodeType));
127 case G_IR_NODE_OBJECT:
128 case G_IR_NODE_INTERFACE:
129 node = g_malloc0 (sizeof (GIrNodeInterface));
132 case G_IR_NODE_SIGNAL:
133 node = g_malloc0 (sizeof (GIrNodeSignal));
136 case G_IR_NODE_PROPERTY:
137 node = g_malloc0 (sizeof (GIrNodeProperty));
140 case G_IR_NODE_VFUNC:
141 node = g_malloc0 (sizeof (GIrNodeFunction));
144 case G_IR_NODE_FIELD:
145 node = g_malloc0 (sizeof (GIrNodeField));
149 case G_IR_NODE_FLAGS:
150 node = g_malloc0 (sizeof (GIrNodeEnum));
153 case G_IR_NODE_BOXED:
154 node = g_malloc0 (sizeof (GIrNodeBoxed));
157 case G_IR_NODE_STRUCT:
158 node = g_malloc0 (sizeof (GIrNodeStruct));
161 case G_IR_NODE_VALUE:
162 node = g_malloc0 (sizeof (GIrNodeValue));
165 case G_IR_NODE_CONSTANT:
166 node = g_malloc0 (sizeof (GIrNodeConstant));
169 case G_IR_NODE_ERROR_DOMAIN:
170 node = g_malloc0 (sizeof (GIrNodeErrorDomain));
174 node = g_malloc0 (sizeof (GIrNodeXRef));
177 case G_IR_NODE_UNION:
178 node = g_malloc0 (sizeof (GIrNodeUnion));
182 g_error ("Unhandled node type %d\n", type);
192 g_ir_node_free (GIrNode *node)
201 case G_IR_NODE_FUNCTION:
202 case G_IR_NODE_CALLBACK:
204 GIrNodeFunction *function = (GIrNodeFunction *)node;
207 g_free (function->symbol);
208 g_ir_node_free ((GIrNode *)function->result);
209 for (l = function->parameters; l; l = l->next)
210 g_ir_node_free ((GIrNode *)l->data);
211 g_list_free (function->parameters);
217 GIrNodeType *type = (GIrNodeType *)node;
220 g_ir_node_free ((GIrNode *)type->parameter_type1);
221 g_ir_node_free ((GIrNode *)type->parameter_type2);
223 g_free (type->interface);
224 g_strfreev (type->errors);
229 case G_IR_NODE_PARAM:
231 GIrNodeParam *param = (GIrNodeParam *)node;
234 g_ir_node_free ((GIrNode *)param->type);
238 case G_IR_NODE_PROPERTY:
240 GIrNodeProperty *property = (GIrNodeProperty *)node;
243 g_ir_node_free ((GIrNode *)property->type);
247 case G_IR_NODE_SIGNAL:
249 GIrNodeSignal *signal = (GIrNodeSignal *)node;
252 for (l = signal->parameters; l; l = l->next)
253 g_ir_node_free ((GIrNode *)l->data);
254 g_list_free (signal->parameters);
255 g_ir_node_free ((GIrNode *)signal->result);
259 case G_IR_NODE_VFUNC:
261 GIrNodeVFunc *vfunc = (GIrNodeVFunc *)node;
264 for (l = vfunc->parameters; l; l = l->next)
265 g_ir_node_free ((GIrNode *)l->data);
266 g_list_free (vfunc->parameters);
267 g_ir_node_free ((GIrNode *)vfunc->result);
271 case G_IR_NODE_FIELD:
273 GIrNodeField *field = (GIrNodeField *)node;
276 g_ir_node_free ((GIrNode *)field->type);
280 case G_IR_NODE_OBJECT:
281 case G_IR_NODE_INTERFACE:
283 GIrNodeInterface *iface = (GIrNodeInterface *)node;
286 g_free (iface->gtype_name);
287 g_free (iface->gtype_init);
289 g_free (iface->parent);
291 for (l = iface->interfaces; l; l = l->next)
292 g_free ((GIrNode *)l->data);
293 g_list_free (iface->interfaces);
295 for (l = iface->members; l; l = l->next)
296 g_ir_node_free ((GIrNode *)l->data);
297 g_list_free (iface->members);
302 case G_IR_NODE_VALUE:
309 case G_IR_NODE_FLAGS:
311 GIrNodeEnum *enum_ = (GIrNodeEnum *)node;
314 g_free (enum_->gtype_name);
315 g_free (enum_->gtype_init);
317 for (l = enum_->values; l; l = l->next)
318 g_ir_node_free ((GIrNode *)l->data);
319 g_list_free (enum_->values);
323 case G_IR_NODE_BOXED:
325 GIrNodeBoxed *boxed = (GIrNodeBoxed *)node;
328 g_free (boxed->gtype_name);
329 g_free (boxed->gtype_init);
331 for (l = boxed->members; l; l = l->next)
332 g_ir_node_free ((GIrNode *)l->data);
333 g_list_free (boxed->members);
337 case G_IR_NODE_STRUCT:
339 GIrNodeStruct *struct_ = (GIrNodeStruct *)node;
342 g_free (struct_->gtype_name);
343 g_free (struct_->gtype_init);
345 for (l = struct_->members; l; l = l->next)
346 g_ir_node_free ((GIrNode *)l->data);
347 g_list_free (struct_->members);
351 case G_IR_NODE_CONSTANT:
353 GIrNodeConstant *constant = (GIrNodeConstant *)node;
356 g_free (constant->value);
357 g_ir_node_free ((GIrNode *)constant->type);
361 case G_IR_NODE_ERROR_DOMAIN:
363 GIrNodeErrorDomain *domain = (GIrNodeErrorDomain *)node;
366 g_free (domain->getquark);
367 g_free (domain->codes);
373 GIrNodeXRef *xref = (GIrNodeXRef *)node;
376 g_free (xref->namespace);
380 case G_IR_NODE_UNION:
382 GIrNodeUnion *union_ = (GIrNodeUnion *)node;
385 g_free (union_->gtype_name);
386 g_free (union_->gtype_init);
388 g_ir_node_free ((GIrNode *)union_->discriminator_type);
389 for (l = union_->members; l; l = l->next)
390 g_ir_node_free ((GIrNode *)l->data);
391 for (l = union_->discriminators; l; l = l->next)
392 g_ir_node_free ((GIrNode *)l->data);
397 g_error ("Unhandled node type %d\n", node->type);
404 /* returns the fixed size of the blob */
406 g_ir_node_get_size (GIrNode *node)
413 case G_IR_NODE_CALLBACK:
417 case G_IR_NODE_FUNCTION:
421 case G_IR_NODE_PARAM:
429 case G_IR_NODE_OBJECT:
431 GIrNodeInterface *iface = (GIrNodeInterface *)node;
433 n = g_list_length (iface->interfaces);
434 size = 32 + 2 * (n + (n % 2));
436 for (l = iface->members; l; l = l->next)
437 size += g_ir_node_get_size ((GIrNode *)l->data);
441 case G_IR_NODE_INTERFACE:
443 GIrNodeInterface *iface = (GIrNodeInterface *)node;
445 n = g_list_length (iface->prerequisites);
446 size = 28 + 2 * (n + (n % 2));
448 for (l = iface->members; l; l = l->next)
449 size += g_ir_node_get_size ((GIrNode *)l->data);
454 case G_IR_NODE_FLAGS:
456 GIrNodeEnum *enum_ = (GIrNodeEnum *)node;
459 for (l = enum_->values; l; l = l->next)
460 size += g_ir_node_get_size ((GIrNode *)l->data);
464 case G_IR_NODE_VALUE:
468 case G_IR_NODE_STRUCT:
470 GIrNodeStruct *struct_ = (GIrNodeStruct *)node;
473 for (l = struct_->members; l; l = l->next)
474 size += g_ir_node_get_size ((GIrNode *)l->data);
478 case G_IR_NODE_BOXED:
480 GIrNodeBoxed *boxed = (GIrNodeBoxed *)node;
483 for (l = boxed->members; l; l = l->next)
484 size += g_ir_node_get_size ((GIrNode *)l->data);
488 case G_IR_NODE_PROPERTY:
492 case G_IR_NODE_SIGNAL:
496 case G_IR_NODE_VFUNC:
500 case G_IR_NODE_FIELD:
504 case G_IR_NODE_CONSTANT:
508 case G_IR_NODE_ERROR_DOMAIN:
516 case G_IR_NODE_UNION:
518 GIrNodeUnion *union_ = (GIrNodeUnion *)node;
521 for (l = union_->members; l; l = l->next)
522 size += g_ir_node_get_size ((GIrNode *)l->data);
523 for (l = union_->discriminators; l; l = l->next)
524 size += g_ir_node_get_size ((GIrNode *)l->data);
529 g_error ("Unhandled node type '%s'\n",
530 g_ir_node_type_to_string (node->type));
534 g_debug ("node %p type '%s' size %d", node,
535 g_ir_node_type_to_string (node->type), size);
540 /* returns the full size of the blob including variable-size parts */
542 g_ir_node_get_full_size_internal (GIrNode *parent,
548 if (node == NULL && parent != NULL)
549 g_error ("Caught NULL node, parent=%s", parent->name);
551 g_debug ("node %p type '%s'", node,
552 g_ir_node_type_to_string (node->type));
556 case G_IR_NODE_CALLBACK:
558 GIrNodeFunction *function = (GIrNodeFunction *)node;
560 size += ALIGN_VALUE (strlen (node->name) + 1, 4);
561 for (l = function->parameters; l; l = l->next)
563 size += g_ir_node_get_full_size_internal (node, (GIrNode *)l->data);
565 size += g_ir_node_get_full_size_internal (node, (GIrNode *)function->result);
569 case G_IR_NODE_FUNCTION:
571 GIrNodeFunction *function = (GIrNodeFunction *)node;
573 size += ALIGN_VALUE (strlen (node->name) + 1, 4);
574 size += ALIGN_VALUE (strlen (function->symbol) + 1, 4);
575 for (l = function->parameters; l; l = l->next)
576 size += g_ir_node_get_full_size_internal (node, (GIrNode *)l->data);
577 size += g_ir_node_get_full_size_internal (node, (GIrNode *)function->result);
581 case G_IR_NODE_PARAM:
583 GIrNodeParam *param = (GIrNodeParam *)node;
587 size += ALIGN_VALUE (strlen (node->name) + 1, 4);
588 size += g_ir_node_get_full_size_internal (node, (GIrNode *)param->type);
594 GIrNodeType *type = (GIrNodeType *)node;
595 if (type->tag < GI_TYPE_TAG_ARRAY)
599 g_debug ("node %p type tag '%s'", node,
600 g_type_tag_to_string (type->tag));
604 case GI_TYPE_TAG_ARRAY:
606 if (type->parameter_type1)
607 size += g_ir_node_get_full_size_internal (node, (GIrNode *)type->parameter_type1);
609 case GI_TYPE_TAG_INTERFACE:
612 case GI_TYPE_TAG_GLIST:
613 case GI_TYPE_TAG_GSLIST:
615 if (type->parameter_type1)
616 size += g_ir_node_get_full_size_internal (node, (GIrNode *)type->parameter_type1);
618 case GI_TYPE_TAG_GHASH:
620 if (type->parameter_type1)
621 size += g_ir_node_get_full_size_internal (node, (GIrNode *)type->parameter_type1);
622 if (type->parameter_type2)
623 size += g_ir_node_get_full_size_internal (node, (GIrNode *)type->parameter_type2);
625 case GI_TYPE_TAG_ERROR:
630 n = g_strv_length (type->errors);
634 size = 4 + 4 + 2 * (n + n % 2);
638 g_error ("Unknown type tag %d\n", type->tag);
645 case G_IR_NODE_OBJECT:
647 GIrNodeInterface *iface = (GIrNodeInterface *)node;
649 n = g_list_length (iface->interfaces);
652 size += ALIGN_VALUE (strlen (iface->parent) + 1, 4);
653 size += ALIGN_VALUE (strlen (node->name) + 1, 4);
654 size += ALIGN_VALUE (strlen (iface->gtype_name) + 1, 4);
655 if (iface->gtype_init)
656 size += ALIGN_VALUE (strlen (iface->gtype_init) + 1, 4);
657 size += ALIGN_VALUE ( + 1, 4);
658 size += 2 * (n + (n % 2));
660 for (l = iface->members; l; l = l->next)
661 size += g_ir_node_get_full_size_internal (node, (GIrNode *)l->data);
665 case G_IR_NODE_INTERFACE:
667 GIrNodeInterface *iface = (GIrNodeInterface *)node;
669 n = g_list_length (iface->prerequisites);
671 size += ALIGN_VALUE (strlen (node->name) + 1, 4);
672 size += ALIGN_VALUE (strlen (iface->gtype_name) + 1, 4);
673 size += ALIGN_VALUE (strlen (iface->gtype_init) + 1, 4);
674 size += 2 * (n + (n % 2));
676 for (l = iface->members; l; l = l->next)
677 size += g_ir_node_get_full_size_internal (node, (GIrNode *)l->data);
682 case G_IR_NODE_FLAGS:
684 GIrNodeEnum *enum_ = (GIrNodeEnum *)node;
687 size += ALIGN_VALUE (strlen (node->name) + 1, 4);
688 if (enum_->gtype_name)
690 size += ALIGN_VALUE (strlen (enum_->gtype_name) + 1, 4);
691 size += ALIGN_VALUE (strlen (enum_->gtype_init) + 1, 4);
694 for (l = enum_->values; l; l = l->next)
695 size += g_ir_node_get_full_size_internal (node, (GIrNode *)l->data);
699 case G_IR_NODE_VALUE:
702 size += ALIGN_VALUE (strlen (node->name) + 1, 4);
706 case G_IR_NODE_STRUCT:
708 GIrNodeStruct *struct_ = (GIrNodeStruct *)node;
711 size += ALIGN_VALUE (strlen (node->name) + 1, 4);
712 if (struct_->gtype_name)
713 size += ALIGN_VALUE (strlen (struct_->gtype_name) + 1, 4);
714 if (struct_->gtype_init)
715 size += ALIGN_VALUE (strlen (struct_->gtype_init) + 1, 4);
716 for (l = struct_->members; l; l = l->next)
717 size += g_ir_node_get_full_size_internal (node, (GIrNode *)l->data);
721 case G_IR_NODE_BOXED:
723 GIrNodeBoxed *boxed = (GIrNodeBoxed *)node;
726 size += ALIGN_VALUE (strlen (node->name) + 1, 4);
727 if (boxed->gtype_name)
729 size += ALIGN_VALUE (strlen (boxed->gtype_name) + 1, 4);
730 size += ALIGN_VALUE (strlen (boxed->gtype_init) + 1, 4);
732 for (l = boxed->members; l; l = l->next)
733 size += g_ir_node_get_full_size_internal (node, (GIrNode *)l->data);
737 case G_IR_NODE_PROPERTY:
739 GIrNodeProperty *prop = (GIrNodeProperty *)node;
742 size += ALIGN_VALUE (strlen (node->name) + 1, 4);
743 size += g_ir_node_get_full_size_internal (node, (GIrNode *)prop->type);
747 case G_IR_NODE_SIGNAL:
749 GIrNodeSignal *signal = (GIrNodeSignal *)node;
752 size += ALIGN_VALUE (strlen (node->name) + 1, 4);
753 for (l = signal->parameters; l; l = l->next)
754 size += g_ir_node_get_full_size_internal (node, (GIrNode *)l->data);
755 size += g_ir_node_get_full_size_internal (node, (GIrNode *)signal->result);
759 case G_IR_NODE_VFUNC:
761 GIrNodeVFunc *vfunc = (GIrNodeVFunc *)node;
764 size += ALIGN_VALUE (strlen (node->name) + 1, 4);
765 for (l = vfunc->parameters; l; l = l->next)
766 size += g_ir_node_get_full_size_internal (node, (GIrNode *)l->data);
767 size += g_ir_node_get_full_size_internal (node, (GIrNode *)vfunc->result);
771 case G_IR_NODE_FIELD:
773 GIrNodeField *field = (GIrNodeField *)node;
776 size += ALIGN_VALUE (strlen (node->name) + 1, 4);
777 size += g_ir_node_get_full_size_internal (node, (GIrNode *)field->type);
781 case G_IR_NODE_CONSTANT:
783 GIrNodeConstant *constant = (GIrNodeConstant *)node;
786 size += ALIGN_VALUE (strlen (node->name) + 1, 4);
787 /* FIXME non-string values */
788 size += ALIGN_VALUE (strlen (constant->value) + 1, 4);
789 size += g_ir_node_get_full_size_internal (node, (GIrNode *)constant->type);
793 case G_IR_NODE_ERROR_DOMAIN:
795 GIrNodeErrorDomain *domain = (GIrNodeErrorDomain *)node;
798 size += ALIGN_VALUE (strlen (node->name) + 1, 4);
799 size += ALIGN_VALUE (strlen (domain->getquark) + 1, 4);
805 GIrNodeXRef *xref = (GIrNodeXRef *)node;
808 size += ALIGN_VALUE (strlen (node->name) + 1, 4);
809 size += ALIGN_VALUE (strlen (xref->namespace) + 1, 4);
813 case G_IR_NODE_UNION:
815 GIrNodeUnion *union_ = (GIrNodeUnion *)node;
818 size += ALIGN_VALUE (strlen (node->name) + 1, 4);
819 if (union_->gtype_name)
820 size += ALIGN_VALUE (strlen (union_->gtype_name) + 1, 4);
821 if (union_->gtype_init)
822 size += ALIGN_VALUE (strlen (union_->gtype_init) + 1, 4);
823 for (l = union_->members; l; l = l->next)
824 size += g_ir_node_get_full_size_internal (node, (GIrNode *)l->data);
825 for (l = union_->discriminators; l; l = l->next)
826 size += g_ir_node_get_full_size_internal (node, (GIrNode *)l->data);
831 g_error ("Unknown type tag %d\n", node->type);
835 g_debug ("node %s%s%s%p type '%s' full size %d",
836 node->name ? "'" : "",
837 node->name ? node->name : "",
838 node->name ? "' " : "",
839 node, g_ir_node_type_to_string (node->type), size);
845 g_ir_node_get_full_size (GIrNode *node)
847 return g_ir_node_get_full_size_internal (NULL, node);
851 g_ir_node_cmp (GIrNode *node,
854 if (node->type < other->type)
856 else if (node->type > other->type)
859 return strcmp (node->name, other->name);
863 g_ir_node_can_have_member (GIrNode *node)
867 case G_IR_NODE_OBJECT:
868 case G_IR_NODE_INTERFACE:
869 case G_IR_NODE_BOXED:
870 case G_IR_NODE_STRUCT:
871 case G_IR_NODE_UNION:
873 /* list others individually rather than with default: so that compiler
874 * warns if new node types are added without adding them to the switch
876 case G_IR_NODE_INVALID:
877 case G_IR_NODE_FUNCTION:
878 case G_IR_NODE_CALLBACK:
880 case G_IR_NODE_FLAGS:
881 case G_IR_NODE_CONSTANT:
882 case G_IR_NODE_ERROR_DOMAIN:
883 case G_IR_NODE_PARAM:
885 case G_IR_NODE_PROPERTY:
886 case G_IR_NODE_SIGNAL:
887 case G_IR_NODE_VALUE:
888 case G_IR_NODE_VFUNC:
889 case G_IR_NODE_FIELD:
897 g_ir_node_add_member (GIrNode *node,
898 GIrNodeFunction *member)
900 g_return_if_fail (node != NULL);
901 g_return_if_fail (member != NULL);
905 case G_IR_NODE_OBJECT:
906 case G_IR_NODE_INTERFACE:
908 GIrNodeInterface *iface = (GIrNodeInterface *)node;
910 g_list_insert_sorted (iface->members, member,
911 (GCompareFunc) g_ir_node_cmp);
914 case G_IR_NODE_BOXED:
916 GIrNodeBoxed *boxed = (GIrNodeBoxed *)node;
918 g_list_insert_sorted (boxed->members, member,
919 (GCompareFunc) g_ir_node_cmp);
922 case G_IR_NODE_STRUCT:
924 GIrNodeStruct *struct_ = (GIrNodeStruct *)node;
926 g_list_insert_sorted (struct_->members, member,
927 (GCompareFunc) g_ir_node_cmp);
930 case G_IR_NODE_UNION:
932 GIrNodeUnion *union_ = (GIrNodeUnion *)node;
934 g_list_insert_sorted (union_->members, member,
935 (GCompareFunc) g_ir_node_cmp);
939 g_error ("Cannot add a member to unknown type tag type %d\n",
946 g_ir_node_param_direction_string (GIrNodeParam * node)
959 parse_int_value (const gchar *str)
961 return strtoll (str, NULL, 0);
965 parse_uint_value (const gchar *str)
967 return strtoull (str, NULL, 0);
971 parse_float_value (const gchar *str)
973 return strtod (str, NULL);
977 parse_boolean_value (const gchar *str)
979 if (strcmp (str, "TRUE") == 0)
982 if (strcmp (str, "FALSE") == 0)
985 return parse_int_value (str) ? TRUE : FALSE;
989 find_entry_node (GIrModule *module,
999 GIrNode *result = NULL;
1001 g_assert (name != NULL);
1002 g_assert (strlen (name) > 0);
1004 names = g_strsplit (name, ".", 0);
1005 n_names = g_strv_length (names);
1007 g_error ("Too many name parts");
1009 for (l = module->entries, i = 1; l; l = l->next, i++)
1011 GIrNode *node = (GIrNode *)l->data;
1015 if (node->type != G_IR_NODE_XREF)
1018 if (((GIrNodeXRef *)node)->namespace == NULL ||
1019 strcmp (((GIrNodeXRef *)node)->namespace, names[0]) != 0)
1023 if (strcmp (node->name, names[n_names - 1]) == 0)
1035 GIrNode *node = g_ir_node_new (G_IR_NODE_XREF);
1037 ((GIrNodeXRef *)node)->namespace = g_strdup (names[0]);
1038 node->name = g_strdup (names[1]);
1040 module->entries = g_list_append (module->entries, node);
1043 *idx = g_list_length (module->entries);
1047 g_debug ("Creating XREF: %s %s", names[0], names[1]);
1052 g_warning ("Entry '%s' not found", name);
1062 find_entry (GIrModule *module,
1068 find_entry_node (module, modules, name, &idx);
1074 find_name_in_module (GIrModule *module,
1079 for (l = module->entries; l; l = l->next)
1081 GIrNode *node = (GIrNode *)l->data;
1083 if (strcmp (node->name, name) == 0)
1091 g_ir_find_node (GIrModule *module,
1095 GIrModule **module_out)
1097 char **names = g_strsplit (name, ".", 0);
1098 gint n_names = g_strv_length (names);
1099 GIrNode *node = NULL;
1104 g_warning ("Name can't be empty");
1110 g_warning ("Too many name parts in '%s'", name);
1116 *module_out = module;
1117 node = find_name_in_module (module, names[0]);
1119 else if (strcmp (names[0], module->name) == 0)
1121 *module_out = module;
1122 node = find_name_in_module (module, names[1]);
1126 for (l = module->include_modules; l; l = l->next)
1128 GIrModule *m = l->data;
1130 if (strcmp (names[0], m->name) == 0)
1133 node = find_name_in_module (m, names[1]);
1138 for (l = modules; l; l = l->next)
1140 GIrModule *m = l->data;
1142 if (strcmp (names[0], m->name) == 0)
1145 node = find_name_in_module (m, names[1]);
1156 return node != NULL;
1160 serialize_type (GIrModule *module,
1166 const gchar* basic[] = {
1192 if (node->tag < GI_TYPE_TAG_ARRAY)
1194 g_string_append_printf (str, "%s", basic[node->tag]);
1196 else if (node->tag == GI_TYPE_TAG_ARRAY)
1198 serialize_type (module, modules, node->parameter_type1, str);
1199 g_string_append (str, "[");
1201 if (node->has_length)
1202 g_string_append_printf (str, "length=%d", node->length);
1203 else if (node->has_size)
1204 g_string_append_printf (str, "fixed-size=%d", node->size);
1206 if (node->zero_terminated)
1207 g_string_append_printf (str, "%szero-terminated=1",
1208 node->has_length ? "," : "");
1210 g_string_append (str, "]");
1212 else if (node->tag == GI_TYPE_TAG_INTERFACE)
1217 iface = find_entry_node (module, modules, node->interface, NULL);
1220 if (iface->type == G_IR_NODE_XREF)
1221 g_string_append_printf (str, "%s.", ((GIrNodeXRef *)iface)->namespace);
1226 g_warning ("Interface for type reference %s not found", node->interface);
1227 name = node->interface;
1230 g_string_append_printf (str, "%s", name);
1232 else if (node->tag == GI_TYPE_TAG_GLIST)
1234 g_string_append (str, "GList");
1235 if (node->parameter_type1)
1237 g_string_append (str, "<");
1238 serialize_type (module, modules, node->parameter_type1, str);
1239 g_string_append (str, ">");
1242 else if (node->tag == GI_TYPE_TAG_GSLIST)
1244 g_string_append (str, "GSList");
1245 if (node->parameter_type1)
1247 g_string_append (str, "<");
1248 serialize_type (module, modules, node->parameter_type1, str);
1249 g_string_append (str, ">");
1252 else if (node->tag == GI_TYPE_TAG_GHASH)
1254 g_string_append (str, "GHashTable<");
1255 if (node->parameter_type1)
1257 g_string_append (str, "<");
1258 serialize_type (module, modules, node->parameter_type1, str);
1259 g_string_append (str, ",");
1260 serialize_type (module, modules, node->parameter_type2, str);
1261 g_string_append (str, ">");
1264 else if (node->tag == GI_TYPE_TAG_ERROR)
1266 g_string_append (str, "GError");
1269 g_string_append (str, "<");
1270 for (i = 0; node->errors[i]; i++)
1273 g_string_append (str, ",");
1274 g_string_append (str, node->errors[i]);
1276 g_string_append (str, ">");
1282 g_ir_node_build_members (GList **members,
1287 GHashTable *strings,
1293 GList *l = *members;
1297 GIrNode *member = (GIrNode *)l->data;
1298 GList *next = l->next;
1300 if (member->type == type)
1303 g_ir_node_build_typelib (member, module, modules, strings,
1304 types, data, offset, offset2);
1305 *members = g_list_delete_link (*members, l);
1312 g_ir_node_check_unhandled_members (GList **members,
1313 GIrNodeTypeId container_type)
1320 for (l = *members; l; l = l->next)
1322 GIrNode *member = (GIrNode *)l->data;
1323 g_printerr ("Unhandled '%s' member '%s' type '%s'\n",
1324 g_ir_node_type_to_string (container_type),
1326 g_ir_node_type_to_string (member->type));
1329 g_list_free (*members);
1332 g_error ("Unhandled members. Aborting.");
1335 g_list_free (*members);
1341 g_ir_node_build_typelib (GIrNode *node,
1344 GHashTable *strings,
1351 guint32 old_offset = *offset;
1352 guint32 old_offset2 = *offset2;
1354 g_assert (node != NULL);
1356 g_debug ("build_typelib: %s%s(%s)",
1357 node->name ? node->name : "",
1358 node->name ? " " : "",
1359 g_ir_node_type_to_string (node->type));
1361 g_ir_node_compute_offsets (node, module, modules);
1365 case G_IR_NODE_TYPE:
1367 GIrNodeType *type = (GIrNodeType *)node;
1368 SimpleTypeBlob *blob = (SimpleTypeBlob *)&data[*offset];
1372 if (type->tag < GI_TYPE_TAG_ARRAY ||
1373 type->tag == GI_TYPE_TAG_UTF8 ||
1374 type->tag == GI_TYPE_TAG_FILENAME)
1377 blob->reserved2 = 0;
1378 blob->pointer = type->is_pointer;
1379 blob->reserved3 = 0;
1380 blob->tag = type->tag;
1388 str = g_string_new (0);
1389 serialize_type (module, modules, type, str);
1390 s = g_string_free (str, FALSE);
1393 value = g_hash_table_lookup (types, s);
1396 blob->offset = GPOINTER_TO_UINT (value);
1401 unique_types_count += 1;
1402 g_hash_table_insert (types, s, GUINT_TO_POINTER(*offset2));
1404 blob->offset = *offset2;
1407 case GI_TYPE_TAG_ARRAY:
1409 ArrayTypeBlob *array = (ArrayTypeBlob *)&data[*offset2];
1413 array->reserved = 0;
1414 array->tag = type->tag;
1415 array->zero_terminated = type->zero_terminated;
1416 array->has_length = type->has_length;
1417 array->has_size = type->has_size;
1418 array->reserved2 = 0;
1419 if (array->has_length)
1420 array->length = type->length;
1421 else if (array->has_size)
1422 array->size = type->size;
1429 g_ir_node_build_typelib ((GIrNode *)type->parameter_type1,
1430 module, modules, strings, types,
1431 data, &pos, offset2);
1435 case GI_TYPE_TAG_INTERFACE:
1437 InterfaceTypeBlob *iface = (InterfaceTypeBlob *)&data[*offset2];
1440 iface->pointer = type->is_pointer;
1441 iface->reserved = 0;
1442 iface->tag = type->tag;
1443 iface->reserved2 = 0;
1444 iface->interface = find_entry (module, modules, type->interface);
1449 case GI_TYPE_TAG_GLIST:
1450 case GI_TYPE_TAG_GSLIST:
1452 ParamTypeBlob *param = (ParamTypeBlob *)&data[*offset2];
1456 param->reserved = 0;
1457 param->tag = type->tag;
1458 param->reserved2 = 0;
1464 g_ir_node_build_typelib ((GIrNode *)type->parameter_type1,
1465 module, modules, strings, types,
1466 data, &pos, offset2);
1470 case GI_TYPE_TAG_GHASH:
1472 ParamTypeBlob *param = (ParamTypeBlob *)&data[*offset2];
1476 param->reserved = 0;
1477 param->tag = type->tag;
1478 param->reserved2 = 0;
1484 g_ir_node_build_typelib ((GIrNode *)type->parameter_type1,
1485 module, modules, strings, types,
1486 data, &pos, offset2);
1487 g_ir_node_build_typelib ((GIrNode *)type->parameter_type2,
1488 module, modules, strings, types,
1489 data, &pos, offset2);
1493 case GI_TYPE_TAG_ERROR:
1495 ErrorTypeBlob *blob = (ErrorTypeBlob *)&data[*offset2];
1500 blob->tag = type->tag;
1501 blob->reserved2 = 0;
1503 blob->n_domains = g_strv_length (type->errors);
1505 blob->n_domains = 0;
1507 *offset2 = ALIGN_VALUE (*offset2 + 4 + 2 * blob->n_domains, 4);
1508 for (i = 0; i < blob->n_domains; i++)
1509 blob->domains[i] = find_entry (module, modules, type->errors[i]);
1514 g_error ("Unknown type tag %d\n", type->tag);
1522 case G_IR_NODE_FIELD:
1524 GIrNodeField *field = (GIrNodeField *)node;
1527 blob = (FieldBlob *)&data[*offset];
1530 blob->name = write_string (node->name, strings, data, offset2);
1531 blob->readable = field->readable;
1532 blob->writable = field->writable;
1535 if (field->offset >= 0)
1536 blob->struct_offset = field->offset;
1538 blob->struct_offset = 0xFFFF; /* mark as unknown */
1540 g_ir_node_build_typelib ((GIrNode *)field->type,
1541 module, modules, strings, types,
1542 data, offset, offset2);
1546 case G_IR_NODE_PROPERTY:
1548 GIrNodeProperty *prop = (GIrNodeProperty *)node;
1549 PropertyBlob *blob = (PropertyBlob *)&data[*offset];
1552 blob->name = write_string (node->name, strings, data, offset2);
1553 blob->deprecated = prop->deprecated;
1554 blob->readable = prop->readable;
1555 blob->writable = prop->writable;
1556 blob->construct = prop->construct;
1557 blob->construct_only = prop->construct_only;
1560 g_ir_node_build_typelib ((GIrNode *)prop->type,
1561 module, modules, strings, types,
1562 data, offset, offset2);
1566 case G_IR_NODE_FUNCTION:
1568 FunctionBlob *blob = (FunctionBlob *)&data[*offset];
1569 SignatureBlob *blob2 = (SignatureBlob *)&data[*offset2];
1570 GIrNodeFunction *function = (GIrNodeFunction *)node;
1574 signature = *offset2;
1575 n = g_list_length (function->parameters);
1578 *offset2 += 8 + n * 12;
1580 blob->blob_type = BLOB_TYPE_FUNCTION;
1581 blob->deprecated = function->deprecated;
1582 blob->setter = function->is_setter;
1583 blob->getter = function->is_getter;
1584 blob->constructor = function->is_constructor;
1585 blob->wraps_vfunc = function->wraps_vfunc;
1586 blob->throws = function->throws;
1588 blob->name = write_string (node->name, strings, data, offset2);
1589 blob->symbol = write_string (function->symbol, strings, data, offset2);
1590 blob->signature = signature;
1592 g_debug ("building function '%s'", function->symbol);
1594 g_ir_node_build_typelib ((GIrNode *)function->result->type,
1595 module, modules, strings, types,
1596 data, &signature, offset2);
1598 blob2->may_return_null = function->result->allow_none;
1599 blob2->caller_owns_return_value = function->result->transfer;
1600 blob2->caller_owns_return_container = function->result->shallow_transfer;
1601 blob2->reserved = 0;
1602 blob2->n_arguments = n;
1606 for (l = function->parameters; l; l = l->next)
1608 GIrNode *param = (GIrNode *)l->data;
1610 g_ir_node_build_typelib (param,
1611 module, modules, strings, types,
1612 data, &signature, offset2);
1618 case G_IR_NODE_CALLBACK:
1620 CallbackBlob *blob = (CallbackBlob *)&data[*offset];
1621 SignatureBlob *blob2 = (SignatureBlob *)&data[*offset2];
1622 GIrNodeFunction *function = (GIrNodeFunction *)node;
1626 signature = *offset2;
1627 n = g_list_length (function->parameters);
1630 *offset2 += 8 + n * 12;
1632 blob->blob_type = BLOB_TYPE_CALLBACK;
1633 blob->deprecated = function->deprecated;
1635 blob->name = write_string (node->name, strings, data, offset2);
1636 blob->signature = signature;
1638 g_ir_node_build_typelib ((GIrNode *)function->result->type,
1639 module, modules, strings, types,
1640 data, &signature, offset2);
1642 blob2->may_return_null = function->result->allow_none;
1643 blob2->caller_owns_return_value = function->result->transfer;
1644 blob2->caller_owns_return_container = function->result->shallow_transfer;
1645 blob2->reserved = 0;
1646 blob2->n_arguments = n;
1650 for (l = function->parameters; l; l = l->next)
1652 GIrNode *param = (GIrNode *)l->data;
1654 g_ir_node_build_typelib (param,
1655 module, modules, strings, types,
1656 data, &signature, offset2);
1661 case G_IR_NODE_SIGNAL:
1663 SignalBlob *blob = (SignalBlob *)&data[*offset];
1664 SignatureBlob *blob2 = (SignatureBlob *)&data[*offset2];
1665 GIrNodeSignal *signal = (GIrNodeSignal *)node;
1669 signature = *offset2;
1670 n = g_list_length (signal->parameters);
1673 *offset2 += 8 + n * 12;
1675 blob->deprecated = signal->deprecated;
1676 blob->run_first = signal->run_first;
1677 blob->run_last = signal->run_last;
1678 blob->run_cleanup = signal->run_cleanup;
1679 blob->no_recurse = signal->no_recurse;
1680 blob->detailed = signal->detailed;
1681 blob->action = signal->action;
1682 blob->no_hooks = signal->no_hooks;
1683 blob->has_class_closure = 0; /* FIXME */
1684 blob->true_stops_emit = 0; /* FIXME */
1686 blob->class_closure = 0; /* FIXME */
1687 blob->name = write_string (node->name, strings, data, offset2);
1688 blob->signature = signature;
1690 g_ir_node_build_typelib ((GIrNode *)signal->result->type,
1691 module, modules, strings, types,
1692 data, &signature, offset2);
1694 blob2->may_return_null = signal->result->allow_none;
1695 blob2->caller_owns_return_value = signal->result->transfer;
1696 blob2->caller_owns_return_container = signal->result->shallow_transfer;
1697 blob2->reserved = 0;
1698 blob2->n_arguments = n;
1702 for (l = signal->parameters; l; l = l->next)
1704 GIrNode *param = (GIrNode *)l->data;
1706 g_ir_node_build_typelib (param, module, modules, strings, types,
1707 data, &signature, offset2);
1712 case G_IR_NODE_VFUNC:
1714 VFuncBlob *blob = (VFuncBlob *)&data[*offset];
1715 SignatureBlob *blob2 = (SignatureBlob *)&data[*offset2];
1716 GIrNodeVFunc *vfunc = (GIrNodeVFunc *)node;
1720 signature = *offset2;
1721 n = g_list_length (vfunc->parameters);
1724 *offset2 += 8 + n * 12;
1726 blob->name = write_string (node->name, strings, data, offset2);
1727 blob->must_chain_up = 0; /* FIXME */
1728 blob->must_be_implemented = 0; /* FIXME */
1729 blob->must_not_be_implemented = 0; /* FIXME */
1730 blob->class_closure = 0; /* FIXME */
1733 blob->struct_offset = vfunc->offset;
1734 blob->reserved2 = 0;
1735 blob->signature = signature;
1737 g_ir_node_build_typelib ((GIrNode *)vfunc->result->type,
1738 module, modules, strings, types,
1739 data, &signature, offset2);
1741 blob2->may_return_null = vfunc->result->allow_none;
1742 blob2->caller_owns_return_value = vfunc->result->transfer;
1743 blob2->caller_owns_return_container = vfunc->result->shallow_transfer;
1744 blob2->reserved = 0;
1745 blob2->n_arguments = n;
1749 for (l = vfunc->parameters; l; l = l->next)
1751 GIrNode *param = (GIrNode *)l->data;
1753 g_ir_node_build_typelib (param, module, modules, strings,
1754 types, data, &signature, offset2);
1759 case G_IR_NODE_PARAM:
1761 ArgBlob *blob = (ArgBlob *)&data[*offset];
1762 GIrNodeParam *param = (GIrNodeParam *)node;
1766 blob->name = write_string (node->name, strings, data, offset2);
1767 blob->in = param->in;
1768 blob->out = param->out;
1769 blob->dipper = param->dipper;
1770 blob->allow_none = param->allow_none;
1771 blob->optional = param->optional;
1772 blob->transfer_ownership = param->transfer;
1773 blob->transfer_container_ownership = param->shallow_transfer;
1774 blob->return_value = param->retval;
1777 g_ir_node_build_typelib ((GIrNode *)param->type, module, modules,
1778 strings, types, data, offset, offset2);
1782 case G_IR_NODE_STRUCT:
1784 StructBlob *blob = (StructBlob *)&data[*offset];
1785 GIrNodeStruct *struct_ = (GIrNodeStruct *)node;
1788 blob->blob_type = BLOB_TYPE_STRUCT;
1789 blob->deprecated = struct_->deprecated;
1791 blob->name = write_string (node->name, strings, data, offset2);
1792 if (struct_->gtype_name)
1794 blob->unregistered = FALSE;
1795 blob->gtype_name = write_string (struct_->gtype_name, strings, data, offset2);
1796 blob->gtype_init = write_string (struct_->gtype_init, strings, data, offset2);
1800 blob->unregistered = TRUE;
1801 blob->gtype_name = 0;
1802 blob->gtype_init = 0;
1806 blob->n_methods = 0;
1810 members = g_list_copy (struct_->members);
1812 g_ir_node_build_members (&members, G_IR_NODE_FIELD, &blob->n_fields,
1813 module, modules, strings,
1814 types, data, offset, offset2);
1816 g_ir_node_build_members (&members, G_IR_NODE_FUNCTION, &blob->n_methods,
1817 module, modules, strings,
1818 types, data, offset, offset2);
1820 g_ir_node_check_unhandled_members (&members, node->type);
1822 g_assert (members == NULL);
1826 case G_IR_NODE_BOXED:
1828 StructBlob *blob = (StructBlob *)&data[*offset];
1829 GIrNodeBoxed *boxed = (GIrNodeBoxed *)node;
1832 blob->blob_type = BLOB_TYPE_BOXED;
1833 blob->deprecated = boxed->deprecated;
1834 blob->unregistered = FALSE;
1836 blob->name = write_string (node->name, strings, data, offset2);
1837 blob->gtype_name = write_string (boxed->gtype_name, strings, data, offset2);
1838 blob->gtype_init = write_string (boxed->gtype_init, strings, data, offset2);
1841 blob->n_methods = 0;
1845 members = g_list_copy (boxed->members);
1847 g_ir_node_build_members (&members, G_IR_NODE_FIELD, &blob->n_fields,
1848 module, modules, strings,
1849 types, data, offset, offset2);
1851 g_ir_node_build_members (&members, G_IR_NODE_FUNCTION, &blob->n_methods,
1852 module, modules, strings,
1853 types, data, offset, offset2);
1855 g_ir_node_check_unhandled_members (&members, node->type);
1857 g_assert (members == NULL);
1861 case G_IR_NODE_UNION:
1863 UnionBlob *blob = (UnionBlob *)&data[*offset];
1864 GIrNodeUnion *union_ = (GIrNodeUnion *)node;
1867 blob->blob_type = BLOB_TYPE_UNION;
1868 blob->deprecated = union_->deprecated;
1870 blob->name = write_string (node->name, strings, data, offset2);
1871 if (union_->gtype_name)
1873 blob->unregistered = FALSE;
1874 blob->gtype_name = write_string (union_->gtype_name, strings, data, offset2);
1875 blob->gtype_init = write_string (union_->gtype_init, strings, data, offset2);
1879 blob->unregistered = TRUE;
1880 blob->gtype_name = 0;
1881 blob->gtype_init = 0;
1885 blob->n_functions = 0;
1887 blob->discriminator_offset = union_->discriminator_offset;
1889 if (union_->discriminator_type)
1892 blob->discriminated = TRUE;
1893 g_ir_node_build_typelib ((GIrNode *)union_->discriminator_type,
1894 module, modules, strings, types,
1895 data, offset, offset2);
1900 blob->discriminated = FALSE;
1901 blob->discriminator_type.offset = 0;
1904 members = g_list_copy (union_->members);
1906 g_ir_node_build_members (&members, G_IR_NODE_FIELD, &blob->n_fields,
1907 module, modules, strings,
1908 types, data, offset, offset2);
1910 g_ir_node_build_members (&members, G_IR_NODE_FUNCTION, &blob->n_functions,
1911 module, modules, strings,
1912 types, data, offset, offset2);
1914 g_ir_node_check_unhandled_members (&members, node->type);
1916 g_assert (members == NULL);
1918 if (union_->discriminator_type)
1920 for (l = union_->discriminators; l; l = l->next)
1922 GIrNode *member = (GIrNode *)l->data;
1924 g_ir_node_build_typelib (member, module, modules, strings,
1925 types, data, offset, offset2);
1931 case G_IR_NODE_ENUM:
1932 case G_IR_NODE_FLAGS:
1934 EnumBlob *blob = (EnumBlob *)&data[*offset];
1935 GIrNodeEnum *enum_ = (GIrNodeEnum *)node;
1939 if (node->type == G_IR_NODE_ENUM)
1940 blob->blob_type = BLOB_TYPE_ENUM;
1942 blob->blob_type = BLOB_TYPE_FLAGS;
1944 blob->deprecated = enum_->deprecated;
1946 blob->name = write_string (node->name, strings, data, offset2);
1947 if (enum_->gtype_name)
1949 blob->unregistered = FALSE;
1950 blob->gtype_name = write_string (enum_->gtype_name, strings, data, offset2);
1951 blob->gtype_init = write_string (enum_->gtype_init, strings, data, offset2);
1955 blob->unregistered = TRUE;
1956 blob->gtype_name = 0;
1957 blob->gtype_init = 0;
1961 blob->reserved2 = 0;
1963 for (l = enum_->values; l; l = l->next)
1965 GIrNode *value = (GIrNode *)l->data;
1968 g_ir_node_build_typelib (value, module, modules, strings, types,
1969 data, offset, offset2);
1974 case G_IR_NODE_OBJECT:
1976 ObjectBlob *blob = (ObjectBlob *)&data[*offset];
1977 GIrNodeInterface *object = (GIrNodeInterface *)node;
1980 blob->blob_type = BLOB_TYPE_OBJECT;
1981 blob->abstract = object->abstract;
1982 blob->deprecated = object->deprecated;
1984 blob->name = write_string (node->name, strings, data, offset2);
1985 blob->gtype_name = write_string (object->gtype_name, strings, data, offset2);
1986 blob->gtype_init = write_string (object->gtype_init, strings, data, offset2);
1988 blob->parent = find_entry (module, modules, object->parent);
1992 blob->n_interfaces = 0;
1994 blob->n_properties = 0;
1995 blob->n_methods = 0;
1996 blob->n_signals = 0;
1998 blob->n_constants = 0;
2001 for (l = object->interfaces; l; l = l->next)
2003 blob->n_interfaces++;
2004 *(guint16*)&data[*offset] = find_entry (module, modules, (gchar *)l->data);
2008 members = g_list_copy (object->members);
2010 *offset = ALIGN_VALUE (*offset, 4);
2011 g_ir_node_build_members (&members, G_IR_NODE_FIELD, &blob->n_fields,
2012 module, modules, strings,
2013 types, data, offset, offset2);
2015 *offset = ALIGN_VALUE (*offset, 4);
2016 g_ir_node_build_members (&members, G_IR_NODE_PROPERTY, &blob->n_properties,
2017 module, modules, strings,
2018 types, data, offset, offset2);
2020 *offset = ALIGN_VALUE (*offset, 4);
2021 g_ir_node_build_members (&members, G_IR_NODE_FUNCTION, &blob->n_methods,
2022 module, modules, strings,
2023 types, data, offset, offset2);
2025 *offset = ALIGN_VALUE (*offset, 4);
2026 g_ir_node_build_members (&members, G_IR_NODE_SIGNAL, &blob->n_signals,
2027 module, modules, strings,
2028 types, data, offset, offset2);
2030 *offset = ALIGN_VALUE (*offset, 4);
2031 g_ir_node_build_members (&members, G_IR_NODE_VFUNC, &blob->n_vfuncs,
2032 module, modules, strings,
2033 types, data, offset, offset2);
2035 *offset = ALIGN_VALUE (*offset, 4);
2036 g_ir_node_build_members (&members, G_IR_NODE_CONSTANT, &blob->n_constants,
2037 module, modules, strings,
2038 types, data, offset, offset2);
2040 g_ir_node_check_unhandled_members (&members, node->type);
2042 g_assert (members == NULL);
2046 case G_IR_NODE_INTERFACE:
2048 InterfaceBlob *blob = (InterfaceBlob *)&data[*offset];
2049 GIrNodeInterface *iface = (GIrNodeInterface *)node;
2052 blob->blob_type = BLOB_TYPE_INTERFACE;
2053 blob->deprecated = iface->deprecated;
2055 blob->name = write_string (node->name, strings, data, offset2);
2056 blob->gtype_name = write_string (iface->gtype_name, strings, data, offset2);
2057 blob->gtype_init = write_string (iface->gtype_init, strings, data, offset2);
2058 blob->n_prerequisites = 0;
2059 blob->n_properties = 0;
2060 blob->n_methods = 0;
2061 blob->n_signals = 0;
2063 blob->n_constants = 0;
2066 for (l = iface->prerequisites; l; l = l->next)
2068 blob->n_prerequisites++;
2069 *(guint16*)&data[*offset] = find_entry (module, modules, (gchar *)l->data);
2073 members = g_list_copy (iface->members);
2075 *offset = ALIGN_VALUE (*offset, 4);
2076 g_ir_node_build_members (&members, G_IR_NODE_PROPERTY, &blob->n_properties,
2077 module, modules, strings,
2078 types, data, offset, offset2);
2080 *offset = ALIGN_VALUE (*offset, 4);
2081 g_ir_node_build_members (&members, G_IR_NODE_FUNCTION, &blob->n_methods,
2082 module, modules, strings,
2083 types, data, offset, offset2);
2085 *offset = ALIGN_VALUE (*offset, 4);
2086 g_ir_node_build_members (&members, G_IR_NODE_SIGNAL, &blob->n_signals,
2087 module, modules, strings,
2088 types, data, offset, offset2);
2090 *offset = ALIGN_VALUE (*offset, 4);
2091 g_ir_node_build_members (&members, G_IR_NODE_VFUNC, &blob->n_vfuncs,
2092 module, modules, strings,
2093 types, data, offset, offset2);
2095 *offset = ALIGN_VALUE (*offset, 4);
2096 g_ir_node_build_members (&members, G_IR_NODE_CONSTANT, &blob->n_constants,
2097 module, modules, strings,
2098 types, data, offset, offset2);
2100 g_ir_node_check_unhandled_members (&members, node->type);
2102 g_assert (members == NULL);
2107 case G_IR_NODE_VALUE:
2109 GIrNodeValue *value = (GIrNodeValue *)node;
2110 ValueBlob *blob = (ValueBlob *)&data[*offset];
2113 blob->deprecated = value->deprecated;
2115 blob->name = write_string (node->name, strings, data, offset2);
2116 blob->value = value->value;
2120 case G_IR_NODE_ERROR_DOMAIN:
2122 GIrNodeErrorDomain *domain = (GIrNodeErrorDomain *)node;
2123 ErrorDomainBlob *blob = (ErrorDomainBlob *)&data[*offset];
2126 blob->blob_type = BLOB_TYPE_ERROR_DOMAIN;
2127 blob->deprecated = domain->deprecated;
2129 blob->name = write_string (node->name, strings, data, offset2);
2130 blob->get_quark = write_string (domain->getquark, strings, data, offset2);
2131 blob->error_codes = find_entry (module, modules, domain->codes);
2132 blob->reserved2 = 0;
2136 case G_IR_NODE_CONSTANT:
2138 GIrNodeConstant *constant = (GIrNodeConstant *)node;
2139 ConstantBlob *blob = (ConstantBlob *)&data[*offset];
2145 blob->blob_type = BLOB_TYPE_CONSTANT;
2146 blob->deprecated = constant->deprecated;
2148 blob->name = write_string (node->name, strings, data, offset2);
2150 blob->offset = *offset2;
2151 switch (constant->type->tag)
2153 case GI_TYPE_TAG_BOOLEAN:
2155 *(gboolean*)&data[blob->offset] = parse_boolean_value (constant->value);
2157 case GI_TYPE_TAG_INT8:
2159 *(gint8*)&data[blob->offset] = (gint8) parse_int_value (constant->value);
2161 case GI_TYPE_TAG_UINT8:
2163 *(guint8*)&data[blob->offset] = (guint8) parse_uint_value (constant->value);
2165 case GI_TYPE_TAG_INT16:
2167 *(gint16*)&data[blob->offset] = (gint16) parse_int_value (constant->value);
2169 case GI_TYPE_TAG_UINT16:
2171 *(guint16*)&data[blob->offset] = (guint16) parse_uint_value (constant->value);
2173 case GI_TYPE_TAG_INT32:
2175 *(gint32*)&data[blob->offset] = (gint32) parse_int_value (constant->value);
2177 case GI_TYPE_TAG_UINT32:
2179 *(guint32*)&data[blob->offset] = (guint32) parse_uint_value (constant->value);
2181 case GI_TYPE_TAG_INT64:
2183 *(gint64*)&data[blob->offset] = (gint64) parse_int_value (constant->value);
2185 case GI_TYPE_TAG_UINT64:
2187 *(guint64*)&data[blob->offset] = (guint64) parse_uint_value (constant->value);
2189 case GI_TYPE_TAG_INT:
2190 blob->size = sizeof (gint);
2191 *(gint*)&data[blob->offset] = (gint) parse_int_value (constant->value);
2193 case GI_TYPE_TAG_UINT:
2194 blob->size = sizeof (guint);
2195 *(gint*)&data[blob->offset] = (guint) parse_uint_value (constant->value);
2197 case GI_TYPE_TAG_SSIZE: /* FIXME */
2198 case GI_TYPE_TAG_LONG:
2199 blob->size = sizeof (glong);
2200 *(glong*)&data[blob->offset] = (glong) parse_int_value (constant->value);
2202 case GI_TYPE_TAG_SIZE: /* FIXME */
2203 case GI_TYPE_TAG_TIME_T:
2204 case GI_TYPE_TAG_ULONG:
2205 blob->size = sizeof (gulong);
2206 *(gulong*)&data[blob->offset] = (gulong) parse_uint_value (constant->value);
2208 case GI_TYPE_TAG_FLOAT:
2209 blob->size = sizeof (gfloat);
2210 *(gfloat*)&data[blob->offset] = (gfloat) parse_float_value (constant->value);
2212 case GI_TYPE_TAG_DOUBLE:
2213 blob->size = sizeof (gdouble);
2214 *(gdouble*)&data[blob->offset] = (gdouble) parse_float_value (constant->value);
2216 case GI_TYPE_TAG_UTF8:
2217 case GI_TYPE_TAG_FILENAME:
2218 blob->size = strlen (constant->value) + 1;
2219 memcpy (&data[blob->offset], constant->value, blob->size);
2222 *offset2 += ALIGN_VALUE (blob->size, 4);
2224 g_ir_node_build_typelib ((GIrNode *)constant->type, module, modules,
2225 strings, types, data, &pos, offset2);
2229 g_assert_not_reached ();
2232 g_debug ("node %s%s%s%p type '%s', offset %d -> %d, offset2 %d -> %d",
2233 node->name ? "'" : "",
2234 node->name ? node->name : "",
2235 node->name ? "' " : "",
2236 node, g_ir_node_type_to_string (node->type),
2237 old_offset, *offset, old_offset2, *offset2);
2239 if (*offset2 - old_offset2 + *offset - old_offset > g_ir_node_get_full_size (node))
2240 g_error ("exceeding space reservation !!");
2243 /* if str is already in the pool, return previous location, otherwise write str
2244 * to the typelib at offset, put it in the pool and update offset. If the
2245 * typelib is not large enough to hold the string, reallocate it.
2248 write_string (const gchar *str,
2249 GHashTable *strings,
2257 string_size += strlen (str);
2259 value = g_hash_table_lookup (strings, str);
2262 return GPOINTER_TO_UINT (value);
2264 unique_string_count += 1;
2265 unique_string_size += strlen (str);
2267 g_hash_table_insert (strings, (gpointer)str, GUINT_TO_POINTER (*offset));
2270 *offset = ALIGN_VALUE (start + strlen (str) + 1, 4);
2272 strcpy ((gchar*)&data[start], str);