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:
415 size = sizeof (CallbackBlob);
418 case G_IR_NODE_FUNCTION:
419 size = sizeof (FunctionBlob);
422 case G_IR_NODE_PARAM:
423 /* See the comment in the G_IR_NODE_PARAM/ArgBlob writing below */
424 size = sizeof (ArgBlob) - sizeof (SimpleTypeBlob);
428 size = sizeof (SimpleTypeBlob);
431 case G_IR_NODE_OBJECT:
433 GIrNodeInterface *iface = (GIrNodeInterface *)node;
435 n = g_list_length (iface->interfaces);
436 size = sizeof (ObjectBlob) + 2 * (n + (n % 2));
438 for (l = iface->members; l; l = l->next)
439 size += g_ir_node_get_size ((GIrNode *)l->data);
443 case G_IR_NODE_INTERFACE:
445 GIrNodeInterface *iface = (GIrNodeInterface *)node;
447 n = g_list_length (iface->prerequisites);
448 size = sizeof (InterfaceBlob) + 2 * (n + (n % 2));
450 for (l = iface->members; l; l = l->next)
451 size += g_ir_node_get_size ((GIrNode *)l->data);
456 case G_IR_NODE_FLAGS:
458 GIrNodeEnum *enum_ = (GIrNodeEnum *)node;
460 size = sizeof (EnumBlob);
461 for (l = enum_->values; l; l = l->next)
462 size += g_ir_node_get_size ((GIrNode *)l->data);
466 case G_IR_NODE_VALUE:
467 size = sizeof (ValueBlob);
470 case G_IR_NODE_STRUCT:
472 GIrNodeStruct *struct_ = (GIrNodeStruct *)node;
474 size = sizeof (StructBlob);
475 for (l = struct_->members; l; l = l->next)
476 size += g_ir_node_get_size ((GIrNode *)l->data);
480 case G_IR_NODE_BOXED:
482 GIrNodeBoxed *boxed = (GIrNodeBoxed *)node;
484 size = sizeof (StructBlob);
485 for (l = boxed->members; l; l = l->next)
486 size += g_ir_node_get_size ((GIrNode *)l->data);
490 case G_IR_NODE_PROPERTY:
491 size = sizeof (PropertyBlob);
494 case G_IR_NODE_SIGNAL:
495 size = sizeof (SignalBlob);
498 case G_IR_NODE_VFUNC:
499 size = sizeof (VFuncBlob);
502 case G_IR_NODE_FIELD:
503 size = sizeof (FieldBlob);
506 case G_IR_NODE_CONSTANT:
507 size = sizeof (ConstantBlob);
510 case G_IR_NODE_ERROR_DOMAIN:
511 size = sizeof (ErrorDomainBlob);
518 case G_IR_NODE_UNION:
520 GIrNodeUnion *union_ = (GIrNodeUnion *)node;
522 size = sizeof (UnionBlob);
523 for (l = union_->members; l; l = l->next)
524 size += g_ir_node_get_size ((GIrNode *)l->data);
525 for (l = union_->discriminators; l; l = l->next)
526 size += g_ir_node_get_size ((GIrNode *)l->data);
531 g_error ("Unhandled node type '%s'\n",
532 g_ir_node_type_to_string (node->type));
536 g_debug ("node %p type '%s' size %d", node,
537 g_ir_node_type_to_string (node->type), size);
542 /* returns the full size of the blob including variable-size parts */
544 g_ir_node_get_full_size_internal (GIrNode *parent,
550 if (node == NULL && parent != NULL)
551 g_error ("Caught NULL node, parent=%s", parent->name);
553 g_debug ("node %p type '%s'", node,
554 g_ir_node_type_to_string (node->type));
558 case G_IR_NODE_CALLBACK:
560 GIrNodeFunction *function = (GIrNodeFunction *)node;
561 size = sizeof (CallbackBlob);
562 size += ALIGN_VALUE (strlen (node->name) + 1, 4);
563 for (l = function->parameters; l; l = l->next)
565 size += g_ir_node_get_full_size_internal (node, (GIrNode *)l->data);
567 size += g_ir_node_get_full_size_internal (node, (GIrNode *)function->result);
571 case G_IR_NODE_FUNCTION:
573 GIrNodeFunction *function = (GIrNodeFunction *)node;
574 size = sizeof (FunctionBlob);
575 size += ALIGN_VALUE (strlen (node->name) + 1, 4);
576 size += ALIGN_VALUE (strlen (function->symbol) + 1, 4);
577 for (l = function->parameters; l; l = l->next)
578 size += g_ir_node_get_full_size_internal (node, (GIrNode *)l->data);
579 size += g_ir_node_get_full_size_internal (node, (GIrNode *)function->result);
583 case G_IR_NODE_PARAM:
585 GIrNodeParam *param = (GIrNodeParam *)node;
587 /* See the comment in the G_IR_NODE_PARAM/ArgBlob writing below */
588 size = sizeof (ArgBlob) - sizeof (SimpleTypeBlob);
590 size += ALIGN_VALUE (strlen (node->name) + 1, 4);
591 size += g_ir_node_get_full_size_internal (node, (GIrNode *)param->type);
597 GIrNodeType *type = (GIrNodeType *)node;
598 size = sizeof (SimpleTypeBlob);
599 if (type->tag >= GI_TYPE_TAG_ARRAY)
601 g_debug ("node %p type tag '%s'", node,
602 g_type_tag_to_string (type->tag));
606 case GI_TYPE_TAG_ARRAY:
607 size = sizeof (ArrayTypeBlob);
608 if (type->parameter_type1)
609 size += g_ir_node_get_full_size_internal (node, (GIrNode *)type->parameter_type1);
611 case GI_TYPE_TAG_INTERFACE:
612 size += sizeof (InterfaceTypeBlob);
614 case GI_TYPE_TAG_GLIST:
615 case GI_TYPE_TAG_GSLIST:
616 size += sizeof (ParamTypeBlob);
617 if (type->parameter_type1)
618 size += g_ir_node_get_full_size_internal (node, (GIrNode *)type->parameter_type1);
620 case GI_TYPE_TAG_GHASH:
621 size += sizeof (ParamTypeBlob) * 2;
622 if (type->parameter_type1)
623 size += g_ir_node_get_full_size_internal (node, (GIrNode *)type->parameter_type1);
624 if (type->parameter_type2)
625 size += g_ir_node_get_full_size_internal (node, (GIrNode *)type->parameter_type2);
627 case GI_TYPE_TAG_ERROR:
632 n = g_strv_length (type->errors);
636 size += sizeof (ErrorTypeBlob) + 2 * (n + n % 2);
640 g_error ("Unknown type tag %d\n", type->tag);
647 case G_IR_NODE_OBJECT:
649 GIrNodeInterface *iface = (GIrNodeInterface *)node;
651 n = g_list_length (iface->interfaces);
652 size = sizeof(ObjectBlob);
654 size += ALIGN_VALUE (strlen (iface->parent) + 1, 4);
655 if (iface->class_struct)
656 size += ALIGN_VALUE (strlen (iface->class_struct) + 1, 4);
657 size += ALIGN_VALUE (strlen (node->name) + 1, 4);
658 size += ALIGN_VALUE (strlen (iface->gtype_name) + 1, 4);
659 if (iface->gtype_init)
660 size += ALIGN_VALUE (strlen (iface->gtype_init) + 1, 4);
661 size += 2 * (n + (n % 2));
663 for (l = iface->members; l; l = l->next)
664 size += g_ir_node_get_full_size_internal (node, (GIrNode *)l->data);
668 case G_IR_NODE_INTERFACE:
670 GIrNodeInterface *iface = (GIrNodeInterface *)node;
672 n = g_list_length (iface->prerequisites);
673 size = sizeof (InterfaceBlob);
674 size += ALIGN_VALUE (strlen (node->name) + 1, 4);
675 size += ALIGN_VALUE (strlen (iface->gtype_name) + 1, 4);
676 size += ALIGN_VALUE (strlen (iface->gtype_init) + 1, 4);
677 size += 2 * (n + (n % 2));
679 for (l = iface->members; l; l = l->next)
680 size += g_ir_node_get_full_size_internal (node, (GIrNode *)l->data);
685 case G_IR_NODE_FLAGS:
687 GIrNodeEnum *enum_ = (GIrNodeEnum *)node;
689 size = sizeof (EnumBlob);
690 size += ALIGN_VALUE (strlen (node->name) + 1, 4);
691 if (enum_->gtype_name)
693 size += ALIGN_VALUE (strlen (enum_->gtype_name) + 1, 4);
694 size += ALIGN_VALUE (strlen (enum_->gtype_init) + 1, 4);
697 for (l = enum_->values; l; l = l->next)
698 size += g_ir_node_get_full_size_internal (node, (GIrNode *)l->data);
702 case G_IR_NODE_VALUE:
704 size = sizeof (ValueBlob);
705 size += ALIGN_VALUE (strlen (node->name) + 1, 4);
709 case G_IR_NODE_STRUCT:
711 GIrNodeStruct *struct_ = (GIrNodeStruct *)node;
713 size = sizeof (StructBlob);
714 size += ALIGN_VALUE (strlen (node->name) + 1, 4);
715 if (struct_->gtype_name)
716 size += ALIGN_VALUE (strlen (struct_->gtype_name) + 1, 4);
717 if (struct_->gtype_init)
718 size += ALIGN_VALUE (strlen (struct_->gtype_init) + 1, 4);
719 for (l = struct_->members; l; l = l->next)
720 size += g_ir_node_get_full_size_internal (node, (GIrNode *)l->data);
724 case G_IR_NODE_BOXED:
726 GIrNodeBoxed *boxed = (GIrNodeBoxed *)node;
728 size = sizeof (StructBlob);
729 size += ALIGN_VALUE (strlen (node->name) + 1, 4);
730 if (boxed->gtype_name)
732 size += ALIGN_VALUE (strlen (boxed->gtype_name) + 1, 4);
733 size += ALIGN_VALUE (strlen (boxed->gtype_init) + 1, 4);
735 for (l = boxed->members; l; l = l->next)
736 size += g_ir_node_get_full_size_internal (node, (GIrNode *)l->data);
740 case G_IR_NODE_PROPERTY:
742 GIrNodeProperty *prop = (GIrNodeProperty *)node;
744 size = sizeof (PropertyBlob);
745 size += ALIGN_VALUE (strlen (node->name) + 1, 4);
746 size += g_ir_node_get_full_size_internal (node, (GIrNode *)prop->type);
750 case G_IR_NODE_SIGNAL:
752 GIrNodeSignal *signal = (GIrNodeSignal *)node;
754 size = sizeof (SignalBlob);
755 size += ALIGN_VALUE (strlen (node->name) + 1, 4);
756 for (l = signal->parameters; l; l = l->next)
757 size += g_ir_node_get_full_size_internal (node, (GIrNode *)l->data);
758 size += g_ir_node_get_full_size_internal (node, (GIrNode *)signal->result);
762 case G_IR_NODE_VFUNC:
764 GIrNodeVFunc *vfunc = (GIrNodeVFunc *)node;
766 size = sizeof (VFuncBlob);
767 size += ALIGN_VALUE (strlen (node->name) + 1, 4);
768 for (l = vfunc->parameters; l; l = l->next)
769 size += g_ir_node_get_full_size_internal (node, (GIrNode *)l->data);
770 size += g_ir_node_get_full_size_internal (node, (GIrNode *)vfunc->result);
774 case G_IR_NODE_FIELD:
776 GIrNodeField *field = (GIrNodeField *)node;
778 size = sizeof (FieldBlob);
779 size += ALIGN_VALUE (strlen (node->name) + 1, 4);
780 size += g_ir_node_get_full_size_internal (node, (GIrNode *)field->type);
784 case G_IR_NODE_CONSTANT:
786 GIrNodeConstant *constant = (GIrNodeConstant *)node;
788 size = sizeof (ConstantBlob);
789 size += ALIGN_VALUE (strlen (node->name) + 1, 4);
790 /* FIXME non-string values */
791 size += ALIGN_VALUE (strlen (constant->value) + 1, 4);
792 size += g_ir_node_get_full_size_internal (node, (GIrNode *)constant->type);
796 case G_IR_NODE_ERROR_DOMAIN:
798 GIrNodeErrorDomain *domain = (GIrNodeErrorDomain *)node;
800 size = sizeof (ErrorDomainBlob);
801 size += ALIGN_VALUE (strlen (node->name) + 1, 4);
802 size += ALIGN_VALUE (strlen (domain->getquark) + 1, 4);
808 GIrNodeXRef *xref = (GIrNodeXRef *)node;
811 size += ALIGN_VALUE (strlen (node->name) + 1, 4);
812 size += ALIGN_VALUE (strlen (xref->namespace) + 1, 4);
816 case G_IR_NODE_UNION:
818 GIrNodeUnion *union_ = (GIrNodeUnion *)node;
820 size = sizeof (UnionBlob);
821 size += ALIGN_VALUE (strlen (node->name) + 1, 4);
822 if (union_->gtype_name)
823 size += ALIGN_VALUE (strlen (union_->gtype_name) + 1, 4);
824 if (union_->gtype_init)
825 size += ALIGN_VALUE (strlen (union_->gtype_init) + 1, 4);
826 for (l = union_->members; l; l = l->next)
827 size += g_ir_node_get_full_size_internal (node, (GIrNode *)l->data);
828 for (l = union_->discriminators; l; l = l->next)
829 size += g_ir_node_get_full_size_internal (node, (GIrNode *)l->data);
834 g_error ("Unknown type tag %d\n", node->type);
838 g_debug ("node %s%s%s%p type '%s' full size %d",
839 node->name ? "'" : "",
840 node->name ? node->name : "",
841 node->name ? "' " : "",
842 node, g_ir_node_type_to_string (node->type), size);
848 g_ir_node_get_full_size (GIrNode *node)
850 return g_ir_node_get_full_size_internal (NULL, node);
854 g_ir_node_cmp (GIrNode *node,
857 if (node->type < other->type)
859 else if (node->type > other->type)
862 return strcmp (node->name, other->name);
866 g_ir_node_can_have_member (GIrNode *node)
870 case G_IR_NODE_OBJECT:
871 case G_IR_NODE_INTERFACE:
872 case G_IR_NODE_BOXED:
873 case G_IR_NODE_STRUCT:
874 case G_IR_NODE_UNION:
876 /* list others individually rather than with default: so that compiler
877 * warns if new node types are added without adding them to the switch
879 case G_IR_NODE_INVALID:
880 case G_IR_NODE_FUNCTION:
881 case G_IR_NODE_CALLBACK:
883 case G_IR_NODE_FLAGS:
884 case G_IR_NODE_CONSTANT:
885 case G_IR_NODE_ERROR_DOMAIN:
886 case G_IR_NODE_PARAM:
888 case G_IR_NODE_PROPERTY:
889 case G_IR_NODE_SIGNAL:
890 case G_IR_NODE_VALUE:
891 case G_IR_NODE_VFUNC:
892 case G_IR_NODE_FIELD:
900 g_ir_node_add_member (GIrNode *node,
901 GIrNodeFunction *member)
903 g_return_if_fail (node != NULL);
904 g_return_if_fail (member != NULL);
908 case G_IR_NODE_OBJECT:
909 case G_IR_NODE_INTERFACE:
911 GIrNodeInterface *iface = (GIrNodeInterface *)node;
913 g_list_insert_sorted (iface->members, member,
914 (GCompareFunc) g_ir_node_cmp);
917 case G_IR_NODE_BOXED:
919 GIrNodeBoxed *boxed = (GIrNodeBoxed *)node;
921 g_list_insert_sorted (boxed->members, member,
922 (GCompareFunc) g_ir_node_cmp);
925 case G_IR_NODE_STRUCT:
927 GIrNodeStruct *struct_ = (GIrNodeStruct *)node;
929 g_list_insert_sorted (struct_->members, member,
930 (GCompareFunc) g_ir_node_cmp);
933 case G_IR_NODE_UNION:
935 GIrNodeUnion *union_ = (GIrNodeUnion *)node;
937 g_list_insert_sorted (union_->members, member,
938 (GCompareFunc) g_ir_node_cmp);
942 g_error ("Cannot add a member to unknown type tag type %d\n",
949 g_ir_node_param_direction_string (GIrNodeParam * node)
962 parse_int_value (const gchar *str)
964 return strtoll (str, NULL, 0);
968 parse_uint_value (const gchar *str)
970 return strtoull (str, NULL, 0);
974 parse_float_value (const gchar *str)
976 return strtod (str, NULL);
980 parse_boolean_value (const gchar *str)
982 if (strcmp (str, "TRUE") == 0)
985 if (strcmp (str, "FALSE") == 0)
988 return parse_int_value (str) ? TRUE : FALSE;
992 find_entry_node (GIrModule *module,
1002 GIrNode *result = NULL;
1004 g_assert (name != NULL);
1005 g_assert (strlen (name) > 0);
1007 names = g_strsplit (name, ".", 0);
1008 n_names = g_strv_length (names);
1010 g_error ("Too many name parts");
1012 for (l = module->entries, i = 1; l; l = l->next, i++)
1014 GIrNode *node = (GIrNode *)l->data;
1018 if (node->type != G_IR_NODE_XREF)
1021 if (((GIrNodeXRef *)node)->namespace == NULL ||
1022 strcmp (((GIrNodeXRef *)node)->namespace, names[0]) != 0)
1026 if (strcmp (node->name, names[n_names - 1]) == 0)
1038 GIrNode *node = g_ir_node_new (G_IR_NODE_XREF);
1040 ((GIrNodeXRef *)node)->namespace = g_strdup (names[0]);
1041 node->name = g_strdup (names[1]);
1043 module->entries = g_list_append (module->entries, node);
1046 *idx = g_list_length (module->entries);
1050 g_debug ("Creating XREF: %s %s", names[0], names[1]);
1055 g_warning ("Entry '%s' not found", name);
1065 find_entry (GIrModule *module,
1071 find_entry_node (module, modules, name, &idx);
1077 find_name_in_module (GIrModule *module,
1082 for (l = module->entries; l; l = l->next)
1084 GIrNode *node = (GIrNode *)l->data;
1086 if (strcmp (node->name, name) == 0)
1094 g_ir_find_node (GIrModule *module,
1098 GIrModule **module_out)
1100 char **names = g_strsplit (name, ".", 0);
1101 gint n_names = g_strv_length (names);
1102 GIrNode *node = NULL;
1107 g_warning ("Name can't be empty");
1113 g_warning ("Too many name parts in '%s'", name);
1119 *module_out = module;
1120 node = find_name_in_module (module, names[0]);
1122 else if (strcmp (names[0], module->name) == 0)
1124 *module_out = module;
1125 node = find_name_in_module (module, names[1]);
1129 for (l = module->include_modules; l; l = l->next)
1131 GIrModule *m = l->data;
1133 if (strcmp (names[0], m->name) == 0)
1136 node = find_name_in_module (m, names[1]);
1141 for (l = modules; l; l = l->next)
1143 GIrModule *m = l->data;
1145 if (strcmp (names[0], m->name) == 0)
1148 node = find_name_in_module (m, names[1]);
1159 return node != NULL;
1163 serialize_type (GIrModule *module,
1169 const gchar* basic[] = {
1195 if (node->tag < GI_TYPE_TAG_ARRAY)
1197 g_string_append_printf (str, "%s%s", basic[node->tag],
1198 node->is_pointer ? "*" : "");
1200 else if (node->tag == GI_TYPE_TAG_ARRAY)
1202 serialize_type (module, modules, node->parameter_type1, str);
1203 g_string_append (str, "[");
1205 if (node->has_length)
1206 g_string_append_printf (str, "length=%d", node->length);
1207 else if (node->has_size)
1208 g_string_append_printf (str, "fixed-size=%d", node->size);
1210 if (node->zero_terminated)
1211 g_string_append_printf (str, "%szero-terminated=1",
1212 node->has_length ? "," : "");
1214 g_string_append (str, "]");
1216 else if (node->tag == GI_TYPE_TAG_INTERFACE)
1221 iface = find_entry_node (module, modules, node->interface, NULL);
1224 if (iface->type == G_IR_NODE_XREF)
1225 g_string_append_printf (str, "%s.", ((GIrNodeXRef *)iface)->namespace);
1230 g_warning ("Interface for type reference %s not found", node->interface);
1231 name = node->interface;
1234 g_string_append_printf (str, "%s%s", name,
1235 node->is_pointer ? "*" : "");
1237 else if (node->tag == GI_TYPE_TAG_GLIST)
1239 g_string_append (str, "GList");
1240 if (node->parameter_type1)
1242 g_string_append (str, "<");
1243 serialize_type (module, modules, node->parameter_type1, str);
1244 g_string_append (str, ">");
1247 else if (node->tag == GI_TYPE_TAG_GSLIST)
1249 g_string_append (str, "GSList");
1250 if (node->parameter_type1)
1252 g_string_append (str, "<");
1253 serialize_type (module, modules, node->parameter_type1, str);
1254 g_string_append (str, ">");
1257 else if (node->tag == GI_TYPE_TAG_GHASH)
1259 g_string_append (str, "GHashTable<");
1260 if (node->parameter_type1)
1262 g_string_append (str, "<");
1263 serialize_type (module, modules, node->parameter_type1, str);
1264 g_string_append (str, ",");
1265 serialize_type (module, modules, node->parameter_type2, str);
1266 g_string_append (str, ">");
1269 else if (node->tag == GI_TYPE_TAG_ERROR)
1271 g_string_append (str, "GError");
1274 g_string_append (str, "<");
1275 for (i = 0; node->errors[i]; i++)
1278 g_string_append (str, ",");
1279 g_string_append (str, node->errors[i]);
1281 g_string_append (str, ">");
1287 g_ir_node_build_members (GList **members,
1292 GHashTable *strings,
1298 GList *l = *members;
1302 GIrNode *member = (GIrNode *)l->data;
1303 GList *next = l->next;
1305 if (member->type == type)
1308 g_ir_node_build_typelib (member, module, modules, strings,
1309 types, data, offset, offset2);
1310 *members = g_list_delete_link (*members, l);
1317 g_ir_node_check_unhandled_members (GList **members,
1318 GIrNodeTypeId container_type)
1325 for (l = *members; l; l = l->next)
1327 GIrNode *member = (GIrNode *)l->data;
1328 g_printerr ("Unhandled '%s' member '%s' type '%s'\n",
1329 g_ir_node_type_to_string (container_type),
1331 g_ir_node_type_to_string (member->type));
1334 g_list_free (*members);
1337 g_error ("Unhandled members. Aborting.");
1340 g_list_free (*members);
1346 g_ir_node_build_typelib (GIrNode *node,
1349 GHashTable *strings,
1356 guint32 old_offset = *offset;
1357 guint32 old_offset2 = *offset2;
1359 g_assert (node != NULL);
1361 g_debug ("build_typelib: %s%s(%s)",
1362 node->name ? node->name : "",
1363 node->name ? " " : "",
1364 g_ir_node_type_to_string (node->type));
1366 g_ir_node_compute_offsets (node, module, modules);
1370 case G_IR_NODE_TYPE:
1372 GIrNodeType *type = (GIrNodeType *)node;
1373 SimpleTypeBlob *blob = (SimpleTypeBlob *)&data[*offset];
1375 *offset += sizeof (SimpleTypeBlob);
1377 if (type->tag < GI_TYPE_TAG_ARRAY ||
1378 type->tag == GI_TYPE_TAG_UTF8 ||
1379 type->tag == GI_TYPE_TAG_FILENAME)
1382 blob->reserved2 = 0;
1383 blob->pointer = type->is_pointer;
1384 blob->reserved3 = 0;
1385 blob->tag = type->tag;
1393 str = g_string_new (0);
1394 serialize_type (module, modules, type, str);
1395 s = g_string_free (str, FALSE);
1398 value = g_hash_table_lookup (types, s);
1401 blob->offset = GPOINTER_TO_UINT (value);
1406 unique_types_count += 1;
1407 g_hash_table_insert (types, s, GUINT_TO_POINTER(*offset2));
1409 blob->offset = *offset2;
1412 case GI_TYPE_TAG_ARRAY:
1414 ArrayTypeBlob *array = (ArrayTypeBlob *)&data[*offset2];
1418 array->reserved = 0;
1419 array->tag = type->tag;
1420 array->zero_terminated = type->zero_terminated;
1421 array->has_length = type->has_length;
1422 array->has_size = type->has_size;
1423 array->reserved2 = 0;
1424 if (array->has_length)
1425 array->length = type->length;
1426 else if (array->has_size)
1427 array->size = type->size;
1431 pos = *offset2 + G_STRUCT_OFFSET (ArrayTypeBlob, type);
1432 *offset2 += sizeof (ArrayTypeBlob);
1434 g_ir_node_build_typelib ((GIrNode *)type->parameter_type1,
1435 module, modules, strings, types,
1436 data, &pos, offset2);
1440 case GI_TYPE_TAG_INTERFACE:
1442 InterfaceTypeBlob *iface = (InterfaceTypeBlob *)&data[*offset2];
1443 *offset2 += sizeof (InterfaceTypeBlob);
1445 iface->pointer = type->is_pointer;
1446 iface->reserved = 0;
1447 iface->tag = type->tag;
1448 iface->reserved2 = 0;
1449 iface->interface = find_entry (module, modules, type->interface);
1454 case GI_TYPE_TAG_GLIST:
1455 case GI_TYPE_TAG_GSLIST:
1457 ParamTypeBlob *param = (ParamTypeBlob *)&data[*offset2];
1461 param->reserved = 0;
1462 param->tag = type->tag;
1463 param->reserved2 = 0;
1466 pos = *offset2 + G_STRUCT_OFFSET (ParamTypeBlob, type);
1467 *offset2 += sizeof (ParamTypeBlob) + sizeof (SimpleTypeBlob);
1469 g_ir_node_build_typelib ((GIrNode *)type->parameter_type1,
1470 module, modules, strings, types,
1471 data, &pos, offset2);
1475 case GI_TYPE_TAG_GHASH:
1477 ParamTypeBlob *param = (ParamTypeBlob *)&data[*offset2];
1481 param->reserved = 0;
1482 param->tag = type->tag;
1483 param->reserved2 = 0;
1486 pos = *offset2 + G_STRUCT_OFFSET (ParamTypeBlob, type);
1487 *offset2 += sizeof (ParamTypeBlob) + sizeof (SimpleTypeBlob)*2;
1489 g_ir_node_build_typelib ((GIrNode *)type->parameter_type1,
1490 module, modules, strings, types,
1491 data, &pos, offset2);
1492 g_ir_node_build_typelib ((GIrNode *)type->parameter_type2,
1493 module, modules, strings, types,
1494 data, &pos, offset2);
1498 case GI_TYPE_TAG_ERROR:
1500 ErrorTypeBlob *blob = (ErrorTypeBlob *)&data[*offset2];
1505 blob->tag = type->tag;
1506 blob->reserved2 = 0;
1508 blob->n_domains = g_strv_length (type->errors);
1510 blob->n_domains = 0;
1512 *offset2 = ALIGN_VALUE (*offset2 + G_STRUCT_OFFSET (ErrorTypeBlob, domains)
1513 + 2 * blob->n_domains, 4);
1514 for (i = 0; i < blob->n_domains; i++)
1515 blob->domains[i] = find_entry (module, modules, type->errors[i]);
1520 g_error ("Unknown type tag %d\n", type->tag);
1528 case G_IR_NODE_FIELD:
1530 GIrNodeField *field = (GIrNodeField *)node;
1533 blob = (FieldBlob *)&data[*offset];
1534 /* We handle the size member specially below, so subtract it */
1535 *offset += sizeof (FieldBlob) - sizeof (SimpleTypeBlob);
1537 blob->name = write_string (node->name, strings, data, offset2);
1538 blob->readable = field->readable;
1539 blob->writable = field->writable;
1542 if (field->offset >= 0)
1543 blob->struct_offset = field->offset;
1545 blob->struct_offset = 0xFFFF; /* mark as unknown */
1547 g_ir_node_build_typelib ((GIrNode *)field->type,
1548 module, modules, strings, types,
1549 data, offset, offset2);
1553 case G_IR_NODE_PROPERTY:
1555 GIrNodeProperty *prop = (GIrNodeProperty *)node;
1556 PropertyBlob *blob = (PropertyBlob *)&data[*offset];
1557 /* We handle the size member specially below, so subtract it */
1558 *offset += sizeof (PropertyBlob) - sizeof (SimpleTypeBlob);
1560 blob->name = write_string (node->name, strings, data, offset2);
1561 blob->deprecated = prop->deprecated;
1562 blob->readable = prop->readable;
1563 blob->writable = prop->writable;
1564 blob->construct = prop->construct;
1565 blob->construct_only = prop->construct_only;
1568 g_ir_node_build_typelib ((GIrNode *)prop->type,
1569 module, modules, strings, types,
1570 data, offset, offset2);
1574 case G_IR_NODE_FUNCTION:
1576 FunctionBlob *blob = (FunctionBlob *)&data[*offset];
1577 SignatureBlob *blob2 = (SignatureBlob *)&data[*offset2];
1578 GIrNodeFunction *function = (GIrNodeFunction *)node;
1582 signature = *offset2;
1583 n = g_list_length (function->parameters);
1585 *offset += sizeof (FunctionBlob);
1586 *offset2 += sizeof (SignatureBlob) + n * sizeof (ArgBlob);
1588 blob->blob_type = BLOB_TYPE_FUNCTION;
1589 blob->deprecated = function->deprecated;
1590 blob->is_static = !function->is_method;
1591 blob->setter = function->is_setter;
1592 blob->getter = function->is_getter;
1593 blob->constructor = function->is_constructor;
1594 blob->wraps_vfunc = function->wraps_vfunc;
1595 blob->throws = function->throws;
1597 blob->name = write_string (node->name, strings, data, offset2);
1598 blob->symbol = write_string (function->symbol, strings, data, offset2);
1599 blob->signature = signature;
1601 g_debug ("building function '%s'", function->symbol);
1603 g_ir_node_build_typelib ((GIrNode *)function->result->type,
1604 module, modules, strings, types,
1605 data, &signature, offset2);
1607 blob2->may_return_null = function->result->allow_none;
1608 blob2->caller_owns_return_value = function->result->transfer;
1609 blob2->caller_owns_return_container = function->result->shallow_transfer;
1610 blob2->reserved = 0;
1611 blob2->n_arguments = n;
1615 for (l = function->parameters; l; l = l->next)
1617 GIrNode *param = (GIrNode *)l->data;
1619 g_ir_node_build_typelib (param,
1620 module, modules, strings, types,
1621 data, &signature, offset2);
1627 case G_IR_NODE_CALLBACK:
1629 CallbackBlob *blob = (CallbackBlob *)&data[*offset];
1630 SignatureBlob *blob2 = (SignatureBlob *)&data[*offset2];
1631 GIrNodeFunction *function = (GIrNodeFunction *)node;
1635 signature = *offset2;
1636 n = g_list_length (function->parameters);
1638 *offset += sizeof (CallbackBlob);
1639 *offset2 += sizeof (SignatureBlob) + n * sizeof (ArgBlob);
1641 blob->blob_type = BLOB_TYPE_CALLBACK;
1642 blob->deprecated = function->deprecated;
1644 blob->name = write_string (node->name, strings, data, offset2);
1645 blob->signature = signature;
1647 g_ir_node_build_typelib ((GIrNode *)function->result->type,
1648 module, modules, strings, types,
1649 data, &signature, offset2);
1651 blob2->may_return_null = function->result->allow_none;
1652 blob2->caller_owns_return_value = function->result->transfer;
1653 blob2->caller_owns_return_container = function->result->shallow_transfer;
1654 blob2->reserved = 0;
1655 blob2->n_arguments = n;
1659 for (l = function->parameters; l; l = l->next)
1661 GIrNode *param = (GIrNode *)l->data;
1663 g_ir_node_build_typelib (param,
1664 module, modules, strings, types,
1665 data, &signature, offset2);
1670 case G_IR_NODE_SIGNAL:
1672 SignalBlob *blob = (SignalBlob *)&data[*offset];
1673 SignatureBlob *blob2 = (SignatureBlob *)&data[*offset2];
1674 GIrNodeSignal *signal = (GIrNodeSignal *)node;
1678 signature = *offset2;
1679 n = g_list_length (signal->parameters);
1681 *offset += sizeof (SignalBlob);
1682 *offset2 += sizeof (SignatureBlob) + n * sizeof (ArgBlob);
1684 blob->deprecated = signal->deprecated;
1685 blob->run_first = signal->run_first;
1686 blob->run_last = signal->run_last;
1687 blob->run_cleanup = signal->run_cleanup;
1688 blob->no_recurse = signal->no_recurse;
1689 blob->detailed = signal->detailed;
1690 blob->action = signal->action;
1691 blob->no_hooks = signal->no_hooks;
1692 blob->has_class_closure = 0; /* FIXME */
1693 blob->true_stops_emit = 0; /* FIXME */
1695 blob->class_closure = 0; /* FIXME */
1696 blob->name = write_string (node->name, strings, data, offset2);
1697 blob->signature = signature;
1699 g_ir_node_build_typelib ((GIrNode *)signal->result->type,
1700 module, modules, strings, types,
1701 data, &signature, offset2);
1703 blob2->may_return_null = signal->result->allow_none;
1704 blob2->caller_owns_return_value = signal->result->transfer;
1705 blob2->caller_owns_return_container = signal->result->shallow_transfer;
1706 blob2->reserved = 0;
1707 blob2->n_arguments = n;
1711 for (l = signal->parameters; l; l = l->next)
1713 GIrNode *param = (GIrNode *)l->data;
1715 g_ir_node_build_typelib (param, module, modules, strings, types,
1716 data, &signature, offset2);
1721 case G_IR_NODE_VFUNC:
1723 VFuncBlob *blob = (VFuncBlob *)&data[*offset];
1724 SignatureBlob *blob2 = (SignatureBlob *)&data[*offset2];
1725 GIrNodeVFunc *vfunc = (GIrNodeVFunc *)node;
1729 signature = *offset2;
1730 n = g_list_length (vfunc->parameters);
1732 *offset += sizeof (VFuncBlob);
1733 *offset2 += sizeof (SignatureBlob) + n * sizeof (ArgBlob);
1735 blob->name = write_string (node->name, strings, data, offset2);
1736 blob->must_chain_up = 0; /* FIXME */
1737 blob->must_be_implemented = 0; /* FIXME */
1738 blob->must_not_be_implemented = 0; /* FIXME */
1739 blob->class_closure = 0; /* FIXME */
1742 blob->struct_offset = vfunc->offset;
1743 blob->reserved2 = 0;
1744 blob->signature = signature;
1746 g_ir_node_build_typelib ((GIrNode *)vfunc->result->type,
1747 module, modules, strings, types,
1748 data, &signature, offset2);
1750 blob2->may_return_null = vfunc->result->allow_none;
1751 blob2->caller_owns_return_value = vfunc->result->transfer;
1752 blob2->caller_owns_return_container = vfunc->result->shallow_transfer;
1753 blob2->reserved = 0;
1754 blob2->n_arguments = n;
1758 for (l = vfunc->parameters; l; l = l->next)
1760 GIrNode *param = (GIrNode *)l->data;
1762 g_ir_node_build_typelib (param, module, modules, strings,
1763 types, data, &signature, offset2);
1768 case G_IR_NODE_PARAM:
1770 ArgBlob *blob = (ArgBlob *)&data[*offset];
1771 GIrNodeParam *param = (GIrNodeParam *)node;
1773 /* The offset for this one is smaller than the struct because
1774 * we recursively build the simple type inline here below.
1776 *offset += sizeof (ArgBlob) - sizeof (SimpleTypeBlob);
1778 blob->name = write_string (node->name, strings, data, offset2);
1779 blob->in = param->in;
1780 blob->out = param->out;
1781 blob->dipper = param->dipper;
1782 blob->allow_none = param->allow_none;
1783 blob->optional = param->optional;
1784 blob->transfer_ownership = param->transfer;
1785 blob->transfer_container_ownership = param->shallow_transfer;
1786 blob->return_value = param->retval;
1787 blob->scope = param->scope;
1789 blob->closure = param->closure;
1790 blob->destroy = param->destroy;
1792 g_ir_node_build_typelib ((GIrNode *)param->type, module, modules,
1793 strings, types, data, offset, offset2);
1797 case G_IR_NODE_STRUCT:
1799 StructBlob *blob = (StructBlob *)&data[*offset];
1800 GIrNodeStruct *struct_ = (GIrNodeStruct *)node;
1803 blob->blob_type = BLOB_TYPE_STRUCT;
1804 blob->deprecated = struct_->deprecated;
1805 blob->is_class_struct = struct_->is_gclass_struct;
1807 blob->name = write_string (node->name, strings, data, offset2);
1808 blob->alignment = struct_->alignment;
1809 blob->size = struct_->size;
1811 if (struct_->gtype_name)
1813 blob->unregistered = FALSE;
1814 blob->gtype_name = write_string (struct_->gtype_name, strings, data, offset2);
1815 blob->gtype_init = write_string (struct_->gtype_init, strings, data, offset2);
1819 blob->unregistered = TRUE;
1820 blob->gtype_name = 0;
1821 blob->gtype_init = 0;
1825 blob->n_methods = 0;
1827 *offset += sizeof (StructBlob);
1829 members = g_list_copy (struct_->members);
1831 g_ir_node_build_members (&members, G_IR_NODE_FIELD, &blob->n_fields,
1832 module, modules, strings,
1833 types, data, offset, offset2);
1835 g_ir_node_build_members (&members, G_IR_NODE_FUNCTION, &blob->n_methods,
1836 module, modules, strings,
1837 types, data, offset, offset2);
1839 g_ir_node_check_unhandled_members (&members, node->type);
1841 g_assert (members == NULL);
1845 case G_IR_NODE_BOXED:
1847 StructBlob *blob = (StructBlob *)&data[*offset];
1848 GIrNodeBoxed *boxed = (GIrNodeBoxed *)node;
1851 blob->blob_type = BLOB_TYPE_BOXED;
1852 blob->deprecated = boxed->deprecated;
1853 blob->unregistered = FALSE;
1855 blob->name = write_string (node->name, strings, data, offset2);
1856 blob->gtype_name = write_string (boxed->gtype_name, strings, data, offset2);
1857 blob->gtype_init = write_string (boxed->gtype_init, strings, data, offset2);
1858 blob->alignment = boxed->alignment;
1859 blob->size = boxed->size;
1862 blob->n_methods = 0;
1864 *offset += sizeof (StructBlob);
1866 members = g_list_copy (boxed->members);
1868 g_ir_node_build_members (&members, G_IR_NODE_FIELD, &blob->n_fields,
1869 module, modules, strings,
1870 types, data, offset, offset2);
1872 g_ir_node_build_members (&members, G_IR_NODE_FUNCTION, &blob->n_methods,
1873 module, modules, strings,
1874 types, data, offset, offset2);
1876 g_ir_node_check_unhandled_members (&members, node->type);
1878 g_assert (members == NULL);
1882 case G_IR_NODE_UNION:
1884 UnionBlob *blob = (UnionBlob *)&data[*offset];
1885 GIrNodeUnion *union_ = (GIrNodeUnion *)node;
1888 blob->blob_type = BLOB_TYPE_UNION;
1889 blob->deprecated = union_->deprecated;
1891 blob->name = write_string (node->name, strings, data, offset2);
1892 blob->alignment = union_->alignment;
1893 blob->size = union_->size;
1894 if (union_->gtype_name)
1896 blob->unregistered = FALSE;
1897 blob->gtype_name = write_string (union_->gtype_name, strings, data, offset2);
1898 blob->gtype_init = write_string (union_->gtype_init, strings, data, offset2);
1902 blob->unregistered = TRUE;
1903 blob->gtype_name = 0;
1904 blob->gtype_init = 0;
1908 blob->n_functions = 0;
1910 blob->discriminator_offset = union_->discriminator_offset;
1912 /* We don't support Union discriminators right now. */
1913 if (union_->discriminator_type)
1916 blob->discriminated = TRUE;
1917 g_ir_node_build_typelib ((GIrNode *)union_->discriminator_type,
1918 module, modules, strings, types,
1919 data, offset, offset2);
1921 /* Always do the non-discriminated case */
1926 blob->discriminated = FALSE;
1927 blob->discriminator_type.offset = 0;
1930 *offset += sizeof (UnionBlob);
1931 blob->discriminated = FALSE;
1932 blob->discriminator_type.offset = 0;
1934 members = g_list_copy (union_->members);
1936 g_ir_node_build_members (&members, G_IR_NODE_FIELD, &blob->n_fields,
1937 module, modules, strings,
1938 types, data, offset, offset2);
1940 g_ir_node_build_members (&members, G_IR_NODE_FUNCTION, &blob->n_functions,
1941 module, modules, strings,
1942 types, data, offset, offset2);
1944 g_ir_node_check_unhandled_members (&members, node->type);
1946 g_assert (members == NULL);
1948 if (union_->discriminator_type)
1950 for (l = union_->discriminators; l; l = l->next)
1952 GIrNode *member = (GIrNode *)l->data;
1954 g_ir_node_build_typelib (member, module, modules, strings,
1955 types, data, offset, offset2);
1961 case G_IR_NODE_ENUM:
1962 case G_IR_NODE_FLAGS:
1964 EnumBlob *blob = (EnumBlob *)&data[*offset];
1965 GIrNodeEnum *enum_ = (GIrNodeEnum *)node;
1967 *offset += sizeof (EnumBlob);
1969 if (node->type == G_IR_NODE_ENUM)
1970 blob->blob_type = BLOB_TYPE_ENUM;
1972 blob->blob_type = BLOB_TYPE_FLAGS;
1974 blob->deprecated = enum_->deprecated;
1976 blob->storage_type = enum_->storage_type;
1977 blob->name = write_string (node->name, strings, data, offset2);
1978 if (enum_->gtype_name)
1980 blob->unregistered = FALSE;
1981 blob->gtype_name = write_string (enum_->gtype_name, strings, data, offset2);
1982 blob->gtype_init = write_string (enum_->gtype_init, strings, data, offset2);
1986 blob->unregistered = TRUE;
1987 blob->gtype_name = 0;
1988 blob->gtype_init = 0;
1992 blob->reserved2 = 0;
1994 for (l = enum_->values; l; l = l->next)
1996 GIrNode *value = (GIrNode *)l->data;
1999 g_ir_node_build_typelib (value, module, modules, strings, types,
2000 data, offset, offset2);
2005 case G_IR_NODE_OBJECT:
2007 ObjectBlob *blob = (ObjectBlob *)&data[*offset];
2008 GIrNodeInterface *object = (GIrNodeInterface *)node;
2011 blob->blob_type = BLOB_TYPE_OBJECT;
2012 blob->abstract = object->abstract;
2013 blob->deprecated = object->deprecated;
2015 blob->name = write_string (node->name, strings, data, offset2);
2016 blob->gtype_name = write_string (object->gtype_name, strings, data, offset2);
2017 blob->gtype_init = write_string (object->gtype_init, strings, data, offset2);
2019 blob->parent = find_entry (module, modules, object->parent);
2022 if (object->class_struct)
2023 blob->class_struct = find_entry (module, modules, object->class_struct);
2025 blob->class_struct = 0;
2027 blob->n_interfaces = 0;
2029 blob->n_properties = 0;
2030 blob->n_methods = 0;
2031 blob->n_signals = 0;
2033 blob->n_constants = 0;
2035 *offset += sizeof(ObjectBlob);
2036 for (l = object->interfaces; l; l = l->next)
2038 blob->n_interfaces++;
2039 *(guint16*)&data[*offset] = find_entry (module, modules, (gchar *)l->data);
2043 members = g_list_copy (object->members);
2045 *offset = ALIGN_VALUE (*offset, 4);
2046 g_ir_node_build_members (&members, G_IR_NODE_FIELD, &blob->n_fields,
2047 module, modules, strings,
2048 types, data, offset, offset2);
2050 *offset = ALIGN_VALUE (*offset, 4);
2051 g_ir_node_build_members (&members, G_IR_NODE_PROPERTY, &blob->n_properties,
2052 module, modules, strings,
2053 types, data, offset, offset2);
2055 *offset = ALIGN_VALUE (*offset, 4);
2056 g_ir_node_build_members (&members, G_IR_NODE_FUNCTION, &blob->n_methods,
2057 module, modules, strings,
2058 types, data, offset, offset2);
2060 *offset = ALIGN_VALUE (*offset, 4);
2061 g_ir_node_build_members (&members, G_IR_NODE_SIGNAL, &blob->n_signals,
2062 module, modules, strings,
2063 types, data, offset, offset2);
2065 *offset = ALIGN_VALUE (*offset, 4);
2066 g_ir_node_build_members (&members, G_IR_NODE_VFUNC, &blob->n_vfuncs,
2067 module, modules, strings,
2068 types, data, offset, offset2);
2070 *offset = ALIGN_VALUE (*offset, 4);
2071 g_ir_node_build_members (&members, G_IR_NODE_CONSTANT, &blob->n_constants,
2072 module, modules, strings,
2073 types, data, offset, offset2);
2075 g_ir_node_check_unhandled_members (&members, node->type);
2077 g_assert (members == NULL);
2081 case G_IR_NODE_INTERFACE:
2083 InterfaceBlob *blob = (InterfaceBlob *)&data[*offset];
2084 GIrNodeInterface *iface = (GIrNodeInterface *)node;
2087 blob->blob_type = BLOB_TYPE_INTERFACE;
2088 blob->deprecated = iface->deprecated;
2090 blob->name = write_string (node->name, strings, data, offset2);
2091 blob->gtype_name = write_string (iface->gtype_name, strings, data, offset2);
2092 blob->gtype_init = write_string (iface->gtype_init, strings, data, offset2);
2093 blob->n_prerequisites = 0;
2094 blob->n_properties = 0;
2095 blob->n_methods = 0;
2096 blob->n_signals = 0;
2098 blob->n_constants = 0;
2100 *offset += sizeof (InterfaceBlob);
2101 for (l = iface->prerequisites; l; l = l->next)
2103 blob->n_prerequisites++;
2104 *(guint16*)&data[*offset] = find_entry (module, modules, (gchar *)l->data);
2108 members = g_list_copy (iface->members);
2110 *offset = ALIGN_VALUE (*offset, 4);
2111 g_ir_node_build_members (&members, G_IR_NODE_PROPERTY, &blob->n_properties,
2112 module, modules, strings,
2113 types, data, offset, offset2);
2115 *offset = ALIGN_VALUE (*offset, 4);
2116 g_ir_node_build_members (&members, G_IR_NODE_FUNCTION, &blob->n_methods,
2117 module, modules, strings,
2118 types, data, offset, offset2);
2120 *offset = ALIGN_VALUE (*offset, 4);
2121 g_ir_node_build_members (&members, G_IR_NODE_SIGNAL, &blob->n_signals,
2122 module, modules, strings,
2123 types, data, offset, offset2);
2125 *offset = ALIGN_VALUE (*offset, 4);
2126 g_ir_node_build_members (&members, G_IR_NODE_VFUNC, &blob->n_vfuncs,
2127 module, modules, strings,
2128 types, data, offset, offset2);
2130 *offset = ALIGN_VALUE (*offset, 4);
2131 g_ir_node_build_members (&members, G_IR_NODE_CONSTANT, &blob->n_constants,
2132 module, modules, strings,
2133 types, data, offset, offset2);
2135 g_ir_node_check_unhandled_members (&members, node->type);
2137 g_assert (members == NULL);
2142 case G_IR_NODE_VALUE:
2144 GIrNodeValue *value = (GIrNodeValue *)node;
2145 ValueBlob *blob = (ValueBlob *)&data[*offset];
2146 *offset += sizeof (ValueBlob);
2148 blob->deprecated = value->deprecated;
2150 blob->name = write_string (node->name, strings, data, offset2);
2151 blob->value = value->value;
2155 case G_IR_NODE_ERROR_DOMAIN:
2157 GIrNodeErrorDomain *domain = (GIrNodeErrorDomain *)node;
2158 ErrorDomainBlob *blob = (ErrorDomainBlob *)&data[*offset];
2159 *offset += sizeof (ErrorDomainBlob);
2161 blob->blob_type = BLOB_TYPE_ERROR_DOMAIN;
2162 blob->deprecated = domain->deprecated;
2164 blob->name = write_string (node->name, strings, data, offset2);
2165 blob->get_quark = write_string (domain->getquark, strings, data, offset2);
2166 blob->error_codes = find_entry (module, modules, domain->codes);
2167 blob->reserved2 = 0;
2171 case G_IR_NODE_CONSTANT:
2173 GIrNodeConstant *constant = (GIrNodeConstant *)node;
2174 ConstantBlob *blob = (ConstantBlob *)&data[*offset];
2177 pos = *offset + G_STRUCT_OFFSET (ConstantBlob, type);
2178 *offset += sizeof (ConstantBlob);
2180 blob->blob_type = BLOB_TYPE_CONSTANT;
2181 blob->deprecated = constant->deprecated;
2183 blob->name = write_string (node->name, strings, data, offset2);
2185 blob->offset = *offset2;
2186 switch (constant->type->tag)
2188 case GI_TYPE_TAG_BOOLEAN:
2190 *(gboolean*)&data[blob->offset] = parse_boolean_value (constant->value);
2192 case GI_TYPE_TAG_INT8:
2194 *(gint8*)&data[blob->offset] = (gint8) parse_int_value (constant->value);
2196 case GI_TYPE_TAG_UINT8:
2198 *(guint8*)&data[blob->offset] = (guint8) parse_uint_value (constant->value);
2200 case GI_TYPE_TAG_INT16:
2202 *(gint16*)&data[blob->offset] = (gint16) parse_int_value (constant->value);
2204 case GI_TYPE_TAG_UINT16:
2206 *(guint16*)&data[blob->offset] = (guint16) parse_uint_value (constant->value);
2208 case GI_TYPE_TAG_INT32:
2210 *(gint32*)&data[blob->offset] = (gint32) parse_int_value (constant->value);
2212 case GI_TYPE_TAG_UINT32:
2214 *(guint32*)&data[blob->offset] = (guint32) parse_uint_value (constant->value);
2216 case GI_TYPE_TAG_INT64:
2218 *(gint64*)&data[blob->offset] = (gint64) parse_int_value (constant->value);
2220 case GI_TYPE_TAG_UINT64:
2222 *(guint64*)&data[blob->offset] = (guint64) parse_uint_value (constant->value);
2224 case GI_TYPE_TAG_INT:
2225 blob->size = sizeof (gint);
2226 *(gint*)&data[blob->offset] = (gint) parse_int_value (constant->value);
2228 case GI_TYPE_TAG_UINT:
2229 blob->size = sizeof (guint);
2230 *(gint*)&data[blob->offset] = (guint) parse_uint_value (constant->value);
2232 case GI_TYPE_TAG_SSIZE: /* FIXME */
2233 case GI_TYPE_TAG_LONG:
2234 blob->size = sizeof (glong);
2235 *(glong*)&data[blob->offset] = (glong) parse_int_value (constant->value);
2237 case GI_TYPE_TAG_SIZE: /* FIXME */
2238 case GI_TYPE_TAG_TIME_T:
2239 case GI_TYPE_TAG_ULONG:
2240 blob->size = sizeof (gulong);
2241 *(gulong*)&data[blob->offset] = (gulong) parse_uint_value (constant->value);
2243 case GI_TYPE_TAG_FLOAT:
2244 blob->size = sizeof (gfloat);
2245 *(gfloat*)&data[blob->offset] = (gfloat) parse_float_value (constant->value);
2247 case GI_TYPE_TAG_DOUBLE:
2248 blob->size = sizeof (gdouble);
2249 *(gdouble*)&data[blob->offset] = (gdouble) parse_float_value (constant->value);
2251 case GI_TYPE_TAG_UTF8:
2252 case GI_TYPE_TAG_FILENAME:
2253 blob->size = strlen (constant->value) + 1;
2254 memcpy (&data[blob->offset], constant->value, blob->size);
2257 *offset2 += ALIGN_VALUE (blob->size, 4);
2259 g_ir_node_build_typelib ((GIrNode *)constant->type, module, modules,
2260 strings, types, data, &pos, offset2);
2264 g_assert_not_reached ();
2267 g_debug ("node %s%s%s%p type '%s', offset %d -> %d, offset2 %d -> %d",
2268 node->name ? "'" : "",
2269 node->name ? node->name : "",
2270 node->name ? "' " : "",
2271 node, g_ir_node_type_to_string (node->type),
2272 old_offset, *offset, old_offset2, *offset2);
2274 if (*offset2 - old_offset2 + *offset - old_offset > g_ir_node_get_full_size (node))
2275 g_error ("exceeding space reservation !!");
2278 /* if str is already in the pool, return previous location, otherwise write str
2279 * to the typelib at offset, put it in the pool and update offset. If the
2280 * typelib is not large enough to hold the string, reallocate it.
2283 write_string (const gchar *str,
2284 GHashTable *strings,
2292 string_size += strlen (str);
2294 value = g_hash_table_lookup (strings, str);
2297 return GPOINTER_TO_UINT (value);
2299 unique_string_count += 1;
2300 unique_string_size += strlen (str);
2302 g_hash_table_insert (strings, (gpointer)str, GUINT_TO_POINTER (*offset));
2305 *offset = ALIGN_VALUE (start + strlen (str) + 1, 4);
2307 strcpy ((gchar*)&data[start], str);