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->class_struct);
290 g_free (iface->parent);
292 for (l = iface->interfaces; l; l = l->next)
293 g_free ((GIrNode *)l->data);
294 g_list_free (iface->interfaces);
296 for (l = iface->members; l; l = l->next)
297 g_ir_node_free ((GIrNode *)l->data);
298 g_list_free (iface->members);
303 case G_IR_NODE_VALUE:
310 case G_IR_NODE_FLAGS:
312 GIrNodeEnum *enum_ = (GIrNodeEnum *)node;
315 g_free (enum_->gtype_name);
316 g_free (enum_->gtype_init);
318 for (l = enum_->values; l; l = l->next)
319 g_ir_node_free ((GIrNode *)l->data);
320 g_list_free (enum_->values);
324 case G_IR_NODE_BOXED:
326 GIrNodeBoxed *boxed = (GIrNodeBoxed *)node;
329 g_free (boxed->gtype_name);
330 g_free (boxed->gtype_init);
332 for (l = boxed->members; l; l = l->next)
333 g_ir_node_free ((GIrNode *)l->data);
334 g_list_free (boxed->members);
338 case G_IR_NODE_STRUCT:
340 GIrNodeStruct *struct_ = (GIrNodeStruct *)node;
343 g_free (struct_->gtype_name);
344 g_free (struct_->gtype_init);
346 for (l = struct_->members; l; l = l->next)
347 g_ir_node_free ((GIrNode *)l->data);
348 g_list_free (struct_->members);
352 case G_IR_NODE_CONSTANT:
354 GIrNodeConstant *constant = (GIrNodeConstant *)node;
357 g_free (constant->value);
358 g_ir_node_free ((GIrNode *)constant->type);
362 case G_IR_NODE_ERROR_DOMAIN:
364 GIrNodeErrorDomain *domain = (GIrNodeErrorDomain *)node;
367 g_free (domain->getquark);
368 g_free (domain->codes);
374 GIrNodeXRef *xref = (GIrNodeXRef *)node;
377 g_free (xref->namespace);
381 case G_IR_NODE_UNION:
383 GIrNodeUnion *union_ = (GIrNodeUnion *)node;
386 g_free (union_->gtype_name);
387 g_free (union_->gtype_init);
389 g_ir_node_free ((GIrNode *)union_->discriminator_type);
390 for (l = union_->members; l; l = l->next)
391 g_ir_node_free ((GIrNode *)l->data);
392 for (l = union_->discriminators; l; l = l->next)
393 g_ir_node_free ((GIrNode *)l->data);
398 g_error ("Unhandled node type %d\n", node->type);
405 /* returns the fixed size of the blob */
407 g_ir_node_get_size (GIrNode *node)
414 case G_IR_NODE_CALLBACK:
418 case G_IR_NODE_FUNCTION:
419 size = sizeof (FunctionBlob);
422 case G_IR_NODE_PARAM:
430 case G_IR_NODE_OBJECT:
432 GIrNodeInterface *iface = (GIrNodeInterface *)node;
434 n = g_list_length (iface->interfaces);
435 size = sizeof(ObjectBlob) + 2 * (n + (n % 2));
437 for (l = iface->members; l; l = l->next)
438 size += g_ir_node_get_size ((GIrNode *)l->data);
442 case G_IR_NODE_INTERFACE:
444 GIrNodeInterface *iface = (GIrNodeInterface *)node;
446 n = g_list_length (iface->prerequisites);
447 size = 28 + 2 * (n + (n % 2));
449 for (l = iface->members; l; l = l->next)
450 size += g_ir_node_get_size ((GIrNode *)l->data);
455 case G_IR_NODE_FLAGS:
457 GIrNodeEnum *enum_ = (GIrNodeEnum *)node;
460 for (l = enum_->values; l; l = l->next)
461 size += g_ir_node_get_size ((GIrNode *)l->data);
465 case G_IR_NODE_VALUE:
469 case G_IR_NODE_STRUCT:
471 GIrNodeStruct *struct_ = (GIrNodeStruct *)node;
474 for (l = struct_->members; l; l = l->next)
475 size += g_ir_node_get_size ((GIrNode *)l->data);
479 case G_IR_NODE_BOXED:
481 GIrNodeBoxed *boxed = (GIrNodeBoxed *)node;
484 for (l = boxed->members; l; l = l->next)
485 size += g_ir_node_get_size ((GIrNode *)l->data);
489 case G_IR_NODE_PROPERTY:
493 case G_IR_NODE_SIGNAL:
497 case G_IR_NODE_VFUNC:
501 case G_IR_NODE_FIELD:
505 case G_IR_NODE_CONSTANT:
509 case G_IR_NODE_ERROR_DOMAIN:
517 case G_IR_NODE_UNION:
519 GIrNodeUnion *union_ = (GIrNodeUnion *)node;
522 for (l = union_->members; l; l = l->next)
523 size += g_ir_node_get_size ((GIrNode *)l->data);
524 for (l = union_->discriminators; l; l = l->next)
525 size += g_ir_node_get_size ((GIrNode *)l->data);
530 g_error ("Unhandled node type '%s'\n",
531 g_ir_node_type_to_string (node->type));
535 g_debug ("node %p type '%s' size %d", node,
536 g_ir_node_type_to_string (node->type), size);
541 /* returns the full size of the blob including variable-size parts */
543 g_ir_node_get_full_size_internal (GIrNode *parent,
549 if (node == NULL && parent != NULL)
550 g_error ("Caught NULL node, parent=%s", parent->name);
552 g_debug ("node %p type '%s'", node,
553 g_ir_node_type_to_string (node->type));
557 case G_IR_NODE_CALLBACK:
559 GIrNodeFunction *function = (GIrNodeFunction *)node;
561 size += ALIGN_VALUE (strlen (node->name) + 1, 4);
562 for (l = function->parameters; l; l = l->next)
564 size += g_ir_node_get_full_size_internal (node, (GIrNode *)l->data);
566 size += g_ir_node_get_full_size_internal (node, (GIrNode *)function->result);
570 case G_IR_NODE_FUNCTION:
572 GIrNodeFunction *function = (GIrNodeFunction *)node;
574 size += ALIGN_VALUE (strlen (node->name) + 1, 4);
575 size += ALIGN_VALUE (strlen (function->symbol) + 1, 4);
576 for (l = function->parameters; l; l = l->next)
577 size += g_ir_node_get_full_size_internal (node, (GIrNode *)l->data);
578 size += g_ir_node_get_full_size_internal (node, (GIrNode *)function->result);
582 case G_IR_NODE_PARAM:
584 GIrNodeParam *param = (GIrNodeParam *)node;
588 size += ALIGN_VALUE (strlen (node->name) + 1, 4);
589 size += g_ir_node_get_full_size_internal (node, (GIrNode *)param->type);
595 GIrNodeType *type = (GIrNodeType *)node;
596 if (type->tag < GI_TYPE_TAG_ARRAY)
600 g_debug ("node %p type tag '%s'", node,
601 g_type_tag_to_string (type->tag));
605 case GI_TYPE_TAG_ARRAY:
607 if (type->parameter_type1)
608 size += g_ir_node_get_full_size_internal (node, (GIrNode *)type->parameter_type1);
610 case GI_TYPE_TAG_INTERFACE:
613 case GI_TYPE_TAG_GLIST:
614 case GI_TYPE_TAG_GSLIST:
616 if (type->parameter_type1)
617 size += g_ir_node_get_full_size_internal (node, (GIrNode *)type->parameter_type1);
619 case GI_TYPE_TAG_GHASH:
621 if (type->parameter_type1)
622 size += g_ir_node_get_full_size_internal (node, (GIrNode *)type->parameter_type1);
623 if (type->parameter_type2)
624 size += g_ir_node_get_full_size_internal (node, (GIrNode *)type->parameter_type2);
626 case GI_TYPE_TAG_ERROR:
631 n = g_strv_length (type->errors);
635 size = 4 + 4 + 2 * (n + n % 2);
639 g_error ("Unknown type tag %d\n", type->tag);
646 case G_IR_NODE_OBJECT:
648 GIrNodeInterface *iface = (GIrNodeInterface *)node;
650 n = g_list_length (iface->interfaces);
651 size = sizeof(ObjectBlob);
653 size += ALIGN_VALUE (strlen (iface->parent) + 1, 4);
654 if (iface->class_struct)
655 size += ALIGN_VALUE (strlen (iface->class_struct) + 1, 4);
656 size += ALIGN_VALUE (strlen (node->name) + 1, 4);
657 size += ALIGN_VALUE (strlen (iface->gtype_name) + 1, 4);
658 if (iface->gtype_init)
659 size += ALIGN_VALUE (strlen (iface->gtype_init) + 1, 4);
660 size += 2 * (n + (n % 2));
662 for (l = iface->members; l; l = l->next)
663 size += g_ir_node_get_full_size_internal (node, (GIrNode *)l->data);
667 case G_IR_NODE_INTERFACE:
669 GIrNodeInterface *iface = (GIrNodeInterface *)node;
671 n = g_list_length (iface->prerequisites);
673 size += ALIGN_VALUE (strlen (node->name) + 1, 4);
674 size += ALIGN_VALUE (strlen (iface->gtype_name) + 1, 4);
675 size += ALIGN_VALUE (strlen (iface->gtype_init) + 1, 4);
676 size += 2 * (n + (n % 2));
678 for (l = iface->members; l; l = l->next)
679 size += g_ir_node_get_full_size_internal (node, (GIrNode *)l->data);
684 case G_IR_NODE_FLAGS:
686 GIrNodeEnum *enum_ = (GIrNodeEnum *)node;
689 size += ALIGN_VALUE (strlen (node->name) + 1, 4);
690 if (enum_->gtype_name)
692 size += ALIGN_VALUE (strlen (enum_->gtype_name) + 1, 4);
693 size += ALIGN_VALUE (strlen (enum_->gtype_init) + 1, 4);
696 for (l = enum_->values; l; l = l->next)
697 size += g_ir_node_get_full_size_internal (node, (GIrNode *)l->data);
701 case G_IR_NODE_VALUE:
704 size += ALIGN_VALUE (strlen (node->name) + 1, 4);
708 case G_IR_NODE_STRUCT:
710 GIrNodeStruct *struct_ = (GIrNodeStruct *)node;
713 size += ALIGN_VALUE (strlen (node->name) + 1, 4);
714 if (struct_->gtype_name)
715 size += ALIGN_VALUE (strlen (struct_->gtype_name) + 1, 4);
716 if (struct_->gtype_init)
717 size += ALIGN_VALUE (strlen (struct_->gtype_init) + 1, 4);
718 for (l = struct_->members; l; l = l->next)
719 size += g_ir_node_get_full_size_internal (node, (GIrNode *)l->data);
723 case G_IR_NODE_BOXED:
725 GIrNodeBoxed *boxed = (GIrNodeBoxed *)node;
728 size += ALIGN_VALUE (strlen (node->name) + 1, 4);
729 if (boxed->gtype_name)
731 size += ALIGN_VALUE (strlen (boxed->gtype_name) + 1, 4);
732 size += ALIGN_VALUE (strlen (boxed->gtype_init) + 1, 4);
734 for (l = boxed->members; l; l = l->next)
735 size += g_ir_node_get_full_size_internal (node, (GIrNode *)l->data);
739 case G_IR_NODE_PROPERTY:
741 GIrNodeProperty *prop = (GIrNodeProperty *)node;
744 size += ALIGN_VALUE (strlen (node->name) + 1, 4);
745 size += g_ir_node_get_full_size_internal (node, (GIrNode *)prop->type);
749 case G_IR_NODE_SIGNAL:
751 GIrNodeSignal *signal = (GIrNodeSignal *)node;
754 size += ALIGN_VALUE (strlen (node->name) + 1, 4);
755 for (l = signal->parameters; l; l = l->next)
756 size += g_ir_node_get_full_size_internal (node, (GIrNode *)l->data);
757 size += g_ir_node_get_full_size_internal (node, (GIrNode *)signal->result);
761 case G_IR_NODE_VFUNC:
763 GIrNodeVFunc *vfunc = (GIrNodeVFunc *)node;
766 size += ALIGN_VALUE (strlen (node->name) + 1, 4);
767 for (l = vfunc->parameters; l; l = l->next)
768 size += g_ir_node_get_full_size_internal (node, (GIrNode *)l->data);
769 size += g_ir_node_get_full_size_internal (node, (GIrNode *)vfunc->result);
773 case G_IR_NODE_FIELD:
775 GIrNodeField *field = (GIrNodeField *)node;
778 size += ALIGN_VALUE (strlen (node->name) + 1, 4);
779 size += g_ir_node_get_full_size_internal (node, (GIrNode *)field->type);
783 case G_IR_NODE_CONSTANT:
785 GIrNodeConstant *constant = (GIrNodeConstant *)node;
788 size += ALIGN_VALUE (strlen (node->name) + 1, 4);
789 /* FIXME non-string values */
790 size += ALIGN_VALUE (strlen (constant->value) + 1, 4);
791 size += g_ir_node_get_full_size_internal (node, (GIrNode *)constant->type);
795 case G_IR_NODE_ERROR_DOMAIN:
797 GIrNodeErrorDomain *domain = (GIrNodeErrorDomain *)node;
800 size += ALIGN_VALUE (strlen (node->name) + 1, 4);
801 size += ALIGN_VALUE (strlen (domain->getquark) + 1, 4);
807 GIrNodeXRef *xref = (GIrNodeXRef *)node;
810 size += ALIGN_VALUE (strlen (node->name) + 1, 4);
811 size += ALIGN_VALUE (strlen (xref->namespace) + 1, 4);
815 case G_IR_NODE_UNION:
817 GIrNodeUnion *union_ = (GIrNodeUnion *)node;
820 size += ALIGN_VALUE (strlen (node->name) + 1, 4);
821 if (union_->gtype_name)
822 size += ALIGN_VALUE (strlen (union_->gtype_name) + 1, 4);
823 if (union_->gtype_init)
824 size += ALIGN_VALUE (strlen (union_->gtype_init) + 1, 4);
825 for (l = union_->members; l; l = l->next)
826 size += g_ir_node_get_full_size_internal (node, (GIrNode *)l->data);
827 for (l = union_->discriminators; l; l = l->next)
828 size += g_ir_node_get_full_size_internal (node, (GIrNode *)l->data);
833 g_error ("Unknown type tag %d\n", node->type);
837 g_debug ("node %s%s%s%p type '%s' full size %d",
838 node->name ? "'" : "",
839 node->name ? node->name : "",
840 node->name ? "' " : "",
841 node, g_ir_node_type_to_string (node->type), size);
847 g_ir_node_get_full_size (GIrNode *node)
849 return g_ir_node_get_full_size_internal (NULL, node);
853 g_ir_node_cmp (GIrNode *node,
856 if (node->type < other->type)
858 else if (node->type > other->type)
861 return strcmp (node->name, other->name);
865 g_ir_node_can_have_member (GIrNode *node)
869 case G_IR_NODE_OBJECT:
870 case G_IR_NODE_INTERFACE:
871 case G_IR_NODE_BOXED:
872 case G_IR_NODE_STRUCT:
873 case G_IR_NODE_UNION:
875 /* list others individually rather than with default: so that compiler
876 * warns if new node types are added without adding them to the switch
878 case G_IR_NODE_INVALID:
879 case G_IR_NODE_FUNCTION:
880 case G_IR_NODE_CALLBACK:
882 case G_IR_NODE_FLAGS:
883 case G_IR_NODE_CONSTANT:
884 case G_IR_NODE_ERROR_DOMAIN:
885 case G_IR_NODE_PARAM:
887 case G_IR_NODE_PROPERTY:
888 case G_IR_NODE_SIGNAL:
889 case G_IR_NODE_VALUE:
890 case G_IR_NODE_VFUNC:
891 case G_IR_NODE_FIELD:
899 g_ir_node_add_member (GIrNode *node,
900 GIrNodeFunction *member)
902 g_return_if_fail (node != NULL);
903 g_return_if_fail (member != NULL);
907 case G_IR_NODE_OBJECT:
908 case G_IR_NODE_INTERFACE:
910 GIrNodeInterface *iface = (GIrNodeInterface *)node;
912 g_list_insert_sorted (iface->members, member,
913 (GCompareFunc) g_ir_node_cmp);
916 case G_IR_NODE_BOXED:
918 GIrNodeBoxed *boxed = (GIrNodeBoxed *)node;
920 g_list_insert_sorted (boxed->members, member,
921 (GCompareFunc) g_ir_node_cmp);
924 case G_IR_NODE_STRUCT:
926 GIrNodeStruct *struct_ = (GIrNodeStruct *)node;
928 g_list_insert_sorted (struct_->members, member,
929 (GCompareFunc) g_ir_node_cmp);
932 case G_IR_NODE_UNION:
934 GIrNodeUnion *union_ = (GIrNodeUnion *)node;
936 g_list_insert_sorted (union_->members, member,
937 (GCompareFunc) g_ir_node_cmp);
941 g_error ("Cannot add a member to unknown type tag type %d\n",
948 g_ir_node_param_direction_string (GIrNodeParam * node)
961 parse_int_value (const gchar *str)
963 return strtoll (str, NULL, 0);
967 parse_uint_value (const gchar *str)
969 return strtoull (str, NULL, 0);
973 parse_float_value (const gchar *str)
975 return strtod (str, NULL);
979 parse_boolean_value (const gchar *str)
981 if (strcmp (str, "TRUE") == 0)
984 if (strcmp (str, "FALSE") == 0)
987 return parse_int_value (str) ? TRUE : FALSE;
991 find_entry_node (GIrModule *module,
1001 GIrNode *result = NULL;
1003 g_assert (name != NULL);
1004 g_assert (strlen (name) > 0);
1006 names = g_strsplit (name, ".", 0);
1007 n_names = g_strv_length (names);
1009 g_error ("Too many name parts");
1011 for (l = module->entries, i = 1; l; l = l->next, i++)
1013 GIrNode *node = (GIrNode *)l->data;
1017 if (node->type != G_IR_NODE_XREF)
1020 if (((GIrNodeXRef *)node)->namespace == NULL ||
1021 strcmp (((GIrNodeXRef *)node)->namespace, names[0]) != 0)
1025 if (strcmp (node->name, names[n_names - 1]) == 0)
1037 GIrNode *node = g_ir_node_new (G_IR_NODE_XREF);
1039 ((GIrNodeXRef *)node)->namespace = g_strdup (names[0]);
1040 node->name = g_strdup (names[1]);
1042 module->entries = g_list_append (module->entries, node);
1045 *idx = g_list_length (module->entries);
1049 g_debug ("Creating XREF: %s %s", names[0], names[1]);
1054 g_warning ("Entry '%s' not found", name);
1064 find_entry (GIrModule *module,
1070 find_entry_node (module, modules, name, &idx);
1076 find_name_in_module (GIrModule *module,
1081 for (l = module->entries; l; l = l->next)
1083 GIrNode *node = (GIrNode *)l->data;
1085 if (strcmp (node->name, name) == 0)
1093 g_ir_find_node (GIrModule *module,
1097 GIrModule **module_out)
1099 char **names = g_strsplit (name, ".", 0);
1100 gint n_names = g_strv_length (names);
1101 GIrNode *node = NULL;
1106 g_warning ("Name can't be empty");
1112 g_warning ("Too many name parts in '%s'", name);
1118 *module_out = module;
1119 node = find_name_in_module (module, names[0]);
1121 else if (strcmp (names[0], module->name) == 0)
1123 *module_out = module;
1124 node = find_name_in_module (module, names[1]);
1128 for (l = module->include_modules; l; l = l->next)
1130 GIrModule *m = l->data;
1132 if (strcmp (names[0], m->name) == 0)
1135 node = find_name_in_module (m, names[1]);
1140 for (l = modules; l; l = l->next)
1142 GIrModule *m = l->data;
1144 if (strcmp (names[0], m->name) == 0)
1147 node = find_name_in_module (m, names[1]);
1158 return node != NULL;
1162 serialize_type (GIrModule *module,
1168 const gchar* basic[] = {
1194 if (node->tag < GI_TYPE_TAG_ARRAY)
1196 g_string_append_printf (str, "%s%s", basic[node->tag],
1197 node->is_pointer ? "*" : "");
1199 else if (node->tag == GI_TYPE_TAG_ARRAY)
1201 serialize_type (module, modules, node->parameter_type1, str);
1202 g_string_append (str, "[");
1204 if (node->has_length)
1205 g_string_append_printf (str, "length=%d", node->length);
1206 else if (node->has_size)
1207 g_string_append_printf (str, "fixed-size=%d", node->size);
1209 if (node->zero_terminated)
1210 g_string_append_printf (str, "%szero-terminated=1",
1211 node->has_length ? "," : "");
1213 g_string_append (str, "]");
1215 else if (node->tag == GI_TYPE_TAG_INTERFACE)
1220 iface = find_entry_node (module, modules, node->interface, NULL);
1223 if (iface->type == G_IR_NODE_XREF)
1224 g_string_append_printf (str, "%s.", ((GIrNodeXRef *)iface)->namespace);
1229 g_warning ("Interface for type reference %s not found", node->interface);
1230 name = node->interface;
1233 g_string_append_printf (str, "%s%s", name,
1234 node->is_pointer ? "*" : "");
1236 else if (node->tag == GI_TYPE_TAG_GLIST)
1238 g_string_append (str, "GList");
1239 if (node->parameter_type1)
1241 g_string_append (str, "<");
1242 serialize_type (module, modules, node->parameter_type1, str);
1243 g_string_append (str, ">");
1246 else if (node->tag == GI_TYPE_TAG_GSLIST)
1248 g_string_append (str, "GSList");
1249 if (node->parameter_type1)
1251 g_string_append (str, "<");
1252 serialize_type (module, modules, node->parameter_type1, str);
1253 g_string_append (str, ">");
1256 else if (node->tag == GI_TYPE_TAG_GHASH)
1258 g_string_append (str, "GHashTable<");
1259 if (node->parameter_type1)
1261 g_string_append (str, "<");
1262 serialize_type (module, modules, node->parameter_type1, str);
1263 g_string_append (str, ",");
1264 serialize_type (module, modules, node->parameter_type2, str);
1265 g_string_append (str, ">");
1268 else if (node->tag == GI_TYPE_TAG_ERROR)
1270 g_string_append (str, "GError");
1273 g_string_append (str, "<");
1274 for (i = 0; node->errors[i]; i++)
1277 g_string_append (str, ",");
1278 g_string_append (str, node->errors[i]);
1280 g_string_append (str, ">");
1286 g_ir_node_build_members (GList **members,
1291 GHashTable *strings,
1297 GList *l = *members;
1301 GIrNode *member = (GIrNode *)l->data;
1302 GList *next = l->next;
1304 if (member->type == type)
1307 g_ir_node_build_typelib (member, module, modules, strings,
1308 types, data, offset, offset2);
1309 *members = g_list_delete_link (*members, l);
1316 g_ir_node_check_unhandled_members (GList **members,
1317 GIrNodeTypeId container_type)
1324 for (l = *members; l; l = l->next)
1326 GIrNode *member = (GIrNode *)l->data;
1327 g_printerr ("Unhandled '%s' member '%s' type '%s'\n",
1328 g_ir_node_type_to_string (container_type),
1330 g_ir_node_type_to_string (member->type));
1333 g_list_free (*members);
1336 g_error ("Unhandled members. Aborting.");
1339 g_list_free (*members);
1345 g_ir_node_build_typelib (GIrNode *node,
1348 GHashTable *strings,
1355 guint32 old_offset = *offset;
1356 guint32 old_offset2 = *offset2;
1358 g_assert (node != NULL);
1360 g_debug ("build_typelib: %s%s(%s)",
1361 node->name ? node->name : "",
1362 node->name ? " " : "",
1363 g_ir_node_type_to_string (node->type));
1365 g_ir_node_compute_offsets (node, module, modules);
1369 case G_IR_NODE_TYPE:
1371 GIrNodeType *type = (GIrNodeType *)node;
1372 SimpleTypeBlob *blob = (SimpleTypeBlob *)&data[*offset];
1376 if (type->tag < GI_TYPE_TAG_ARRAY ||
1377 type->tag == GI_TYPE_TAG_UTF8 ||
1378 type->tag == GI_TYPE_TAG_FILENAME)
1381 blob->reserved2 = 0;
1382 blob->pointer = type->is_pointer;
1383 blob->reserved3 = 0;
1384 blob->tag = type->tag;
1392 str = g_string_new (0);
1393 serialize_type (module, modules, type, str);
1394 s = g_string_free (str, FALSE);
1397 value = g_hash_table_lookup (types, s);
1400 blob->offset = GPOINTER_TO_UINT (value);
1405 unique_types_count += 1;
1406 g_hash_table_insert (types, s, GUINT_TO_POINTER(*offset2));
1408 blob->offset = *offset2;
1411 case GI_TYPE_TAG_ARRAY:
1413 ArrayTypeBlob *array = (ArrayTypeBlob *)&data[*offset2];
1417 array->reserved = 0;
1418 array->tag = type->tag;
1419 array->zero_terminated = type->zero_terminated;
1420 array->has_length = type->has_length;
1421 array->has_size = type->has_size;
1422 array->reserved2 = 0;
1423 if (array->has_length)
1424 array->length = type->length;
1425 else if (array->has_size)
1426 array->size = type->size;
1433 g_ir_node_build_typelib ((GIrNode *)type->parameter_type1,
1434 module, modules, strings, types,
1435 data, &pos, offset2);
1439 case GI_TYPE_TAG_INTERFACE:
1441 InterfaceTypeBlob *iface = (InterfaceTypeBlob *)&data[*offset2];
1444 iface->pointer = type->is_pointer;
1445 iface->reserved = 0;
1446 iface->tag = type->tag;
1447 iface->reserved2 = 0;
1448 iface->interface = find_entry (module, modules, type->interface);
1453 case GI_TYPE_TAG_GLIST:
1454 case GI_TYPE_TAG_GSLIST:
1456 ParamTypeBlob *param = (ParamTypeBlob *)&data[*offset2];
1460 param->reserved = 0;
1461 param->tag = type->tag;
1462 param->reserved2 = 0;
1468 g_ir_node_build_typelib ((GIrNode *)type->parameter_type1,
1469 module, modules, strings, types,
1470 data, &pos, offset2);
1474 case GI_TYPE_TAG_GHASH:
1476 ParamTypeBlob *param = (ParamTypeBlob *)&data[*offset2];
1480 param->reserved = 0;
1481 param->tag = type->tag;
1482 param->reserved2 = 0;
1488 g_ir_node_build_typelib ((GIrNode *)type->parameter_type1,
1489 module, modules, strings, types,
1490 data, &pos, offset2);
1491 g_ir_node_build_typelib ((GIrNode *)type->parameter_type2,
1492 module, modules, strings, types,
1493 data, &pos, offset2);
1497 case GI_TYPE_TAG_ERROR:
1499 ErrorTypeBlob *blob = (ErrorTypeBlob *)&data[*offset2];
1504 blob->tag = type->tag;
1505 blob->reserved2 = 0;
1507 blob->n_domains = g_strv_length (type->errors);
1509 blob->n_domains = 0;
1511 *offset2 = ALIGN_VALUE (*offset2 + 4 + 2 * blob->n_domains, 4);
1512 for (i = 0; i < blob->n_domains; i++)
1513 blob->domains[i] = find_entry (module, modules, type->errors[i]);
1518 g_error ("Unknown type tag %d\n", type->tag);
1526 case G_IR_NODE_FIELD:
1528 GIrNodeField *field = (GIrNodeField *)node;
1531 blob = (FieldBlob *)&data[*offset];
1534 blob->name = write_string (node->name, strings, data, offset2);
1535 blob->readable = field->readable;
1536 blob->writable = field->writable;
1539 if (field->offset >= 0)
1540 blob->struct_offset = field->offset;
1542 blob->struct_offset = 0xFFFF; /* mark as unknown */
1544 g_ir_node_build_typelib ((GIrNode *)field->type,
1545 module, modules, strings, types,
1546 data, offset, offset2);
1550 case G_IR_NODE_PROPERTY:
1552 GIrNodeProperty *prop = (GIrNodeProperty *)node;
1553 PropertyBlob *blob = (PropertyBlob *)&data[*offset];
1556 blob->name = write_string (node->name, strings, data, offset2);
1557 blob->deprecated = prop->deprecated;
1558 blob->readable = prop->readable;
1559 blob->writable = prop->writable;
1560 blob->construct = prop->construct;
1561 blob->construct_only = prop->construct_only;
1564 g_ir_node_build_typelib ((GIrNode *)prop->type,
1565 module, modules, strings, types,
1566 data, offset, offset2);
1570 case G_IR_NODE_FUNCTION:
1572 FunctionBlob *blob = (FunctionBlob *)&data[*offset];
1573 SignatureBlob *blob2 = (SignatureBlob *)&data[*offset2];
1574 GIrNodeFunction *function = (GIrNodeFunction *)node;
1578 signature = *offset2;
1579 n = g_list_length (function->parameters);
1581 *offset += sizeof(FunctionBlob);
1582 *offset2 += sizeof(SignatureBlob) + n * sizeof(ArgBlob);
1584 blob->blob_type = BLOB_TYPE_FUNCTION;
1585 blob->deprecated = function->deprecated;
1586 blob->is_static = !function->is_method;
1587 blob->setter = function->is_setter;
1588 blob->getter = function->is_getter;
1589 blob->constructor = function->is_constructor;
1590 blob->wraps_vfunc = function->wraps_vfunc;
1591 blob->throws = function->throws;
1593 blob->name = write_string (node->name, strings, data, offset2);
1594 blob->symbol = write_string (function->symbol, strings, data, offset2);
1595 blob->signature = signature;
1597 g_debug ("building function '%s'", function->symbol);
1599 g_ir_node_build_typelib ((GIrNode *)function->result->type,
1600 module, modules, strings, types,
1601 data, &signature, offset2);
1603 blob2->may_return_null = function->result->allow_none;
1604 blob2->caller_owns_return_value = function->result->transfer;
1605 blob2->caller_owns_return_container = function->result->shallow_transfer;
1606 blob2->reserved = 0;
1607 blob2->n_arguments = n;
1611 for (l = function->parameters; l; l = l->next)
1613 GIrNode *param = (GIrNode *)l->data;
1615 g_ir_node_build_typelib (param,
1616 module, modules, strings, types,
1617 data, &signature, offset2);
1623 case G_IR_NODE_CALLBACK:
1625 CallbackBlob *blob = (CallbackBlob *)&data[*offset];
1626 SignatureBlob *blob2 = (SignatureBlob *)&data[*offset2];
1627 GIrNodeFunction *function = (GIrNodeFunction *)node;
1631 signature = *offset2;
1632 n = g_list_length (function->parameters);
1634 *offset += sizeof(CallbackBlob);
1635 *offset2 += sizeof(SignatureBlob) + n * sizeof(ArgBlob);
1637 blob->blob_type = BLOB_TYPE_CALLBACK;
1638 blob->deprecated = function->deprecated;
1640 blob->name = write_string (node->name, strings, data, offset2);
1641 blob->signature = signature;
1643 g_ir_node_build_typelib ((GIrNode *)function->result->type,
1644 module, modules, strings, types,
1645 data, &signature, offset2);
1647 blob2->may_return_null = function->result->allow_none;
1648 blob2->caller_owns_return_value = function->result->transfer;
1649 blob2->caller_owns_return_container = function->result->shallow_transfer;
1650 blob2->reserved = 0;
1651 blob2->n_arguments = n;
1655 for (l = function->parameters; l; l = l->next)
1657 GIrNode *param = (GIrNode *)l->data;
1659 g_ir_node_build_typelib (param,
1660 module, modules, strings, types,
1661 data, &signature, offset2);
1666 case G_IR_NODE_SIGNAL:
1668 SignalBlob *blob = (SignalBlob *)&data[*offset];
1669 SignatureBlob *blob2 = (SignatureBlob *)&data[*offset2];
1670 GIrNodeSignal *signal = (GIrNodeSignal *)node;
1674 signature = *offset2;
1675 n = g_list_length (signal->parameters);
1677 *offset += sizeof(SignalBlob);
1678 *offset2 += sizeof(SignatureBlob) + n * sizeof(ArgBlob);
1680 blob->deprecated = signal->deprecated;
1681 blob->run_first = signal->run_first;
1682 blob->run_last = signal->run_last;
1683 blob->run_cleanup = signal->run_cleanup;
1684 blob->no_recurse = signal->no_recurse;
1685 blob->detailed = signal->detailed;
1686 blob->action = signal->action;
1687 blob->no_hooks = signal->no_hooks;
1688 blob->has_class_closure = 0; /* FIXME */
1689 blob->true_stops_emit = 0; /* FIXME */
1691 blob->class_closure = 0; /* FIXME */
1692 blob->name = write_string (node->name, strings, data, offset2);
1693 blob->signature = signature;
1695 g_ir_node_build_typelib ((GIrNode *)signal->result->type,
1696 module, modules, strings, types,
1697 data, &signature, offset2);
1699 blob2->may_return_null = signal->result->allow_none;
1700 blob2->caller_owns_return_value = signal->result->transfer;
1701 blob2->caller_owns_return_container = signal->result->shallow_transfer;
1702 blob2->reserved = 0;
1703 blob2->n_arguments = n;
1707 for (l = signal->parameters; l; l = l->next)
1709 GIrNode *param = (GIrNode *)l->data;
1711 g_ir_node_build_typelib (param, module, modules, strings, types,
1712 data, &signature, offset2);
1717 case G_IR_NODE_VFUNC:
1719 VFuncBlob *blob = (VFuncBlob *)&data[*offset];
1720 SignatureBlob *blob2 = (SignatureBlob *)&data[*offset2];
1721 GIrNodeVFunc *vfunc = (GIrNodeVFunc *)node;
1725 signature = *offset2;
1726 n = g_list_length (vfunc->parameters);
1728 *offset += sizeof(VFuncBlob);
1729 *offset2 += sizeof(SignatureBlob) + n * sizeof(ArgBlob);
1731 blob->name = write_string (node->name, strings, data, offset2);
1732 blob->must_chain_up = 0; /* FIXME */
1733 blob->must_be_implemented = 0; /* FIXME */
1734 blob->must_not_be_implemented = 0; /* FIXME */
1735 blob->class_closure = 0; /* FIXME */
1738 blob->struct_offset = vfunc->offset;
1739 blob->reserved2 = 0;
1740 blob->signature = signature;
1742 g_ir_node_build_typelib ((GIrNode *)vfunc->result->type,
1743 module, modules, strings, types,
1744 data, &signature, offset2);
1746 blob2->may_return_null = vfunc->result->allow_none;
1747 blob2->caller_owns_return_value = vfunc->result->transfer;
1748 blob2->caller_owns_return_container = vfunc->result->shallow_transfer;
1749 blob2->reserved = 0;
1750 blob2->n_arguments = n;
1754 for (l = vfunc->parameters; l; l = l->next)
1756 GIrNode *param = (GIrNode *)l->data;
1758 g_ir_node_build_typelib (param, module, modules, strings,
1759 types, data, &signature, offset2);
1764 case G_IR_NODE_PARAM:
1766 ArgBlob *blob = (ArgBlob *)&data[*offset];
1767 GIrNodeParam *param = (GIrNodeParam *)node;
1771 blob->name = write_string (node->name, strings, data, offset2);
1772 blob->in = param->in;
1773 blob->out = param->out;
1774 blob->dipper = param->dipper;
1775 blob->allow_none = param->allow_none;
1776 blob->optional = param->optional;
1777 blob->transfer_ownership = param->transfer;
1778 blob->transfer_container_ownership = param->shallow_transfer;
1779 blob->return_value = param->retval;
1780 blob->scope = param->scope;
1782 blob->closure = param->closure;
1783 blob->destroy = param->destroy;
1785 g_ir_node_build_typelib ((GIrNode *)param->type, module, modules,
1786 strings, types, data, offset, offset2);
1790 case G_IR_NODE_STRUCT:
1792 StructBlob *blob = (StructBlob *)&data[*offset];
1793 GIrNodeStruct *struct_ = (GIrNodeStruct *)node;
1796 blob->blob_type = BLOB_TYPE_STRUCT;
1797 blob->deprecated = struct_->deprecated;
1798 blob->is_class_struct = struct_->is_gclass_struct;
1800 blob->name = write_string (node->name, strings, data, offset2);
1801 blob->alignment = struct_->alignment;
1802 blob->size = struct_->size;
1804 if (struct_->gtype_name)
1806 blob->unregistered = FALSE;
1807 blob->gtype_name = write_string (struct_->gtype_name, strings, data, offset2);
1808 blob->gtype_init = write_string (struct_->gtype_init, strings, data, offset2);
1812 blob->unregistered = TRUE;
1813 blob->gtype_name = 0;
1814 blob->gtype_init = 0;
1818 blob->n_methods = 0;
1822 members = g_list_copy (struct_->members);
1824 g_ir_node_build_members (&members, G_IR_NODE_FIELD, &blob->n_fields,
1825 module, modules, strings,
1826 types, data, offset, offset2);
1828 g_ir_node_build_members (&members, G_IR_NODE_FUNCTION, &blob->n_methods,
1829 module, modules, strings,
1830 types, data, offset, offset2);
1832 g_ir_node_check_unhandled_members (&members, node->type);
1834 g_assert (members == NULL);
1838 case G_IR_NODE_BOXED:
1840 StructBlob *blob = (StructBlob *)&data[*offset];
1841 GIrNodeBoxed *boxed = (GIrNodeBoxed *)node;
1844 blob->blob_type = BLOB_TYPE_BOXED;
1845 blob->deprecated = boxed->deprecated;
1846 blob->unregistered = FALSE;
1848 blob->name = write_string (node->name, strings, data, offset2);
1849 blob->gtype_name = write_string (boxed->gtype_name, strings, data, offset2);
1850 blob->gtype_init = write_string (boxed->gtype_init, strings, data, offset2);
1851 blob->alignment = boxed->alignment;
1852 blob->size = boxed->size;
1855 blob->n_methods = 0;
1859 members = g_list_copy (boxed->members);
1861 g_ir_node_build_members (&members, G_IR_NODE_FIELD, &blob->n_fields,
1862 module, modules, strings,
1863 types, data, offset, offset2);
1865 g_ir_node_build_members (&members, G_IR_NODE_FUNCTION, &blob->n_methods,
1866 module, modules, strings,
1867 types, data, offset, offset2);
1869 g_ir_node_check_unhandled_members (&members, node->type);
1871 g_assert (members == NULL);
1875 case G_IR_NODE_UNION:
1877 UnionBlob *blob = (UnionBlob *)&data[*offset];
1878 GIrNodeUnion *union_ = (GIrNodeUnion *)node;
1881 blob->blob_type = BLOB_TYPE_UNION;
1882 blob->deprecated = union_->deprecated;
1884 blob->name = write_string (node->name, strings, data, offset2);
1885 blob->alignment = union_->alignment;
1886 blob->size = union_->size;
1887 if (union_->gtype_name)
1889 blob->unregistered = FALSE;
1890 blob->gtype_name = write_string (union_->gtype_name, strings, data, offset2);
1891 blob->gtype_init = write_string (union_->gtype_init, strings, data, offset2);
1895 blob->unregistered = TRUE;
1896 blob->gtype_name = 0;
1897 blob->gtype_init = 0;
1901 blob->n_functions = 0;
1903 blob->discriminator_offset = union_->discriminator_offset;
1905 if (union_->discriminator_type)
1908 blob->discriminated = TRUE;
1909 g_ir_node_build_typelib ((GIrNode *)union_->discriminator_type,
1910 module, modules, strings, types,
1911 data, offset, offset2);
1916 blob->discriminated = FALSE;
1917 blob->discriminator_type.offset = 0;
1920 members = g_list_copy (union_->members);
1922 g_ir_node_build_members (&members, G_IR_NODE_FIELD, &blob->n_fields,
1923 module, modules, strings,
1924 types, data, offset, offset2);
1926 g_ir_node_build_members (&members, G_IR_NODE_FUNCTION, &blob->n_functions,
1927 module, modules, strings,
1928 types, data, offset, offset2);
1930 g_ir_node_check_unhandled_members (&members, node->type);
1932 g_assert (members == NULL);
1934 if (union_->discriminator_type)
1936 for (l = union_->discriminators; l; l = l->next)
1938 GIrNode *member = (GIrNode *)l->data;
1940 g_ir_node_build_typelib (member, module, modules, strings,
1941 types, data, offset, offset2);
1947 case G_IR_NODE_ENUM:
1948 case G_IR_NODE_FLAGS:
1950 EnumBlob *blob = (EnumBlob *)&data[*offset];
1951 GIrNodeEnum *enum_ = (GIrNodeEnum *)node;
1955 if (node->type == G_IR_NODE_ENUM)
1956 blob->blob_type = BLOB_TYPE_ENUM;
1958 blob->blob_type = BLOB_TYPE_FLAGS;
1960 blob->deprecated = enum_->deprecated;
1962 blob->storage_type = enum_->storage_type;
1963 blob->name = write_string (node->name, strings, data, offset2);
1964 if (enum_->gtype_name)
1966 blob->unregistered = FALSE;
1967 blob->gtype_name = write_string (enum_->gtype_name, strings, data, offset2);
1968 blob->gtype_init = write_string (enum_->gtype_init, strings, data, offset2);
1972 blob->unregistered = TRUE;
1973 blob->gtype_name = 0;
1974 blob->gtype_init = 0;
1978 blob->reserved2 = 0;
1980 for (l = enum_->values; l; l = l->next)
1982 GIrNode *value = (GIrNode *)l->data;
1985 g_ir_node_build_typelib (value, module, modules, strings, types,
1986 data, offset, offset2);
1991 case G_IR_NODE_OBJECT:
1993 ObjectBlob *blob = (ObjectBlob *)&data[*offset];
1994 GIrNodeInterface *object = (GIrNodeInterface *)node;
1997 blob->blob_type = BLOB_TYPE_OBJECT;
1998 blob->abstract = object->abstract;
1999 blob->deprecated = object->deprecated;
2001 blob->name = write_string (node->name, strings, data, offset2);
2002 blob->gtype_name = write_string (object->gtype_name, strings, data, offset2);
2003 blob->gtype_init = write_string (object->gtype_init, strings, data, offset2);
2005 blob->parent = find_entry (module, modules, object->parent);
2008 if (object->class_struct)
2009 blob->class_struct = find_entry (module, modules, object->class_struct);
2011 blob->class_struct = 0;
2013 blob->n_interfaces = 0;
2015 blob->n_properties = 0;
2016 blob->n_methods = 0;
2017 blob->n_signals = 0;
2019 blob->n_constants = 0;
2021 *offset += sizeof(ObjectBlob);
2022 for (l = object->interfaces; l; l = l->next)
2024 blob->n_interfaces++;
2025 *(guint16*)&data[*offset] = find_entry (module, modules, (gchar *)l->data);
2029 members = g_list_copy (object->members);
2031 *offset = ALIGN_VALUE (*offset, 4);
2032 g_ir_node_build_members (&members, G_IR_NODE_FIELD, &blob->n_fields,
2033 module, modules, strings,
2034 types, data, offset, offset2);
2036 *offset = ALIGN_VALUE (*offset, 4);
2037 g_ir_node_build_members (&members, G_IR_NODE_PROPERTY, &blob->n_properties,
2038 module, modules, strings,
2039 types, data, offset, offset2);
2041 *offset = ALIGN_VALUE (*offset, 4);
2042 g_ir_node_build_members (&members, G_IR_NODE_FUNCTION, &blob->n_methods,
2043 module, modules, strings,
2044 types, data, offset, offset2);
2046 *offset = ALIGN_VALUE (*offset, 4);
2047 g_ir_node_build_members (&members, G_IR_NODE_SIGNAL, &blob->n_signals,
2048 module, modules, strings,
2049 types, data, offset, offset2);
2051 *offset = ALIGN_VALUE (*offset, 4);
2052 g_ir_node_build_members (&members, G_IR_NODE_VFUNC, &blob->n_vfuncs,
2053 module, modules, strings,
2054 types, data, offset, offset2);
2056 *offset = ALIGN_VALUE (*offset, 4);
2057 g_ir_node_build_members (&members, G_IR_NODE_CONSTANT, &blob->n_constants,
2058 module, modules, strings,
2059 types, data, offset, offset2);
2061 g_ir_node_check_unhandled_members (&members, node->type);
2063 g_assert (members == NULL);
2067 case G_IR_NODE_INTERFACE:
2069 InterfaceBlob *blob = (InterfaceBlob *)&data[*offset];
2070 GIrNodeInterface *iface = (GIrNodeInterface *)node;
2073 blob->blob_type = BLOB_TYPE_INTERFACE;
2074 blob->deprecated = iface->deprecated;
2076 blob->name = write_string (node->name, strings, data, offset2);
2077 blob->gtype_name = write_string (iface->gtype_name, strings, data, offset2);
2078 blob->gtype_init = write_string (iface->gtype_init, strings, data, offset2);
2079 blob->n_prerequisites = 0;
2080 blob->n_properties = 0;
2081 blob->n_methods = 0;
2082 blob->n_signals = 0;
2084 blob->n_constants = 0;
2087 for (l = iface->prerequisites; l; l = l->next)
2089 blob->n_prerequisites++;
2090 *(guint16*)&data[*offset] = find_entry (module, modules, (gchar *)l->data);
2094 members = g_list_copy (iface->members);
2096 *offset = ALIGN_VALUE (*offset, 4);
2097 g_ir_node_build_members (&members, G_IR_NODE_PROPERTY, &blob->n_properties,
2098 module, modules, strings,
2099 types, data, offset, offset2);
2101 *offset = ALIGN_VALUE (*offset, 4);
2102 g_ir_node_build_members (&members, G_IR_NODE_FUNCTION, &blob->n_methods,
2103 module, modules, strings,
2104 types, data, offset, offset2);
2106 *offset = ALIGN_VALUE (*offset, 4);
2107 g_ir_node_build_members (&members, G_IR_NODE_SIGNAL, &blob->n_signals,
2108 module, modules, strings,
2109 types, data, offset, offset2);
2111 *offset = ALIGN_VALUE (*offset, 4);
2112 g_ir_node_build_members (&members, G_IR_NODE_VFUNC, &blob->n_vfuncs,
2113 module, modules, strings,
2114 types, data, offset, offset2);
2116 *offset = ALIGN_VALUE (*offset, 4);
2117 g_ir_node_build_members (&members, G_IR_NODE_CONSTANT, &blob->n_constants,
2118 module, modules, strings,
2119 types, data, offset, offset2);
2121 g_ir_node_check_unhandled_members (&members, node->type);
2123 g_assert (members == NULL);
2128 case G_IR_NODE_VALUE:
2130 GIrNodeValue *value = (GIrNodeValue *)node;
2131 ValueBlob *blob = (ValueBlob *)&data[*offset];
2134 blob->deprecated = value->deprecated;
2136 blob->name = write_string (node->name, strings, data, offset2);
2137 blob->value = value->value;
2141 case G_IR_NODE_ERROR_DOMAIN:
2143 GIrNodeErrorDomain *domain = (GIrNodeErrorDomain *)node;
2144 ErrorDomainBlob *blob = (ErrorDomainBlob *)&data[*offset];
2147 blob->blob_type = BLOB_TYPE_ERROR_DOMAIN;
2148 blob->deprecated = domain->deprecated;
2150 blob->name = write_string (node->name, strings, data, offset2);
2151 blob->get_quark = write_string (domain->getquark, strings, data, offset2);
2152 blob->error_codes = find_entry (module, modules, domain->codes);
2153 blob->reserved2 = 0;
2157 case G_IR_NODE_CONSTANT:
2159 GIrNodeConstant *constant = (GIrNodeConstant *)node;
2160 ConstantBlob *blob = (ConstantBlob *)&data[*offset];
2166 blob->blob_type = BLOB_TYPE_CONSTANT;
2167 blob->deprecated = constant->deprecated;
2169 blob->name = write_string (node->name, strings, data, offset2);
2171 blob->offset = *offset2;
2172 switch (constant->type->tag)
2174 case GI_TYPE_TAG_BOOLEAN:
2176 *(gboolean*)&data[blob->offset] = parse_boolean_value (constant->value);
2178 case GI_TYPE_TAG_INT8:
2180 *(gint8*)&data[blob->offset] = (gint8) parse_int_value (constant->value);
2182 case GI_TYPE_TAG_UINT8:
2184 *(guint8*)&data[blob->offset] = (guint8) parse_uint_value (constant->value);
2186 case GI_TYPE_TAG_INT16:
2188 *(gint16*)&data[blob->offset] = (gint16) parse_int_value (constant->value);
2190 case GI_TYPE_TAG_UINT16:
2192 *(guint16*)&data[blob->offset] = (guint16) parse_uint_value (constant->value);
2194 case GI_TYPE_TAG_INT32:
2196 *(gint32*)&data[blob->offset] = (gint32) parse_int_value (constant->value);
2198 case GI_TYPE_TAG_UINT32:
2200 *(guint32*)&data[blob->offset] = (guint32) parse_uint_value (constant->value);
2202 case GI_TYPE_TAG_INT64:
2204 *(gint64*)&data[blob->offset] = (gint64) parse_int_value (constant->value);
2206 case GI_TYPE_TAG_UINT64:
2208 *(guint64*)&data[blob->offset] = (guint64) parse_uint_value (constant->value);
2210 case GI_TYPE_TAG_INT:
2211 blob->size = sizeof (gint);
2212 *(gint*)&data[blob->offset] = (gint) parse_int_value (constant->value);
2214 case GI_TYPE_TAG_UINT:
2215 blob->size = sizeof (guint);
2216 *(gint*)&data[blob->offset] = (guint) parse_uint_value (constant->value);
2218 case GI_TYPE_TAG_SSIZE: /* FIXME */
2219 case GI_TYPE_TAG_LONG:
2220 blob->size = sizeof (glong);
2221 *(glong*)&data[blob->offset] = (glong) parse_int_value (constant->value);
2223 case GI_TYPE_TAG_SIZE: /* FIXME */
2224 case GI_TYPE_TAG_TIME_T:
2225 case GI_TYPE_TAG_ULONG:
2226 blob->size = sizeof (gulong);
2227 *(gulong*)&data[blob->offset] = (gulong) parse_uint_value (constant->value);
2229 case GI_TYPE_TAG_FLOAT:
2230 blob->size = sizeof (gfloat);
2231 *(gfloat*)&data[blob->offset] = (gfloat) parse_float_value (constant->value);
2233 case GI_TYPE_TAG_DOUBLE:
2234 blob->size = sizeof (gdouble);
2235 *(gdouble*)&data[blob->offset] = (gdouble) parse_float_value (constant->value);
2237 case GI_TYPE_TAG_UTF8:
2238 case GI_TYPE_TAG_FILENAME:
2239 blob->size = strlen (constant->value) + 1;
2240 memcpy (&data[blob->offset], constant->value, blob->size);
2243 *offset2 += ALIGN_VALUE (blob->size, 4);
2245 g_ir_node_build_typelib ((GIrNode *)constant->type, module, modules,
2246 strings, types, data, &pos, offset2);
2250 g_assert_not_reached ();
2253 g_debug ("node %s%s%s%p type '%s', offset %d -> %d, offset2 %d -> %d",
2254 node->name ? "'" : "",
2255 node->name ? node->name : "",
2256 node->name ? "' " : "",
2257 node, g_ir_node_type_to_string (node->type),
2258 old_offset, *offset, old_offset2, *offset2);
2260 if (*offset2 - old_offset2 + *offset - old_offset > g_ir_node_get_full_size (node))
2261 g_error ("exceeding space reservation !!");
2264 /* if str is already in the pool, return previous location, otherwise write str
2265 * to the typelib at offset, put it in the pool and update offset. If the
2266 * typelib is not large enough to hold the string, reallocate it.
2269 write_string (const gchar *str,
2270 GHashTable *strings,
2278 string_size += strlen (str);
2280 value = g_hash_table_lookup (strings, str);
2283 return GPOINTER_TO_UINT (value);
2285 unique_string_count += 1;
2286 unique_string_size += strlen (str);
2288 g_hash_table_insert (strings, (gpointer)str, GUINT_TO_POINTER (*offset));
2291 *offset = ALIGN_VALUE (start + strlen (str) + 1, 4);
2293 strcpy ((gchar*)&data[start], str);