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;
40 unique_string_count = 0;
42 unique_string_size = 0;
44 unique_types_count = 0;
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 gi_type_tag_to_string (GITypeTag type)
112 case GI_TYPE_TAG_VOID:
114 case GI_TYPE_TAG_BOOLEAN:
116 case GI_TYPE_TAG_INT8:
118 case GI_TYPE_TAG_UINT8:
120 case GI_TYPE_TAG_INT16:
122 case GI_TYPE_TAG_UINT16:
124 case GI_TYPE_TAG_INT32:
126 case GI_TYPE_TAG_UINT32:
128 case GI_TYPE_TAG_INT64:
130 case GI_TYPE_TAG_UINT64:
132 case GI_TYPE_TAG_INT:
134 case GI_TYPE_TAG_UINT:
136 case GI_TYPE_TAG_LONG:
138 case GI_TYPE_TAG_ULONG:
140 case GI_TYPE_TAG_SSIZE:
142 case GI_TYPE_TAG_SIZE:
144 case GI_TYPE_TAG_FLOAT:
146 case GI_TYPE_TAG_DOUBLE:
148 case GI_TYPE_TAG_UTF8:
150 case GI_TYPE_TAG_FILENAME:
152 case GI_TYPE_TAG_ARRAY:
154 case GI_TYPE_TAG_INTERFACE:
156 case GI_TYPE_TAG_GLIST:
158 case GI_TYPE_TAG_GSLIST:
160 case GI_TYPE_TAG_GHASH:
162 case GI_TYPE_TAG_ERROR:
170 g_ir_node_new (GIrNodeTypeId type)
172 GIrNode *node = NULL;
176 case G_IR_NODE_FUNCTION:
177 case G_IR_NODE_CALLBACK:
178 node = g_malloc0 (sizeof (GIrNodeFunction));
181 case G_IR_NODE_PARAM:
182 node = g_malloc0 (sizeof (GIrNodeParam));
186 node = g_malloc0 (sizeof (GIrNodeType));
189 case G_IR_NODE_OBJECT:
190 case G_IR_NODE_INTERFACE:
191 node = g_malloc0 (sizeof (GIrNodeInterface));
194 case G_IR_NODE_SIGNAL:
195 node = g_malloc0 (sizeof (GIrNodeSignal));
198 case G_IR_NODE_PROPERTY:
199 node = g_malloc0 (sizeof (GIrNodeProperty));
202 case G_IR_NODE_VFUNC:
203 node = g_malloc0 (sizeof (GIrNodeFunction));
206 case G_IR_NODE_FIELD:
207 node = g_malloc0 (sizeof (GIrNodeField));
211 case G_IR_NODE_FLAGS:
212 node = g_malloc0 (sizeof (GIrNodeEnum));
215 case G_IR_NODE_BOXED:
216 node = g_malloc0 (sizeof (GIrNodeBoxed));
219 case G_IR_NODE_STRUCT:
220 node = g_malloc0 (sizeof (GIrNodeStruct));
223 case G_IR_NODE_VALUE:
224 node = g_malloc0 (sizeof (GIrNodeValue));
227 case G_IR_NODE_CONSTANT:
228 node = g_malloc0 (sizeof (GIrNodeConstant));
231 case G_IR_NODE_ERROR_DOMAIN:
232 node = g_malloc0 (sizeof (GIrNodeErrorDomain));
236 node = g_malloc0 (sizeof (GIrNodeXRef));
239 case G_IR_NODE_UNION:
240 node = g_malloc0 (sizeof (GIrNodeUnion));
244 g_error ("Unhandled node type %d\n", type);
254 g_ir_node_free (GIrNode *node)
263 case G_IR_NODE_FUNCTION:
264 case G_IR_NODE_CALLBACK:
266 GIrNodeFunction *function = (GIrNodeFunction *)node;
269 g_free (function->symbol);
270 g_ir_node_free ((GIrNode *)function->result);
271 for (l = function->parameters; l; l = l->next)
272 g_ir_node_free ((GIrNode *)l->data);
273 g_list_free (function->parameters);
279 GIrNodeType *type = (GIrNodeType *)node;
282 g_ir_node_free ((GIrNode *)type->parameter_type1);
283 g_ir_node_free ((GIrNode *)type->parameter_type2);
285 g_free (type->interface);
286 g_strfreev (type->errors);
291 case G_IR_NODE_PARAM:
293 GIrNodeParam *param = (GIrNodeParam *)node;
296 g_ir_node_free ((GIrNode *)param->type);
300 case G_IR_NODE_PROPERTY:
302 GIrNodeProperty *property = (GIrNodeProperty *)node;
305 g_ir_node_free ((GIrNode *)property->type);
309 case G_IR_NODE_SIGNAL:
311 GIrNodeSignal *signal = (GIrNodeSignal *)node;
314 for (l = signal->parameters; l; l = l->next)
315 g_ir_node_free ((GIrNode *)l->data);
316 g_list_free (signal->parameters);
317 g_ir_node_free ((GIrNode *)signal->result);
321 case G_IR_NODE_VFUNC:
323 GIrNodeVFunc *vfunc = (GIrNodeVFunc *)node;
326 for (l = vfunc->parameters; l; l = l->next)
327 g_ir_node_free ((GIrNode *)l->data);
328 g_list_free (vfunc->parameters);
329 g_ir_node_free ((GIrNode *)vfunc->result);
333 case G_IR_NODE_FIELD:
335 GIrNodeField *field = (GIrNodeField *)node;
338 g_ir_node_free ((GIrNode *)field->type);
342 case G_IR_NODE_OBJECT:
343 case G_IR_NODE_INTERFACE:
345 GIrNodeInterface *iface = (GIrNodeInterface *)node;
348 g_free (iface->gtype_name);
349 g_free (iface->gtype_init);
351 g_free (iface->parent);
353 for (l = iface->interfaces; l; l = l->next)
354 g_free ((GIrNode *)l->data);
355 g_list_free (iface->interfaces);
357 for (l = iface->members; l; l = l->next)
358 g_ir_node_free ((GIrNode *)l->data);
359 g_list_free (iface->members);
364 case G_IR_NODE_VALUE:
371 case G_IR_NODE_FLAGS:
373 GIrNodeEnum *enum_ = (GIrNodeEnum *)node;
376 g_free (enum_->gtype_name);
377 g_free (enum_->gtype_init);
379 for (l = enum_->values; l; l = l->next)
380 g_ir_node_free ((GIrNode *)l->data);
381 g_list_free (enum_->values);
385 case G_IR_NODE_BOXED:
387 GIrNodeBoxed *boxed = (GIrNodeBoxed *)node;
390 g_free (boxed->gtype_name);
391 g_free (boxed->gtype_init);
393 for (l = boxed->members; l; l = l->next)
394 g_ir_node_free ((GIrNode *)l->data);
395 g_list_free (boxed->members);
399 case G_IR_NODE_STRUCT:
401 GIrNodeStruct *struct_ = (GIrNodeStruct *)node;
404 for (l = struct_->members; l; l = l->next)
405 g_ir_node_free ((GIrNode *)l->data);
406 g_list_free (struct_->members);
410 case G_IR_NODE_CONSTANT:
412 GIrNodeConstant *constant = (GIrNodeConstant *)node;
415 g_free (constant->value);
416 g_ir_node_free ((GIrNode *)constant->type);
420 case G_IR_NODE_ERROR_DOMAIN:
422 GIrNodeErrorDomain *domain = (GIrNodeErrorDomain *)node;
425 g_free (domain->getquark);
426 g_free (domain->codes);
432 GIrNodeXRef *xref = (GIrNodeXRef *)node;
435 g_free (xref->namespace);
439 case G_IR_NODE_UNION:
441 GIrNodeUnion *union_ = (GIrNodeUnion *)node;
444 g_free (union_->gtype_name);
445 g_free (union_->gtype_init);
447 g_ir_node_free ((GIrNode *)union_->discriminator_type);
448 for (l = union_->members; l; l = l->next)
449 g_ir_node_free ((GIrNode *)l->data);
450 for (l = union_->discriminators; l; l = l->next)
451 g_ir_node_free ((GIrNode *)l->data);
456 g_error ("Unhandled node type %d\n", node->type);
463 /* returns the fixed size of the blob */
465 g_ir_node_get_size (GIrNode *node)
472 case G_IR_NODE_CALLBACK:
476 case G_IR_NODE_FUNCTION:
480 case G_IR_NODE_PARAM:
488 case G_IR_NODE_OBJECT:
490 GIrNodeInterface *iface = (GIrNodeInterface *)node;
492 n = g_list_length (iface->interfaces);
493 size = 32 + 2 * (n + (n % 2));
495 for (l = iface->members; l; l = l->next)
496 size += g_ir_node_get_size ((GIrNode *)l->data);
500 case G_IR_NODE_INTERFACE:
502 GIrNodeInterface *iface = (GIrNodeInterface *)node;
504 n = g_list_length (iface->prerequisites);
505 size = 28 + 2 * (n + (n % 2));
507 for (l = iface->members; l; l = l->next)
508 size += g_ir_node_get_size ((GIrNode *)l->data);
513 case G_IR_NODE_FLAGS:
515 GIrNodeEnum *enum_ = (GIrNodeEnum *)node;
518 for (l = enum_->values; l; l = l->next)
519 size += g_ir_node_get_size ((GIrNode *)l->data);
523 case G_IR_NODE_VALUE:
527 case G_IR_NODE_STRUCT:
529 GIrNodeStruct *struct_ = (GIrNodeStruct *)node;
532 for (l = struct_->members; l; l = l->next)
533 size += g_ir_node_get_size ((GIrNode *)l->data);
537 case G_IR_NODE_BOXED:
539 GIrNodeBoxed *boxed = (GIrNodeBoxed *)node;
542 for (l = boxed->members; l; l = l->next)
543 size += g_ir_node_get_size ((GIrNode *)l->data);
547 case G_IR_NODE_PROPERTY:
551 case G_IR_NODE_SIGNAL:
555 case G_IR_NODE_VFUNC:
559 case G_IR_NODE_FIELD:
563 case G_IR_NODE_CONSTANT:
567 case G_IR_NODE_ERROR_DOMAIN:
575 case G_IR_NODE_UNION:
577 GIrNodeUnion *union_ = (GIrNodeUnion *)node;
580 for (l = union_->members; l; l = l->next)
581 size += g_ir_node_get_size ((GIrNode *)l->data);
582 for (l = union_->discriminators; l; l = l->next)
583 size += g_ir_node_get_size ((GIrNode *)l->data);
588 g_error ("Unhandled node type '%s'\n",
589 g_ir_node_type_to_string (node->type));
593 g_debug ("node %p type '%s' size %d", node,
594 g_ir_node_type_to_string (node->type), size);
599 /* returns the full size of the blob including variable-size parts */
601 g_ir_node_get_full_size_internal (GIrNode *parent, GIrNode *node)
606 if (node == NULL && parent != NULL)
607 g_error ("Caught NULL node, parent=%s", parent->name);
609 g_debug ("node %p type '%s'", node,
610 g_ir_node_type_to_string (node->type));
614 case G_IR_NODE_CALLBACK:
616 GIrNodeFunction *function = (GIrNodeFunction *)node;
618 size += ALIGN_VALUE (strlen (node->name) + 1, 4);
619 for (l = function->parameters; l; l = l->next)
621 size += g_ir_node_get_full_size_internal (node, (GIrNode *)l->data);
623 size += g_ir_node_get_full_size_internal (node, (GIrNode *)function->result);
627 case G_IR_NODE_FUNCTION:
629 GIrNodeFunction *function = (GIrNodeFunction *)node;
631 size += ALIGN_VALUE (strlen (node->name) + 1, 4);
632 size += ALIGN_VALUE (strlen (function->symbol) + 1, 4);
633 for (l = function->parameters; l; l = l->next)
634 size += g_ir_node_get_full_size_internal (node, (GIrNode *)l->data);
635 size += g_ir_node_get_full_size_internal (node, (GIrNode *)function->result);
639 case G_IR_NODE_PARAM:
641 GIrNodeParam *param = (GIrNodeParam *)node;
645 size += ALIGN_VALUE (strlen (node->name) + 1, 4);
646 size += g_ir_node_get_full_size_internal (node, (GIrNode *)param->type);
652 GIrNodeType *type = (GIrNodeType *)node;
653 if (type->tag < GI_TYPE_TAG_ARRAY)
657 g_debug ("node %p type tag '%s'", node,
658 gi_type_tag_to_string (type->tag));
662 case GI_TYPE_TAG_ARRAY:
664 if (type->parameter_type1)
665 size += g_ir_node_get_full_size_internal (node, (GIrNode *)type->parameter_type1);
667 case GI_TYPE_TAG_INTERFACE:
670 case GI_TYPE_TAG_GLIST:
671 case GI_TYPE_TAG_GSLIST:
673 if (type->parameter_type1)
674 size += g_ir_node_get_full_size_internal (node, (GIrNode *)type->parameter_type1);
676 case GI_TYPE_TAG_GHASH:
678 if (type->parameter_type1)
679 size += g_ir_node_get_full_size_internal (node, (GIrNode *)type->parameter_type1);
680 if (type->parameter_type2)
681 size += g_ir_node_get_full_size_internal (node, (GIrNode *)type->parameter_type2);
683 case GI_TYPE_TAG_ERROR:
688 n = g_strv_length (type->errors);
692 size = 4 + 4 + 2 * (n + n % 2);
696 g_error ("Unknown type tag %d\n", type->tag);
703 case G_IR_NODE_OBJECT:
705 GIrNodeInterface *iface = (GIrNodeInterface *)node;
707 n = g_list_length (iface->interfaces);
710 size += ALIGN_VALUE (strlen (iface->parent) + 1, 4);
711 size += ALIGN_VALUE (strlen (node->name) + 1, 4);
712 size += ALIGN_VALUE (strlen (iface->gtype_name) + 1, 4);
713 size += ALIGN_VALUE (strlen (iface->gtype_init) + 1, 4);
714 size += 2 * (n + (n % 2));
716 for (l = iface->members; l; l = l->next)
717 size += g_ir_node_get_full_size_internal (node, (GIrNode *)l->data);
721 case G_IR_NODE_INTERFACE:
723 GIrNodeInterface *iface = (GIrNodeInterface *)node;
725 n = g_list_length (iface->prerequisites);
727 size += ALIGN_VALUE (strlen (node->name) + 1, 4);
728 size += ALIGN_VALUE (strlen (iface->gtype_name) + 1, 4);
729 size += ALIGN_VALUE (strlen (iface->gtype_init) + 1, 4);
730 size += 2 * (n + (n % 2));
732 for (l = iface->members; l; l = l->next)
733 size += g_ir_node_get_full_size_internal (node, (GIrNode *)l->data);
738 case G_IR_NODE_FLAGS:
740 GIrNodeEnum *enum_ = (GIrNodeEnum *)node;
743 size += ALIGN_VALUE (strlen (node->name) + 1, 4);
744 if (enum_->gtype_name)
746 size += ALIGN_VALUE (strlen (enum_->gtype_name) + 1, 4);
747 size += ALIGN_VALUE (strlen (enum_->gtype_init) + 1, 4);
750 for (l = enum_->values; l; l = l->next)
751 size += g_ir_node_get_full_size_internal (node, (GIrNode *)l->data);
755 case G_IR_NODE_VALUE:
758 size += ALIGN_VALUE (strlen (node->name) + 1, 4);
762 case G_IR_NODE_STRUCT:
764 GIrNodeStruct *struct_ = (GIrNodeStruct *)node;
767 size += ALIGN_VALUE (strlen (node->name) + 1, 4);
768 for (l = struct_->members; l; l = l->next)
769 size += g_ir_node_get_full_size_internal (node, (GIrNode *)l->data);
773 case G_IR_NODE_BOXED:
775 GIrNodeBoxed *boxed = (GIrNodeBoxed *)node;
778 size += ALIGN_VALUE (strlen (node->name) + 1, 4);
779 if (boxed->gtype_name)
781 size += ALIGN_VALUE (strlen (boxed->gtype_name) + 1, 4);
782 size += ALIGN_VALUE (strlen (boxed->gtype_init) + 1, 4);
784 for (l = boxed->members; l; l = l->next)
785 size += g_ir_node_get_full_size_internal (node, (GIrNode *)l->data);
789 case G_IR_NODE_PROPERTY:
791 GIrNodeProperty *prop = (GIrNodeProperty *)node;
794 size += ALIGN_VALUE (strlen (node->name) + 1, 4);
795 size += g_ir_node_get_full_size_internal (node, (GIrNode *)prop->type);
799 case G_IR_NODE_SIGNAL:
801 GIrNodeSignal *signal = (GIrNodeSignal *)node;
804 size += ALIGN_VALUE (strlen (node->name) + 1, 4);
805 for (l = signal->parameters; l; l = l->next)
806 size += g_ir_node_get_full_size_internal (node, (GIrNode *)l->data);
807 size += g_ir_node_get_full_size_internal (node, (GIrNode *)signal->result);
811 case G_IR_NODE_VFUNC:
813 GIrNodeVFunc *vfunc = (GIrNodeVFunc *)node;
816 size += ALIGN_VALUE (strlen (node->name) + 1, 4);
817 for (l = vfunc->parameters; l; l = l->next)
818 size += g_ir_node_get_full_size_internal (node, (GIrNode *)l->data);
819 size += g_ir_node_get_full_size_internal (node, (GIrNode *)vfunc->result);
823 case G_IR_NODE_FIELD:
825 GIrNodeField *field = (GIrNodeField *)node;
828 size += ALIGN_VALUE (strlen (node->name) + 1, 4);
829 size += g_ir_node_get_full_size_internal (node, (GIrNode *)field->type);
833 case G_IR_NODE_CONSTANT:
835 GIrNodeConstant *constant = (GIrNodeConstant *)node;
838 size += ALIGN_VALUE (strlen (node->name) + 1, 4);
839 /* FIXME non-string values */
840 size += ALIGN_VALUE (strlen (constant->value) + 1, 4);
841 size += g_ir_node_get_full_size_internal (node, (GIrNode *)constant->type);
845 case G_IR_NODE_ERROR_DOMAIN:
847 GIrNodeErrorDomain *domain = (GIrNodeErrorDomain *)node;
850 size += ALIGN_VALUE (strlen (node->name) + 1, 4);
851 size += ALIGN_VALUE (strlen (domain->getquark) + 1, 4);
857 GIrNodeXRef *xref = (GIrNodeXRef *)node;
860 size += ALIGN_VALUE (strlen (node->name) + 1, 4);
861 size += ALIGN_VALUE (strlen (xref->namespace) + 1, 4);
865 case G_IR_NODE_UNION:
867 GIrNodeUnion *union_ = (GIrNodeUnion *)node;
870 size += ALIGN_VALUE (strlen (node->name) + 1, 4);
871 for (l = union_->members; l; l = l->next)
872 size += g_ir_node_get_full_size_internal (node, (GIrNode *)l->data);
873 for (l = union_->discriminators; l; l = l->next)
874 size += g_ir_node_get_full_size_internal (node, (GIrNode *)l->data);
879 g_error ("Unknown type tag %d\n", node->type);
883 g_debug ("node %p type '%s' full size %d", node,
884 g_ir_node_type_to_string (node->type), size);
890 g_ir_node_get_full_size (GIrNode *node)
892 return g_ir_node_get_full_size_internal (NULL, node);
896 g_ir_node_cmp (GIrNode *node,
899 if (node->type < other->type)
901 else if (node->type > other->type)
904 return strcmp (node->name, other->name);
908 g_ir_node_can_have_member (GIrNode *node)
912 case G_IR_NODE_OBJECT:
913 case G_IR_NODE_INTERFACE:
914 case G_IR_NODE_BOXED:
915 case G_IR_NODE_STRUCT:
916 case G_IR_NODE_UNION:
923 g_ir_node_add_member (GIrNode *node,
924 GIrNodeFunction *member)
926 g_return_if_fail (node != NULL);
927 g_return_if_fail (member != NULL);
931 case G_IR_NODE_OBJECT:
932 case G_IR_NODE_INTERFACE:
934 GIrNodeInterface *iface = (GIrNodeInterface *)node;
936 g_list_insert_sorted (iface->members, member,
937 (GCompareFunc) g_ir_node_cmp);
940 case G_IR_NODE_BOXED:
942 GIrNodeBoxed *boxed = (GIrNodeBoxed *)node;
944 g_list_insert_sorted (boxed->members, member,
945 (GCompareFunc) g_ir_node_cmp);
948 case G_IR_NODE_STRUCT:
950 GIrNodeStruct *struct_ = (GIrNodeStruct *)node;
952 g_list_insert_sorted (struct_->members, member,
953 (GCompareFunc) g_ir_node_cmp);
956 case G_IR_NODE_UNION:
958 GIrNodeUnion *union_ = (GIrNodeUnion *)node;
960 g_list_insert_sorted (union_->members, member,
961 (GCompareFunc) g_ir_node_cmp);
965 g_error ("Cannot add a member to unknown type tag type %d\n",
972 g_ir_node_param_direction_string (GIrNodeParam * node)
985 parse_int_value (const gchar *str)
987 return strtoll (str, NULL, 0);
991 parse_uint_value (const gchar *str)
993 return strtoull (str, NULL, 0);
997 parse_float_value (const gchar *str)
999 return strtod (str, NULL);
1003 parse_boolean_value (const gchar *str)
1005 if (strcmp (str, "TRUE") == 0)
1008 if (strcmp (str, "FALSE") == 0)
1011 return parse_int_value (str) ? TRUE : FALSE;
1015 find_entry_node (GIrModule *module,
1025 GIrNode *result = NULL;
1027 names = g_strsplit (name, ".", 0);
1028 n_names = g_strv_length (names);
1030 g_error ("Too many name parts");
1032 for (l = module->entries, i = 1; l; l = l->next, i++)
1034 GIrNode *node = (GIrNode *)l->data;
1038 if (node->type != G_IR_NODE_XREF)
1041 if (((GIrNodeXRef *)node)->namespace == NULL ||
1042 strcmp (((GIrNodeXRef *)node)->namespace, names[0]) != 0)
1046 if (strcmp (node->name, names[n_names - 1]) == 0)
1058 GIrNode *node = g_ir_node_new (G_IR_NODE_XREF);
1060 ((GIrNodeXRef *)node)->namespace = g_strdup (names[0]);
1061 node->name = g_strdup (names[1]);
1063 module->entries = g_list_append (module->entries, node);
1066 *idx = g_list_length (module->entries);
1073 g_warning ("Entry '%s' not found", name);
1083 find_entry (GIrModule *module,
1089 find_entry_node (module, modules, name, &idx);
1095 serialize_type (GIrModule *module,
1101 const gchar* basic[] = {
1129 g_string_append_printf (str, "%s%s",
1130 basic[node->tag], node->is_pointer ? "*" : "");
1132 else if (node->tag == 20)
1134 serialize_type (module, modules, node->parameter_type1, str);
1135 g_string_append (str, "[");
1137 if (node->has_length)
1138 g_string_append_printf (str, "length=%d", node->length);
1140 if (node->zero_terminated)
1141 g_string_append_printf (str, "%szero-terminated=1",
1142 node->has_length ? "," : "");
1144 g_string_append (str, "]");
1146 else if (node->tag == 21)
1151 iface = find_entry_node (module, modules, node->interface, NULL);
1156 g_warning ("Interface for type reference %s not found", node->interface);
1157 name = node->interface;
1160 g_string_append_printf (str, "%s%s", name, node->is_pointer ? "*" : "");
1162 else if (node->tag == 22)
1164 g_string_append (str, "GList");
1165 if (node->parameter_type1)
1167 g_string_append (str, "<");
1168 serialize_type (module, modules, node->parameter_type1, str);
1169 g_string_append (str, ">");
1172 else if (node->tag == 23)
1174 g_string_append (str, "GSList");
1175 if (node->parameter_type1)
1177 g_string_append (str, "<");
1178 serialize_type (module, modules, node->parameter_type1, str);
1179 g_string_append (str, ">");
1182 else if (node->tag == 24)
1184 g_string_append (str, "GHashTable<");
1185 if (node->parameter_type1)
1187 g_string_append (str, "<");
1188 serialize_type (module, modules, node->parameter_type1, str);
1189 g_string_append (str, ",");
1190 serialize_type (module, modules, node->parameter_type2, str);
1191 g_string_append (str, ">");
1194 else if (node->tag == 25)
1196 g_string_append (str, "GError");
1199 g_string_append (str, "<");
1200 for (i = 0; node->errors[i]; i++)
1203 g_string_append (str, ",");
1204 g_string_append (str, node->errors[i]);
1206 g_string_append (str, ">");
1212 g_ir_node_build_typelib (GIrNode *node,
1215 GHashTable *strings,
1222 guint32 old_offset = *offset;
1223 guint32 old_offset2 = *offset2;
1225 g_assert (node != NULL);
1227 g_debug ("build_typelib: %s (%s)",
1229 g_ir_node_type_to_string (node->type));
1233 case G_IR_NODE_TYPE:
1235 GIrNodeType *type = (GIrNodeType *)node;
1236 SimpleTypeBlob *blob = (SimpleTypeBlob *)&data[*offset];
1240 if (type->tag < GI_TYPE_TAG_ARRAY ||
1241 type->tag == GI_TYPE_TAG_UTF8)
1244 blob->reserved2 = 0;
1245 blob->pointer = type->is_pointer;
1246 blob->reserved3 = 0;
1247 blob->tag = type->tag;
1255 str = g_string_new (0);
1256 serialize_type (module, modules, type, str);
1257 s = g_string_free (str, FALSE);
1260 value = g_hash_table_lookup (types, s);
1263 blob->offset = GPOINTER_TO_INT (value);
1268 unique_types_count += 1;
1269 g_hash_table_insert (types, s, GINT_TO_POINTER(*offset2));
1271 blob->offset = *offset2;
1274 case GI_TYPE_TAG_ARRAY:
1276 ArrayTypeBlob *array = (ArrayTypeBlob *)&data[*offset2];
1280 array->reserved = 0;
1281 array->tag = type->tag;
1282 array->zero_terminated = type->zero_terminated;
1283 array->has_length = type->has_length;
1284 array->reserved2 = 0;
1285 array->length = type->length;
1290 g_ir_node_build_typelib ((GIrNode *)type->parameter_type1,
1291 module, modules, strings, types,
1292 data, &pos, offset2);
1296 case GI_TYPE_TAG_INTERFACE:
1298 InterfaceTypeBlob *iface = (InterfaceTypeBlob *)&data[*offset2];
1301 iface->pointer = type->is_pointer;
1302 iface->reserved = 0;
1303 iface->tag = type->tag;
1304 iface->reserved2 = 0;
1305 iface->interface = find_entry (module, modules, type->interface);
1310 case GI_TYPE_TAG_GLIST:
1311 case GI_TYPE_TAG_GSLIST:
1313 ParamTypeBlob *param = (ParamTypeBlob *)&data[*offset2];
1317 param->reserved = 0;
1318 param->tag = type->tag;
1319 param->reserved2 = 0;
1325 g_ir_node_build_typelib ((GIrNode *)type->parameter_type1,
1326 module, modules, strings, types,
1327 data, &pos, offset2);
1331 case GI_TYPE_TAG_GHASH:
1333 ParamTypeBlob *param = (ParamTypeBlob *)&data[*offset2];
1337 param->reserved = 0;
1338 param->tag = type->tag;
1339 param->reserved2 = 0;
1345 g_ir_node_build_typelib ((GIrNode *)type->parameter_type1,
1346 module, modules, strings, types,
1347 data, &pos, offset2);
1348 g_ir_node_build_typelib ((GIrNode *)type->parameter_type2,
1349 module, modules, strings, types,
1350 data, &pos, offset2);
1354 case GI_TYPE_TAG_ERROR:
1356 ErrorTypeBlob *blob = (ErrorTypeBlob *)&data[*offset2];
1361 blob->tag = type->tag;
1362 blob->reserved2 = 0;
1364 blob->n_domains = g_strv_length (type->errors);
1366 blob->n_domains = 0;
1368 *offset2 = ALIGN_VALUE (*offset2 + 4 + 2 * blob->n_domains, 4);
1369 for (i = 0; i < blob->n_domains; i++)
1370 blob->domains[i] = find_entry (module, modules, type->errors[i]);
1375 g_error ("Unknown type tag %d\n", type->tag);
1383 case G_IR_NODE_FIELD:
1385 GIrNodeField *field = (GIrNodeField *)node;
1388 blob = (FieldBlob *)&data[*offset];
1391 blob->name = write_string (node->name, strings, data, offset2);
1392 blob->readable = field->readable;
1393 blob->writable = field->writable;
1396 blob->struct_offset = field->offset;
1398 g_ir_node_build_typelib ((GIrNode *)field->type,
1399 module, modules, strings, types,
1400 data, offset, offset2);
1404 case G_IR_NODE_PROPERTY:
1406 GIrNodeProperty *prop = (GIrNodeProperty *)node;
1407 PropertyBlob *blob = (PropertyBlob *)&data[*offset];
1410 blob->name = write_string (node->name, strings, data, offset2);
1411 blob->deprecated = prop->deprecated;
1412 blob->readable = prop->readable;
1413 blob->writable = prop->writable;
1414 blob->construct = prop->construct;
1415 blob->construct_only = prop->construct_only;
1418 g_ir_node_build_typelib ((GIrNode *)prop->type,
1419 module, modules, strings, types,
1420 data, offset, offset2);
1424 case G_IR_NODE_FUNCTION:
1426 FunctionBlob *blob = (FunctionBlob *)&data[*offset];
1427 SignatureBlob *blob2 = (SignatureBlob *)&data[*offset2];
1428 GIrNodeFunction *function = (GIrNodeFunction *)node;
1432 signature = *offset2;
1433 n = g_list_length (function->parameters);
1436 *offset2 += 8 + n * 12;
1438 blob->blob_type = BLOB_TYPE_FUNCTION;
1439 blob->deprecated = function->deprecated;
1440 blob->setter = function->is_setter;
1441 blob->getter = function->is_getter;
1442 blob->constructor = function->is_constructor;
1443 blob->wraps_vfunc = function->wraps_vfunc;
1446 blob->name = write_string (node->name, strings, data, offset2);
1447 blob->symbol = write_string (function->symbol, strings, data, offset2);
1448 blob->signature = signature;
1450 g_ir_node_build_typelib ((GIrNode *)function->result->type,
1451 module, modules, strings, types,
1452 data, &signature, offset2);
1454 blob2->may_return_null = function->result->null_ok;
1455 blob2->caller_owns_return_value = function->result->transfer;
1456 blob2->caller_owns_return_container = function->result->shallow_transfer;
1457 blob2->reserved = 0;
1458 blob2->n_arguments = n;
1462 for (l = function->parameters; l; l = l->next)
1464 GIrNode *param = (GIrNode *)l->data;
1466 g_ir_node_build_typelib (param,
1467 module, modules, strings, types,
1468 data, &signature, offset2);
1473 case G_IR_NODE_CALLBACK:
1475 CallbackBlob *blob = (CallbackBlob *)&data[*offset];
1476 SignatureBlob *blob2 = (SignatureBlob *)&data[*offset2];
1477 GIrNodeFunction *function = (GIrNodeFunction *)node;
1481 signature = *offset2;
1482 n = g_list_length (function->parameters);
1485 *offset2 += 8 + n * 12;
1487 blob->blob_type = BLOB_TYPE_CALLBACK;
1488 blob->deprecated = function->deprecated;
1490 blob->name = write_string (node->name, strings, data, offset2);
1491 blob->signature = signature;
1493 g_ir_node_build_typelib ((GIrNode *)function->result->type,
1494 module, modules, strings, types,
1495 data, &signature, offset2);
1497 blob2->may_return_null = function->result->null_ok;
1498 blob2->caller_owns_return_value = function->result->transfer;
1499 blob2->caller_owns_return_container = function->result->shallow_transfer;
1500 blob2->reserved = 0;
1501 blob2->n_arguments = n;
1505 for (l = function->parameters; l; l = l->next)
1507 GIrNode *param = (GIrNode *)l->data;
1509 g_ir_node_build_typelib (param,
1510 module, modules, strings, types,
1511 data, &signature, offset2);
1516 case G_IR_NODE_SIGNAL:
1518 SignalBlob *blob = (SignalBlob *)&data[*offset];
1519 SignatureBlob *blob2 = (SignatureBlob *)&data[*offset2];
1520 GIrNodeSignal *signal = (GIrNodeSignal *)node;
1524 signature = *offset2;
1525 n = g_list_length (signal->parameters);
1528 *offset2 += 8 + n * 12;
1530 blob->deprecated = signal->deprecated;
1531 blob->run_first = signal->run_first;
1532 blob->run_last = signal->run_last;
1533 blob->run_cleanup = signal->run_cleanup;
1534 blob->no_recurse = signal->no_recurse;
1535 blob->detailed = signal->detailed;
1536 blob->action = signal->action;
1537 blob->no_hooks = signal->no_hooks;
1538 blob->has_class_closure = 0; /* FIXME */
1539 blob->true_stops_emit = 0; /* FIXME */
1541 blob->class_closure = 0; /* FIXME */
1542 blob->name = write_string (node->name, strings, data, offset2);
1543 blob->signature = signature;
1545 g_ir_node_build_typelib ((GIrNode *)signal->result->type,
1546 module, modules, strings, types,
1547 data, &signature, offset2);
1549 blob2->may_return_null = signal->result->null_ok;
1550 blob2->caller_owns_return_value = signal->result->transfer;
1551 blob2->caller_owns_return_container = signal->result->shallow_transfer;
1552 blob2->reserved = 0;
1553 blob2->n_arguments = n;
1557 for (l = signal->parameters; l; l = l->next)
1559 GIrNode *param = (GIrNode *)l->data;
1561 g_ir_node_build_typelib (param, module, modules, strings, types,
1562 data, &signature, offset2);
1567 case G_IR_NODE_VFUNC:
1569 VFuncBlob *blob = (VFuncBlob *)&data[*offset];
1570 SignatureBlob *blob2 = (SignatureBlob *)&data[*offset2];
1571 GIrNodeVFunc *vfunc = (GIrNodeVFunc *)node;
1575 signature = *offset2;
1576 n = g_list_length (vfunc->parameters);
1579 *offset2 += 8 + n * 12;
1581 blob->name = write_string (node->name, strings, data, offset2);
1582 blob->must_chain_up = 0; /* FIXME */
1583 blob->must_be_implemented = 0; /* FIXME */
1584 blob->must_not_be_implemented = 0; /* FIXME */
1585 blob->class_closure = 0; /* FIXME */
1588 blob->struct_offset = vfunc->offset;
1589 blob->reserved2 = 0;
1590 blob->signature = signature;
1592 g_ir_node_build_typelib ((GIrNode *)vfunc->result->type,
1593 module, modules, strings, types,
1594 data, &signature, offset2);
1596 blob2->may_return_null = vfunc->result->null_ok;
1597 blob2->caller_owns_return_value = vfunc->result->transfer;
1598 blob2->caller_owns_return_container = vfunc->result->shallow_transfer;
1599 blob2->reserved = 0;
1600 blob2->n_arguments = n;
1604 for (l = vfunc->parameters; l; l = l->next)
1606 GIrNode *param = (GIrNode *)l->data;
1608 g_ir_node_build_typelib (param, module, modules, strings,
1609 types, data, &signature, offset2);
1614 case G_IR_NODE_PARAM:
1616 ArgBlob *blob = (ArgBlob *)&data[*offset];
1617 GIrNodeParam *param = (GIrNodeParam *)node;
1621 blob->name = write_string (node->name, strings, data, offset2);
1622 blob->in = param->in;
1623 blob->out = param->out;
1624 blob->dipper = param->dipper;
1625 blob->null_ok = param->null_ok;
1626 blob->optional = param->optional;
1627 blob->transfer_ownership = param->transfer;
1628 blob->transfer_container_ownership = param->shallow_transfer;
1629 blob->return_value = param->retval;
1632 g_ir_node_build_typelib ((GIrNode *)param->type, module, modules,
1633 strings, types, data, offset, offset2);
1637 case G_IR_NODE_STRUCT:
1639 StructBlob *blob = (StructBlob *)&data[*offset];
1640 GIrNodeStruct *struct_ = (GIrNodeStruct *)node;
1642 blob->blob_type = BLOB_TYPE_STRUCT;
1643 blob->deprecated = struct_->deprecated;
1644 blob->unregistered = TRUE;
1646 blob->name = write_string (node->name, strings, data, offset2);
1647 blob->gtype_name = 0;
1648 blob->gtype_init = 0;
1651 blob->n_methods = 0;
1654 for (l = struct_->members; l; l = l->next)
1656 GIrNode *member = (GIrNode *)l->data;
1658 if (member->type == G_IR_NODE_FIELD)
1661 g_ir_node_build_typelib (member, module, modules, strings,
1662 types, data, offset, offset2);
1666 for (l = struct_->members; l; l = l->next)
1668 GIrNode *member = (GIrNode *)l->data;
1670 if (member->type == G_IR_NODE_FUNCTION)
1673 g_ir_node_build_typelib (member, module, modules, strings,
1674 types, data, offset, offset2);
1680 case G_IR_NODE_BOXED:
1682 StructBlob *blob = (StructBlob *)&data[*offset];
1683 GIrNodeBoxed *boxed = (GIrNodeBoxed *)node;
1685 blob->blob_type = BLOB_TYPE_BOXED;
1686 blob->deprecated = boxed->deprecated;
1687 blob->unregistered = FALSE;
1689 blob->name = write_string (node->name, strings, data, offset2);
1690 blob->gtype_name = write_string (boxed->gtype_name, strings, data, offset2);
1691 blob->gtype_init = write_string (boxed->gtype_init, strings, data, offset2);
1694 blob->n_methods = 0;
1697 for (l = boxed->members; l; l = l->next)
1699 GIrNode *member = (GIrNode *)l->data;
1701 if (member->type == G_IR_NODE_FIELD)
1704 g_ir_node_build_typelib (member, module, modules, strings,
1705 types, data, offset, offset2);
1709 for (l = boxed->members; l; l = l->next)
1711 GIrNode *member = (GIrNode *)l->data;
1713 if (member->type == G_IR_NODE_FUNCTION)
1716 g_ir_node_build_typelib (member, module, modules, strings,
1717 types, data, offset, offset2);
1723 case G_IR_NODE_UNION:
1725 UnionBlob *blob = (UnionBlob *)&data[*offset];
1726 GIrNodeUnion *union_ = (GIrNodeUnion *)node;
1728 blob->blob_type = BLOB_TYPE_UNION;
1729 blob->deprecated = union_->deprecated;
1731 blob->name = write_string (node->name, strings, data, offset2);
1732 if (union_->gtype_name)
1734 blob->unregistered = FALSE;
1735 blob->gtype_name = write_string (union_->gtype_name, strings, data, offset2);
1736 blob->gtype_init = write_string (union_->gtype_init, strings, data, offset2);
1740 blob->unregistered = TRUE;
1741 blob->gtype_name = 0;
1742 blob->gtype_init = 0;
1746 blob->n_functions = 0;
1748 blob->discriminator_offset = union_->discriminator_offset;
1750 if (union_->discriminator_type)
1753 blob->discriminated = TRUE;
1754 g_ir_node_build_typelib ((GIrNode *)union_->discriminator_type,
1755 module, modules, strings, types,
1756 data, offset, offset2);
1761 blob->discriminated = FALSE;
1762 blob->discriminator_type.offset = 0;
1766 for (l = union_->members; l; l = l->next)
1768 GIrNode *member = (GIrNode *)l->data;
1770 if (member->type == G_IR_NODE_FIELD)
1773 g_ir_node_build_typelib (member, module, modules, strings,
1774 types, data, offset, offset2);
1778 for (l = union_->members; l; l = l->next)
1780 GIrNode *member = (GIrNode *)l->data;
1782 if (member->type == G_IR_NODE_FUNCTION)
1784 blob->n_functions++;
1785 g_ir_node_build_typelib (member, module, modules, strings,
1786 types, data, offset, offset2);
1790 if (union_->discriminator_type)
1792 for (l = union_->discriminators; l; l = l->next)
1794 GIrNode *member = (GIrNode *)l->data;
1796 g_ir_node_build_typelib (member, module, modules, strings,
1797 types, data, offset, offset2);
1803 case G_IR_NODE_ENUM:
1804 case G_IR_NODE_FLAGS:
1806 EnumBlob *blob = (EnumBlob *)&data[*offset];
1807 GIrNodeEnum *enum_ = (GIrNodeEnum *)node;
1811 if (node->type == G_IR_NODE_ENUM)
1812 blob->blob_type = BLOB_TYPE_ENUM;
1814 blob->blob_type = BLOB_TYPE_FLAGS;
1816 blob->deprecated = enum_->deprecated;
1818 blob->name = write_string (node->name, strings, data, offset2);
1819 if (enum_->gtype_name)
1821 blob->unregistered = FALSE;
1822 blob->gtype_name = write_string (enum_->gtype_name, strings, data, offset2);
1823 blob->gtype_init = write_string (enum_->gtype_init, strings, data, offset2);
1827 blob->unregistered = TRUE;
1828 blob->gtype_name = 0;
1829 blob->gtype_init = 0;
1833 blob->reserved2 = 0;
1835 for (l = enum_->values; l; l = l->next)
1837 GIrNode *value = (GIrNode *)l->data;
1840 g_ir_node_build_typelib (value, module, modules, strings, types,
1841 data, offset, offset2);
1846 case G_IR_NODE_OBJECT:
1848 ObjectBlob *blob = (ObjectBlob *)&data[*offset];
1849 GIrNodeInterface *object = (GIrNodeInterface *)node;
1851 blob->blob_type = BLOB_TYPE_OBJECT;
1852 blob->deprecated = object->deprecated;
1854 blob->name = write_string (node->name, strings, data, offset2);
1855 blob->gtype_name = write_string (object->gtype_name, strings, data, offset2);
1856 blob->gtype_init = write_string (object->gtype_init, strings, data, offset2);
1858 blob->parent = find_entry (module, modules, object->parent);
1862 blob->n_interfaces = 0;
1864 blob->n_properties = 0;
1865 blob->n_methods = 0;
1866 blob->n_signals = 0;
1868 blob->n_constants = 0;
1871 for (l = object->interfaces; l; l = l->next)
1873 blob->n_interfaces++;
1874 *(guint16*)&data[*offset] = find_entry (module, modules, (gchar *)l->data);
1878 *offset = ALIGN_VALUE (*offset, 4);
1879 for (l = object->members; l; l = l->next)
1881 GIrNode *member = (GIrNode *)l->data;
1883 if (member->type == G_IR_NODE_FIELD)
1886 g_ir_node_build_typelib (member, module, modules, strings,
1887 types, data, offset, offset2);
1891 *offset = ALIGN_VALUE (*offset, 4);
1892 for (l = object->members; l; l = l->next)
1894 GIrNode *member = (GIrNode *)l->data;
1896 if (member->type == G_IR_NODE_PROPERTY)
1898 blob->n_properties++;
1899 g_ir_node_build_typelib (member, module, modules, strings,
1900 types, data, offset, offset2);
1904 *offset = ALIGN_VALUE (*offset, 4);
1905 for (l = object->members; l; l = l->next)
1907 GIrNode *member = (GIrNode *)l->data;
1909 if (member->type == G_IR_NODE_FUNCTION)
1912 g_ir_node_build_typelib (member, module, modules, strings,
1913 types, data, offset, offset2);
1917 *offset = ALIGN_VALUE (*offset, 4);
1918 for (l = object->members; l; l = l->next)
1920 GIrNode *member = (GIrNode *)l->data;
1922 if (member->type == G_IR_NODE_SIGNAL)
1925 g_ir_node_build_typelib (member, module, modules, strings,
1926 types, data, offset, offset2);
1930 *offset = ALIGN_VALUE (*offset, 4);
1931 for (l = object->members; l; l = l->next)
1933 GIrNode *member = (GIrNode *)l->data;
1935 if (member->type == G_IR_NODE_VFUNC)
1938 g_ir_node_build_typelib (member, module, modules, strings,
1939 types, data, offset, offset2);
1943 *offset = ALIGN_VALUE (*offset, 4);
1944 for (l = object->members; l; l = l->next)
1946 GIrNode *member = (GIrNode *)l->data;
1948 if (member->type == G_IR_NODE_CONSTANT)
1950 blob->n_constants++;
1951 g_ir_node_build_typelib (member, module, modules, strings,
1952 types, data, offset, offset2);
1958 case G_IR_NODE_INTERFACE:
1960 InterfaceBlob *blob = (InterfaceBlob *)&data[*offset];
1961 GIrNodeInterface *iface = (GIrNodeInterface *)node;
1963 blob->blob_type = BLOB_TYPE_INTERFACE;
1964 blob->deprecated = iface->deprecated;
1966 blob->name = write_string (node->name, strings, data, offset2);
1967 blob->gtype_name = write_string (iface->gtype_name, strings, data, offset2);
1968 blob->gtype_init = write_string (iface->gtype_init, strings, data, offset2);
1969 blob->n_prerequisites = 0;
1970 blob->n_properties = 0;
1971 blob->n_methods = 0;
1972 blob->n_signals = 0;
1974 blob->n_constants = 0;
1977 for (l = iface->prerequisites; l; l = l->next)
1979 blob->n_prerequisites++;
1980 *(guint16*)&data[*offset] = find_entry (module, modules, (gchar *)l->data);
1984 *offset = ALIGN_VALUE (*offset, 4);
1985 for (l = iface->members; l; l = l->next)
1987 GIrNode *member = (GIrNode *)l->data;
1989 if (member->type == G_IR_NODE_PROPERTY)
1991 blob->n_properties++;
1992 g_ir_node_build_typelib (member, module, modules, strings,
1993 types, data, offset, offset2);
1997 *offset = ALIGN_VALUE (*offset, 4);
1998 for (l = iface->members; l; l = l->next)
2000 GIrNode *member = (GIrNode *)l->data;
2002 if (member->type == G_IR_NODE_FUNCTION)
2005 g_ir_node_build_typelib (member, module, modules, strings,
2006 types, data, offset, offset2);
2010 *offset = ALIGN_VALUE (*offset, 4);
2011 for (l = iface->members; l; l = l->next)
2013 GIrNode *member = (GIrNode *)l->data;
2015 if (member->type == G_IR_NODE_SIGNAL)
2018 g_ir_node_build_typelib (member, module, modules, strings,
2019 types, data, offset, offset2);
2023 *offset = ALIGN_VALUE (*offset, 4);
2024 for (l = iface->members; l; l = l->next)
2026 GIrNode *member = (GIrNode *)l->data;
2028 if (member->type == G_IR_NODE_VFUNC)
2031 g_ir_node_build_typelib (member, module, modules, strings,
2032 types, data, offset, offset2);
2036 *offset = ALIGN_VALUE (*offset, 4);
2037 for (l = iface->members; l; l = l->next)
2039 GIrNode *member = (GIrNode *)l->data;
2041 if (member->type == G_IR_NODE_CONSTANT)
2043 blob->n_constants++;
2044 g_ir_node_build_typelib (member, module, modules, strings,
2045 types, data, offset, offset2);
2052 case G_IR_NODE_VALUE:
2054 GIrNodeValue *value = (GIrNodeValue *)node;
2055 ValueBlob *blob = (ValueBlob *)&data[*offset];
2058 blob->deprecated = value->deprecated;
2060 blob->name = write_string (node->name, strings, data, offset2);
2061 blob->value = value->value;
2065 case G_IR_NODE_ERROR_DOMAIN:
2067 GIrNodeErrorDomain *domain = (GIrNodeErrorDomain *)node;
2068 ErrorDomainBlob *blob = (ErrorDomainBlob *)&data[*offset];
2071 blob->blob_type = BLOB_TYPE_ERROR_DOMAIN;
2072 blob->deprecated = domain->deprecated;
2074 blob->name = write_string (node->name, strings, data, offset2);
2075 blob->get_quark = write_string (domain->getquark, strings, data, offset2);
2076 blob->error_codes = find_entry (module, modules, domain->codes);
2077 blob->reserved2 = 0;
2081 case G_IR_NODE_CONSTANT:
2083 GIrNodeConstant *constant = (GIrNodeConstant *)node;
2084 ConstantBlob *blob = (ConstantBlob *)&data[*offset];
2090 blob->blob_type = BLOB_TYPE_CONSTANT;
2091 blob->deprecated = constant->deprecated;
2093 blob->name = write_string (node->name, strings, data, offset2);
2095 blob->offset = *offset2;
2096 switch (constant->type->tag)
2098 case GI_TYPE_TAG_BOOLEAN:
2100 *(gboolean*)&data[blob->offset] = parse_boolean_value (constant->value);
2102 case GI_TYPE_TAG_INT8:
2104 *(gint8*)&data[blob->offset] = (gint8) parse_int_value (constant->value);
2106 case GI_TYPE_TAG_UINT8:
2108 *(guint8*)&data[blob->offset] = (guint8) parse_uint_value (constant->value);
2110 case GI_TYPE_TAG_INT16:
2112 *(gint16*)&data[blob->offset] = (gint16) parse_int_value (constant->value);
2114 case GI_TYPE_TAG_UINT16:
2116 *(guint16*)&data[blob->offset] = (guint16) parse_uint_value (constant->value);
2118 case GI_TYPE_TAG_INT32:
2120 *(gint32*)&data[blob->offset] = (gint32) parse_int_value (constant->value);
2122 case GI_TYPE_TAG_UINT32:
2124 *(guint32*)&data[blob->offset] = (guint32) parse_uint_value (constant->value);
2126 case GI_TYPE_TAG_INT64:
2128 *(gint64*)&data[blob->offset] = (gint64) parse_int_value (constant->value);
2130 case GI_TYPE_TAG_UINT64:
2132 *(guint64*)&data[blob->offset] = (guint64) parse_uint_value (constant->value);
2134 case GI_TYPE_TAG_INT:
2135 blob->size = sizeof (gint);
2136 *(gint*)&data[blob->offset] = (gint) parse_int_value (constant->value);
2138 case GI_TYPE_TAG_UINT:
2139 blob->size = sizeof (guint);
2140 *(gint*)&data[blob->offset] = (guint) parse_uint_value (constant->value);
2142 case GI_TYPE_TAG_SSIZE: /* FIXME */
2143 case GI_TYPE_TAG_LONG:
2144 blob->size = sizeof (glong);
2145 *(glong*)&data[blob->offset] = (glong) parse_int_value (constant->value);
2147 case GI_TYPE_TAG_SIZE: /* FIXME */
2148 case GI_TYPE_TAG_ULONG:
2149 blob->size = sizeof (gulong);
2150 *(gulong*)&data[blob->offset] = (gulong) parse_uint_value (constant->value);
2152 case GI_TYPE_TAG_FLOAT:
2153 blob->size = sizeof (gfloat);
2154 *(gfloat*)&data[blob->offset] = (gfloat) parse_float_value (constant->value);
2156 case GI_TYPE_TAG_DOUBLE:
2157 blob->size = sizeof (gdouble);
2158 *(gdouble*)&data[blob->offset] = (gdouble) parse_float_value (constant->value);
2160 case GI_TYPE_TAG_UTF8:
2161 case GI_TYPE_TAG_FILENAME:
2162 blob->size = strlen (constant->value) + 1;
2163 memcpy (&data[blob->offset], constant->value, blob->size);
2166 *offset2 += ALIGN_VALUE (blob->size, 4);
2168 g_ir_node_build_typelib ((GIrNode *)constant->type, module, modules,
2169 strings, types, data, &pos, offset2);
2173 g_assert_not_reached ();
2176 g_debug ("node %p type '%s', offset %d -> %d, offset2 %d -> %d",
2177 node, g_ir_node_type_to_string (node->type),
2178 old_offset, *offset, old_offset2, *offset2);
2180 if (*offset2 - old_offset2 + *offset - old_offset > g_ir_node_get_full_size (node))
2181 g_error ("exceeding space reservation !!");
2184 /* if str is already in the pool, return previous location, otherwise write str
2185 * to the typelib at offset, put it in the pool and update offset. If the
2186 * typelib is not large enough to hold the string, reallocate it.
2189 write_string (const gchar *str,
2190 GHashTable *strings,
2198 string_size += strlen (str);
2200 value = g_hash_table_lookup (strings, str);
2203 return GPOINTER_TO_INT (value);
2205 unique_string_count += 1;
2206 unique_string_size += strlen (str);
2208 g_hash_table_insert (strings, (gpointer)str, GINT_TO_POINTER (*offset));
2211 *offset = ALIGN_VALUE (start + strlen (str) + 1, 4);
2213 strcpy ((gchar*)&data[start], str);