1 /* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*-
2 * GObject introspection: Typelib creation
4 * Copyright (C) 2005 Matthias Clasen
5 * Copyright (C) 2008,2009 Red Hat, Inc.
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2 of the License, or (at your option) any later version.
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the
19 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20 * Boston, MA 02111-1307, USA.
27 #include "girmodule.h"
29 #include "gitypelib-internal.h"
32 #define strtoll _strtoi64
33 #define strtoull _strtoui64
36 static gulong string_count = 0;
37 static gulong unique_string_count = 0;
38 static gulong string_size = 0;
39 static gulong unique_string_size = 0;
40 static gulong types_count = 0;
41 static gulong unique_types_count = 0;
44 _g_irnode_init_stats (void)
47 unique_string_count = 0;
49 unique_string_size = 0;
51 unique_types_count = 0;
55 _g_irnode_dump_stats (void)
57 g_message ("%lu strings (%lu before sharing), %lu bytes (%lu before sharing)",
58 unique_string_count, string_count, unique_string_size, string_size);
59 g_message ("%lu types (%lu before sharing)", unique_types_count, types_count);
62 #define DO_ALIGNED_COPY(dest_addr, value, type) \
66 memcpy(dest_addr, &tmp_var, sizeof(type)); \
69 #define ALIGN_VALUE(this, boundary) \
70 (( ((unsigned long)(this)) + (((unsigned long)(boundary)) -1)) & (~(((unsigned long)(boundary))-1)))
74 _g_ir_node_type_to_string (GIrNodeTypeId type)
78 case G_IR_NODE_FUNCTION:
80 case G_IR_NODE_CALLBACK:
86 case G_IR_NODE_OBJECT:
88 case G_IR_NODE_INTERFACE:
90 case G_IR_NODE_SIGNAL:
92 case G_IR_NODE_PROPERTY:
100 case G_IR_NODE_FLAGS:
102 case G_IR_NODE_BOXED:
104 case G_IR_NODE_STRUCT:
106 case G_IR_NODE_VALUE:
108 case G_IR_NODE_CONSTANT:
112 case G_IR_NODE_UNION:
120 _g_ir_node_new (GIrNodeTypeId type,
123 GIrNode *node = NULL;
127 case G_IR_NODE_FUNCTION:
128 case G_IR_NODE_CALLBACK:
129 node = g_malloc0 (sizeof (GIrNodeFunction));
132 case G_IR_NODE_PARAM:
133 node = g_malloc0 (sizeof (GIrNodeParam));
137 node = g_malloc0 (sizeof (GIrNodeType));
140 case G_IR_NODE_OBJECT:
141 case G_IR_NODE_INTERFACE:
142 node = g_malloc0 (sizeof (GIrNodeInterface));
145 case G_IR_NODE_SIGNAL:
146 node = g_malloc0 (sizeof (GIrNodeSignal));
149 case G_IR_NODE_PROPERTY:
150 node = g_malloc0 (sizeof (GIrNodeProperty));
153 case G_IR_NODE_VFUNC:
154 node = g_malloc0 (sizeof (GIrNodeFunction));
157 case G_IR_NODE_FIELD:
158 node = g_malloc0 (sizeof (GIrNodeField));
162 case G_IR_NODE_FLAGS:
163 node = g_malloc0 (sizeof (GIrNodeEnum));
166 case G_IR_NODE_BOXED:
167 node = g_malloc0 (sizeof (GIrNodeBoxed));
170 case G_IR_NODE_STRUCT:
171 node = g_malloc0 (sizeof (GIrNodeStruct));
174 case G_IR_NODE_VALUE:
175 node = g_malloc0 (sizeof (GIrNodeValue));
178 case G_IR_NODE_CONSTANT:
179 node = g_malloc0 (sizeof (GIrNodeConstant));
183 node = g_malloc0 (sizeof (GIrNodeXRef));
186 case G_IR_NODE_UNION:
187 node = g_malloc0 (sizeof (GIrNodeUnion));
191 g_error ("Unhandled node type %d\n", type);
196 node->module = module;
198 node->attributes = g_hash_table_new_full (g_str_hash, g_str_equal,
205 _g_ir_node_free (GIrNode *node)
214 case G_IR_NODE_FUNCTION:
215 case G_IR_NODE_CALLBACK:
217 GIrNodeFunction *function = (GIrNodeFunction *)node;
220 g_free (function->symbol);
221 _g_ir_node_free ((GIrNode *)function->result);
222 for (l = function->parameters; l; l = l->next)
223 _g_ir_node_free ((GIrNode *)l->data);
224 g_list_free (function->parameters);
230 GIrNodeType *type = (GIrNodeType *)node;
233 _g_ir_node_free ((GIrNode *)type->parameter_type1);
234 _g_ir_node_free ((GIrNode *)type->parameter_type2);
236 g_free (type->giinterface);
237 g_strfreev (type->errors);
242 case G_IR_NODE_PARAM:
244 GIrNodeParam *param = (GIrNodeParam *)node;
247 _g_ir_node_free ((GIrNode *)param->type);
251 case G_IR_NODE_PROPERTY:
253 GIrNodeProperty *property = (GIrNodeProperty *)node;
256 _g_ir_node_free ((GIrNode *)property->type);
260 case G_IR_NODE_SIGNAL:
262 GIrNodeSignal *signal = (GIrNodeSignal *)node;
265 for (l = signal->parameters; l; l = l->next)
266 _g_ir_node_free ((GIrNode *)l->data);
267 g_list_free (signal->parameters);
268 _g_ir_node_free ((GIrNode *)signal->result);
272 case G_IR_NODE_VFUNC:
274 GIrNodeVFunc *vfunc = (GIrNodeVFunc *)node;
277 g_free (vfunc->invoker);
278 for (l = vfunc->parameters; l; l = l->next)
279 _g_ir_node_free ((GIrNode *)l->data);
280 g_list_free (vfunc->parameters);
281 _g_ir_node_free ((GIrNode *)vfunc->result);
285 case G_IR_NODE_FIELD:
287 GIrNodeField *field = (GIrNodeField *)node;
290 _g_ir_node_free ((GIrNode *)field->type);
291 _g_ir_node_free ((GIrNode *)field->callback);
295 case G_IR_NODE_OBJECT:
296 case G_IR_NODE_INTERFACE:
298 GIrNodeInterface *iface = (GIrNodeInterface *)node;
301 g_free (iface->gtype_name);
302 g_free (iface->gtype_init);
303 g_free (iface->ref_func);
304 g_free (iface->unref_func);
305 g_free (iface->set_value_func);
306 g_free (iface->get_value_func);
309 g_free (iface->glib_type_struct);
310 g_free (iface->parent);
312 for (l = iface->interfaces; l; l = l->next)
313 g_free ((GIrNode *)l->data);
314 g_list_free (iface->interfaces);
316 for (l = iface->members; l; l = l->next)
317 _g_ir_node_free ((GIrNode *)l->data);
318 g_list_free (iface->members);
323 case G_IR_NODE_VALUE:
330 case G_IR_NODE_FLAGS:
332 GIrNodeEnum *enum_ = (GIrNodeEnum *)node;
335 g_free (enum_->gtype_name);
336 g_free (enum_->gtype_init);
337 g_free (enum_->error_domain);
339 for (l = enum_->values; l; l = l->next)
340 _g_ir_node_free ((GIrNode *)l->data);
341 g_list_free (enum_->values);
343 for (l = enum_->methods; l; l = l->next)
344 _g_ir_node_free ((GIrNode *)l->data);
345 g_list_free (enum_->methods);
349 case G_IR_NODE_BOXED:
351 GIrNodeBoxed *boxed = (GIrNodeBoxed *)node;
354 g_free (boxed->gtype_name);
355 g_free (boxed->gtype_init);
357 for (l = boxed->members; l; l = l->next)
358 _g_ir_node_free ((GIrNode *)l->data);
359 g_list_free (boxed->members);
363 case G_IR_NODE_STRUCT:
365 GIrNodeStruct *struct_ = (GIrNodeStruct *)node;
368 g_free (struct_->gtype_name);
369 g_free (struct_->gtype_init);
371 for (l = struct_->members; l; l = l->next)
372 _g_ir_node_free ((GIrNode *)l->data);
373 g_list_free (struct_->members);
377 case G_IR_NODE_CONSTANT:
379 GIrNodeConstant *constant = (GIrNodeConstant *)node;
382 g_free (constant->value);
383 _g_ir_node_free ((GIrNode *)constant->type);
389 GIrNodeXRef *xref = (GIrNodeXRef *)node;
392 g_free (xref->namespace);
396 case G_IR_NODE_UNION:
398 GIrNodeUnion *union_ = (GIrNodeUnion *)node;
401 g_free (union_->gtype_name);
402 g_free (union_->gtype_init);
404 _g_ir_node_free ((GIrNode *)union_->discriminator_type);
405 for (l = union_->members; l; l = l->next)
406 _g_ir_node_free ((GIrNode *)l->data);
407 for (l = union_->discriminators; l; l = l->next)
408 _g_ir_node_free ((GIrNode *)l->data);
413 g_error ("Unhandled node type %d\n", node->type);
417 g_hash_table_destroy (node->attributes);
422 /* returns the fixed size of the blob */
424 _g_ir_node_get_size (GIrNode *node)
431 case G_IR_NODE_CALLBACK:
432 size = sizeof (CallbackBlob);
435 case G_IR_NODE_FUNCTION:
436 size = sizeof (FunctionBlob);
439 case G_IR_NODE_PARAM:
440 /* See the comment in the G_IR_NODE_PARAM/ArgBlob writing below */
441 size = sizeof (ArgBlob) - sizeof (SimpleTypeBlob);
445 size = sizeof (SimpleTypeBlob);
448 case G_IR_NODE_OBJECT:
450 GIrNodeInterface *iface = (GIrNodeInterface *)node;
452 n = g_list_length (iface->interfaces);
453 size = sizeof (ObjectBlob) + 2 * (n + (n % 2));
455 for (l = iface->members; l; l = l->next)
456 size += _g_ir_node_get_size ((GIrNode *)l->data);
460 case G_IR_NODE_INTERFACE:
462 GIrNodeInterface *iface = (GIrNodeInterface *)node;
464 n = g_list_length (iface->prerequisites);
465 size = sizeof (InterfaceBlob) + 2 * (n + (n % 2));
467 for (l = iface->members; l; l = l->next)
468 size += _g_ir_node_get_size ((GIrNode *)l->data);
473 case G_IR_NODE_FLAGS:
475 GIrNodeEnum *enum_ = (GIrNodeEnum *)node;
477 size = sizeof (EnumBlob);
478 for (l = enum_->values; l; l = l->next)
479 size += _g_ir_node_get_size ((GIrNode *)l->data);
480 for (l = enum_->methods; l; l = l->next)
481 size += _g_ir_node_get_size ((GIrNode *)l->data);
485 case G_IR_NODE_VALUE:
486 size = sizeof (ValueBlob);
489 case G_IR_NODE_STRUCT:
491 GIrNodeStruct *struct_ = (GIrNodeStruct *)node;
493 size = sizeof (StructBlob);
494 for (l = struct_->members; l; l = l->next)
495 size += _g_ir_node_get_size ((GIrNode *)l->data);
499 case G_IR_NODE_BOXED:
501 GIrNodeBoxed *boxed = (GIrNodeBoxed *)node;
503 size = sizeof (StructBlob);
504 for (l = boxed->members; l; l = l->next)
505 size += _g_ir_node_get_size ((GIrNode *)l->data);
509 case G_IR_NODE_PROPERTY:
510 size = sizeof (PropertyBlob);
513 case G_IR_NODE_SIGNAL:
514 size = sizeof (SignalBlob);
517 case G_IR_NODE_VFUNC:
518 size = sizeof (VFuncBlob);
521 case G_IR_NODE_FIELD:
523 GIrNodeField *field = (GIrNodeField *)node;
525 size = sizeof (FieldBlob);
527 size += _g_ir_node_get_size ((GIrNode *)field->callback);
531 case G_IR_NODE_CONSTANT:
532 size = sizeof (ConstantBlob);
539 case G_IR_NODE_UNION:
541 GIrNodeUnion *union_ = (GIrNodeUnion *)node;
543 size = sizeof (UnionBlob);
544 for (l = union_->members; l; l = l->next)
545 size += _g_ir_node_get_size ((GIrNode *)l->data);
546 for (l = union_->discriminators; l; l = l->next)
547 size += _g_ir_node_get_size ((GIrNode *)l->data);
552 g_error ("Unhandled node type '%s'\n",
553 _g_ir_node_type_to_string (node->type));
557 g_debug ("node %p type '%s' size %d", node,
558 _g_ir_node_type_to_string (node->type), size);
564 add_attribute_size (gpointer key, gpointer value, gpointer data)
566 const gchar *key_str = key;
567 const gchar *value_str = value;
570 *size_p += sizeof (AttributeBlob);
571 *size_p += ALIGN_VALUE (strlen (key_str) + 1, 4);
572 *size_p += ALIGN_VALUE (strlen (value_str) + 1, 4);
575 /* returns the full size of the blob including variable-size parts (including attributes) */
577 _g_ir_node_get_full_size_internal (GIrNode *parent,
583 if (node == NULL && parent != NULL)
584 g_error ("Caught NULL node, parent=%s", parent->name);
586 g_debug ("node %p type '%s'", node,
587 _g_ir_node_type_to_string (node->type));
591 case G_IR_NODE_CALLBACK:
593 GIrNodeFunction *function = (GIrNodeFunction *)node;
594 size = sizeof (CallbackBlob);
595 size += ALIGN_VALUE (strlen (node->name) + 1, 4);
596 for (l = function->parameters; l; l = l->next)
598 size += _g_ir_node_get_full_size_internal (node, (GIrNode *)l->data);
600 size += _g_ir_node_get_full_size_internal (node, (GIrNode *)function->result);
604 case G_IR_NODE_FUNCTION:
606 GIrNodeFunction *function = (GIrNodeFunction *)node;
607 size = sizeof (FunctionBlob);
608 size += ALIGN_VALUE (strlen (node->name) + 1, 4);
609 size += ALIGN_VALUE (strlen (function->symbol) + 1, 4);
610 for (l = function->parameters; l; l = l->next)
611 size += _g_ir_node_get_full_size_internal (node, (GIrNode *)l->data);
612 size += _g_ir_node_get_full_size_internal (node, (GIrNode *)function->result);
616 case G_IR_NODE_PARAM:
618 GIrNodeParam *param = (GIrNodeParam *)node;
620 /* See the comment in the G_IR_NODE_PARAM/ArgBlob writing below */
621 size = sizeof (ArgBlob) - sizeof (SimpleTypeBlob);
623 size += ALIGN_VALUE (strlen (node->name) + 1, 4);
624 size += _g_ir_node_get_full_size_internal (node, (GIrNode *)param->type);
630 GIrNodeType *type = (GIrNodeType *)node;
631 size = sizeof (SimpleTypeBlob);
632 if (!G_TYPE_TAG_IS_BASIC(type->tag))
634 g_debug ("node %p type tag '%s'", node,
635 g_type_tag_to_string (type->tag));
639 case GI_TYPE_TAG_ARRAY:
640 size = sizeof (ArrayTypeBlob);
641 if (type->parameter_type1)
642 size += _g_ir_node_get_full_size_internal (node, (GIrNode *)type->parameter_type1);
644 case GI_TYPE_TAG_INTERFACE:
645 size += sizeof (InterfaceTypeBlob);
647 case GI_TYPE_TAG_GLIST:
648 case GI_TYPE_TAG_GSLIST:
649 size += sizeof (ParamTypeBlob);
650 if (type->parameter_type1)
651 size += _g_ir_node_get_full_size_internal (node, (GIrNode *)type->parameter_type1);
653 case GI_TYPE_TAG_GHASH:
654 size += sizeof (ParamTypeBlob) * 2;
655 if (type->parameter_type1)
656 size += _g_ir_node_get_full_size_internal (node, (GIrNode *)type->parameter_type1);
657 if (type->parameter_type2)
658 size += _g_ir_node_get_full_size_internal (node, (GIrNode *)type->parameter_type2);
660 case GI_TYPE_TAG_ERROR:
661 size += sizeof (ErrorTypeBlob);
664 g_error ("Unknown type tag %d\n", type->tag);
671 case G_IR_NODE_OBJECT:
673 GIrNodeInterface *iface = (GIrNodeInterface *)node;
675 n = g_list_length (iface->interfaces);
676 size = sizeof(ObjectBlob);
678 size += ALIGN_VALUE (strlen (iface->parent) + 1, 4);
679 if (iface->glib_type_struct)
680 size += ALIGN_VALUE (strlen (iface->glib_type_struct) + 1, 4);
681 size += ALIGN_VALUE (strlen (node->name) + 1, 4);
682 size += ALIGN_VALUE (strlen (iface->gtype_name) + 1, 4);
683 if (iface->gtype_init)
684 size += ALIGN_VALUE (strlen (iface->gtype_init) + 1, 4);
686 size += ALIGN_VALUE (strlen (iface->ref_func) + 1, 4);
687 if (iface->unref_func)
688 size += ALIGN_VALUE (strlen (iface->unref_func) + 1, 4);
689 if (iface->set_value_func)
690 size += ALIGN_VALUE (strlen (iface->set_value_func) + 1, 4);
691 if (iface->get_value_func)
692 size += ALIGN_VALUE (strlen (iface->get_value_func) + 1, 4);
693 size += 2 * (n + (n % 2));
695 for (l = iface->members; l; l = l->next)
696 size += _g_ir_node_get_full_size_internal (node, (GIrNode *)l->data);
700 case G_IR_NODE_INTERFACE:
702 GIrNodeInterface *iface = (GIrNodeInterface *)node;
704 n = g_list_length (iface->prerequisites);
705 size = sizeof (InterfaceBlob);
706 size += ALIGN_VALUE (strlen (node->name) + 1, 4);
707 size += ALIGN_VALUE (strlen (iface->gtype_name) + 1, 4);
708 size += ALIGN_VALUE (strlen (iface->gtype_init) + 1, 4);
709 size += 2 * (n + (n % 2));
711 for (l = iface->members; l; l = l->next)
712 size += _g_ir_node_get_full_size_internal (node, (GIrNode *)l->data);
717 case G_IR_NODE_FLAGS:
719 GIrNodeEnum *enum_ = (GIrNodeEnum *)node;
721 size = sizeof (EnumBlob);
722 size += ALIGN_VALUE (strlen (node->name) + 1, 4);
723 if (enum_->gtype_name)
725 size += ALIGN_VALUE (strlen (enum_->gtype_name) + 1, 4);
726 size += ALIGN_VALUE (strlen (enum_->gtype_init) + 1, 4);
728 if (enum_->error_domain)
729 size += ALIGN_VALUE (strlen (enum_->error_domain) + 1, 4);
731 for (l = enum_->values; l; l = l->next)
732 size += _g_ir_node_get_full_size_internal (node, (GIrNode *)l->data);
733 for (l = enum_->methods; l; l = l->next)
734 size += _g_ir_node_get_full_size_internal (node, (GIrNode *)l->data);
738 case G_IR_NODE_VALUE:
740 size = sizeof (ValueBlob);
741 size += ALIGN_VALUE (strlen (node->name) + 1, 4);
745 case G_IR_NODE_STRUCT:
747 GIrNodeStruct *struct_ = (GIrNodeStruct *)node;
749 size = sizeof (StructBlob);
750 size += ALIGN_VALUE (strlen (node->name) + 1, 4);
751 if (struct_->gtype_name)
752 size += ALIGN_VALUE (strlen (struct_->gtype_name) + 1, 4);
753 if (struct_->gtype_init)
754 size += ALIGN_VALUE (strlen (struct_->gtype_init) + 1, 4);
755 for (l = struct_->members; l; l = l->next)
756 size += _g_ir_node_get_full_size_internal (node, (GIrNode *)l->data);
760 case G_IR_NODE_BOXED:
762 GIrNodeBoxed *boxed = (GIrNodeBoxed *)node;
764 size = sizeof (StructBlob);
765 size += ALIGN_VALUE (strlen (node->name) + 1, 4);
766 if (boxed->gtype_name)
768 size += ALIGN_VALUE (strlen (boxed->gtype_name) + 1, 4);
769 size += ALIGN_VALUE (strlen (boxed->gtype_init) + 1, 4);
771 for (l = boxed->members; l; l = l->next)
772 size += _g_ir_node_get_full_size_internal (node, (GIrNode *)l->data);
776 case G_IR_NODE_PROPERTY:
778 GIrNodeProperty *prop = (GIrNodeProperty *)node;
780 size = sizeof (PropertyBlob);
781 size += ALIGN_VALUE (strlen (node->name) + 1, 4);
782 size += _g_ir_node_get_full_size_internal (node, (GIrNode *)prop->type);
786 case G_IR_NODE_SIGNAL:
788 GIrNodeSignal *signal = (GIrNodeSignal *)node;
790 size = sizeof (SignalBlob);
791 size += ALIGN_VALUE (strlen (node->name) + 1, 4);
792 for (l = signal->parameters; l; l = l->next)
793 size += _g_ir_node_get_full_size_internal (node, (GIrNode *)l->data);
794 size += _g_ir_node_get_full_size_internal (node, (GIrNode *)signal->result);
798 case G_IR_NODE_VFUNC:
800 GIrNodeVFunc *vfunc = (GIrNodeVFunc *)node;
802 size = sizeof (VFuncBlob);
803 size += ALIGN_VALUE (strlen (node->name) + 1, 4);
804 for (l = vfunc->parameters; l; l = l->next)
805 size += _g_ir_node_get_full_size_internal (node, (GIrNode *)l->data);
806 size += _g_ir_node_get_full_size_internal (node, (GIrNode *)vfunc->result);
810 case G_IR_NODE_FIELD:
812 GIrNodeField *field = (GIrNodeField *)node;
814 size = sizeof (FieldBlob);
815 size += ALIGN_VALUE (strlen (node->name) + 1, 4);
817 size += _g_ir_node_get_full_size_internal (node, (GIrNode *)field->callback);
819 size += _g_ir_node_get_full_size_internal (node, (GIrNode *)field->type);
823 case G_IR_NODE_CONSTANT:
825 GIrNodeConstant *constant = (GIrNodeConstant *)node;
827 size = sizeof (ConstantBlob);
828 size += ALIGN_VALUE (strlen (node->name) + 1, 4);
829 /* FIXME non-string values */
830 size += ALIGN_VALUE (strlen (constant->value) + 1, 4);
831 size += _g_ir_node_get_full_size_internal (node, (GIrNode *)constant->type);
837 GIrNodeXRef *xref = (GIrNodeXRef *)node;
840 size += ALIGN_VALUE (strlen (node->name) + 1, 4);
841 size += ALIGN_VALUE (strlen (xref->namespace) + 1, 4);
845 case G_IR_NODE_UNION:
847 GIrNodeUnion *union_ = (GIrNodeUnion *)node;
849 size = sizeof (UnionBlob);
850 size += ALIGN_VALUE (strlen (node->name) + 1, 4);
851 if (union_->gtype_name)
852 size += ALIGN_VALUE (strlen (union_->gtype_name) + 1, 4);
853 if (union_->gtype_init)
854 size += ALIGN_VALUE (strlen (union_->gtype_init) + 1, 4);
855 for (l = union_->members; l; l = l->next)
856 size += _g_ir_node_get_full_size_internal (node, (GIrNode *)l->data);
857 for (l = union_->discriminators; l; l = l->next)
858 size += _g_ir_node_get_full_size_internal (node, (GIrNode *)l->data);
863 g_error ("Unknown type tag %d\n", node->type);
867 g_debug ("node %s%s%s%p type '%s' full size %d",
868 node->name ? "'" : "",
869 node->name ? node->name : "",
870 node->name ? "' " : "",
871 node, _g_ir_node_type_to_string (node->type), size);
873 g_hash_table_foreach (node->attributes, add_attribute_size, &size);
879 _g_ir_node_get_full_size (GIrNode *node)
881 return _g_ir_node_get_full_size_internal (NULL, node);
885 _g_ir_node_cmp (GIrNode *node,
888 if (node->type < other->type)
890 else if (node->type > other->type)
893 return strcmp (node->name, other->name);
897 _g_ir_node_can_have_member (GIrNode *node)
901 case G_IR_NODE_OBJECT:
902 case G_IR_NODE_INTERFACE:
903 case G_IR_NODE_BOXED:
904 case G_IR_NODE_STRUCT:
905 case G_IR_NODE_UNION:
907 /* list others individually rather than with default: so that compiler
908 * warns if new node types are added without adding them to the switch
910 case G_IR_NODE_INVALID:
911 case G_IR_NODE_FUNCTION:
912 case G_IR_NODE_CALLBACK:
914 case G_IR_NODE_FLAGS:
915 case G_IR_NODE_CONSTANT:
916 case G_IR_NODE_INVALID_0:
917 case G_IR_NODE_PARAM:
919 case G_IR_NODE_PROPERTY:
920 case G_IR_NODE_SIGNAL:
921 case G_IR_NODE_VALUE:
922 case G_IR_NODE_VFUNC:
923 case G_IR_NODE_FIELD:
931 _g_ir_node_add_member (GIrNode *node,
932 GIrNodeFunction *member)
934 g_return_if_fail (node != NULL);
935 g_return_if_fail (member != NULL);
939 case G_IR_NODE_OBJECT:
940 case G_IR_NODE_INTERFACE:
942 GIrNodeInterface *iface = (GIrNodeInterface *)node;
944 g_list_insert_sorted (iface->members, member,
945 (GCompareFunc) _g_ir_node_cmp);
948 case G_IR_NODE_BOXED:
950 GIrNodeBoxed *boxed = (GIrNodeBoxed *)node;
952 g_list_insert_sorted (boxed->members, member,
953 (GCompareFunc) _g_ir_node_cmp);
956 case G_IR_NODE_STRUCT:
958 GIrNodeStruct *struct_ = (GIrNodeStruct *)node;
960 g_list_insert_sorted (struct_->members, member,
961 (GCompareFunc) _g_ir_node_cmp);
964 case G_IR_NODE_UNION:
966 GIrNodeUnion *union_ = (GIrNodeUnion *)node;
968 g_list_insert_sorted (union_->members, member,
969 (GCompareFunc) _g_ir_node_cmp);
973 g_error ("Cannot add a member to unknown type tag type %d\n",
980 _g_ir_node_param_direction_string (GIrNodeParam * node)
993 parse_int_value (const gchar *str)
995 return strtoll (str, NULL, 0);
999 parse_uint_value (const gchar *str)
1001 return strtoull (str, NULL, 0);
1005 parse_float_value (const gchar *str)
1007 return strtod (str, NULL);
1011 parse_boolean_value (const gchar *str)
1013 if (g_ascii_strcasecmp (str, "TRUE") == 0)
1016 if (g_ascii_strcasecmp (str, "FALSE") == 0)
1019 return parse_int_value (str) ? TRUE : FALSE;
1023 find_entry_node (GIrTypelibBuild *build,
1028 GIrModule *module = build->module;
1033 GIrNode *result = NULL;
1035 g_assert (name != NULL);
1036 g_assert (strlen (name) > 0);
1038 names = g_strsplit (name, ".", 0);
1039 n_names = g_strv_length (names);
1041 g_error ("Too many name parts");
1043 for (l = module->entries, i = 1; l; l = l->next, i++)
1045 GIrNode *node = (GIrNode *)l->data;
1049 if (node->type != G_IR_NODE_XREF)
1052 if (((GIrNodeXRef *)node)->namespace == NULL ||
1053 strcmp (((GIrNodeXRef *)node)->namespace, names[0]) != 0)
1057 if (strcmp (node->name, names[n_names - 1]) == 0)
1069 GIrNode *node = _g_ir_node_new (G_IR_NODE_XREF, module);
1071 ((GIrNodeXRef *)node)->namespace = g_strdup (names[0]);
1072 node->name = g_strdup (names[1]);
1074 module->entries = g_list_append (module->entries, node);
1077 *idx = g_list_length (module->entries);
1081 g_debug ("Creating XREF: %s %s", names[0], names[1]);
1087 _g_ir_module_fatal (build, -1, "type reference '%s' not found",
1097 find_entry (GIrTypelibBuild *build,
1102 find_entry_node (build, name, &idx);
1108 find_namespace (GIrModule *module,
1114 if (strcmp (module->name, name) == 0)
1117 for (l = module->include_modules; l; l = l->next)
1119 GIrModule *submodule = l->data;
1121 if (strcmp (submodule->name, name) == 0)
1124 target = find_namespace (submodule, name);
1132 _g_ir_find_node (GIrTypelibBuild *build,
1133 GIrModule *src_module,
1137 GIrNode *return_node = NULL;
1138 char **names = g_strsplit (name, ".", 0);
1139 gint n_names = g_strv_length (names);
1140 const char *target_name;
1141 GIrModule *target_module;
1145 target_module = src_module;
1150 target_module = find_namespace (build->module, names[0]);
1151 target_name = names[1];
1154 /* find_namespace() may return NULL. */
1155 if (target_module == NULL)
1158 for (l = target_module->entries; l; l = l->next)
1160 GIrNode *node = (GIrNode *)l->data;
1162 if (strcmp (node->name, target_name) == 0)
1176 get_index_of_member_type (GIrNodeInterface *node,
1183 for (l = node->members; l; l = l->next)
1185 GIrNode *node = l->data;
1187 if (node->type != type)
1192 if (strcmp (node->name, name) == 0)
1200 serialize_type (GIrTypelibBuild *build,
1206 if (G_TYPE_TAG_IS_BASIC(node->tag))
1208 g_string_append_printf (str, "%s%s", g_type_tag_to_string (node->tag),
1209 node->is_pointer ? "*" : "");
1211 else if (node->tag == GI_TYPE_TAG_ARRAY)
1213 if (node->array_type == GI_ARRAY_TYPE_C)
1215 serialize_type (build, node->parameter_type1, str);
1216 g_string_append (str, "[");
1218 if (node->has_length)
1219 g_string_append_printf (str, "length=%d", node->length);
1220 else if (node->has_size)
1221 g_string_append_printf (str, "fixed-size=%d", node->size);
1223 if (node->zero_terminated)
1224 g_string_append_printf (str, "%szero-terminated=1",
1225 node->has_length ? "," : "");
1227 g_string_append (str, "]");
1228 if (node->is_pointer)
1229 g_string_append (str, "*");
1231 else if (node->array_type == GI_ARRAY_TYPE_BYTE_ARRAY)
1233 /* We on purpose skip serializing parameter_type1, which should
1236 g_string_append (str, "GByteArray");
1240 if (node->array_type == GI_ARRAY_TYPE_ARRAY)
1241 g_string_append (str, "GArray");
1243 g_string_append (str, "GPtrArray");
1244 if (node->parameter_type1)
1246 g_string_append (str, "<");
1247 serialize_type (build, node->parameter_type1, str);
1248 g_string_append (str, ">");
1252 else if (node->tag == GI_TYPE_TAG_INTERFACE)
1257 iface = find_entry_node (build, node->giinterface, NULL);
1260 if (iface->type == G_IR_NODE_XREF)
1261 g_string_append_printf (str, "%s.", ((GIrNodeXRef *)iface)->namespace);
1266 g_warning ("Interface for type reference %s not found", node->giinterface);
1267 name = node->giinterface;
1270 g_string_append_printf (str, "%s%s", name,
1271 node->is_pointer ? "*" : "");
1273 else if (node->tag == GI_TYPE_TAG_GLIST)
1275 g_string_append (str, "GList");
1276 if (node->parameter_type1)
1278 g_string_append (str, "<");
1279 serialize_type (build, node->parameter_type1, str);
1280 g_string_append (str, ">");
1283 else if (node->tag == GI_TYPE_TAG_GSLIST)
1285 g_string_append (str, "GSList");
1286 if (node->parameter_type1)
1288 g_string_append (str, "<");
1289 serialize_type (build, node->parameter_type1, str);
1290 g_string_append (str, ">");
1293 else if (node->tag == GI_TYPE_TAG_GHASH)
1295 g_string_append (str, "GHashTable");
1296 if (node->parameter_type1)
1298 g_string_append (str, "<");
1299 serialize_type (build, node->parameter_type1, str);
1300 g_string_append (str, ",");
1301 serialize_type (build, node->parameter_type2, str);
1302 g_string_append (str, ">");
1305 else if (node->tag == GI_TYPE_TAG_ERROR)
1307 g_string_append (str, "GError");
1310 g_string_append (str, "<");
1311 for (i = 0; node->errors[i]; i++)
1314 g_string_append (str, ",");
1315 g_string_append (str, node->errors[i]);
1317 g_string_append (str, ">");
1323 _g_ir_node_build_members (GList **members,
1327 GIrTypelibBuild *build,
1331 GList *l = *members;
1335 GIrNode *member = (GIrNode *)l->data;
1336 GList *next = l->next;
1338 if (member->type == type)
1341 _g_ir_node_build_typelib (member, parent, build, offset, offset2);
1342 *members = g_list_delete_link (*members, l);
1349 _g_ir_node_check_unhandled_members (GList **members,
1350 GIrNodeTypeId container_type)
1357 for (l = *members; l; l = l->next)
1359 GIrNode *member = (GIrNode *)l->data;
1360 g_printerr ("Unhandled '%s' member '%s' type '%s'\n",
1361 _g_ir_node_type_to_string (container_type),
1363 _g_ir_node_type_to_string (member->type));
1366 g_list_free (*members);
1369 g_error ("Unhandled members. Aborting.");
1372 g_list_free (*members);
1378 _g_ir_node_build_typelib (GIrNode *node,
1380 GIrTypelibBuild *build,
1384 gboolean appended_stack;
1385 GHashTable *strings = build->strings;
1386 GHashTable *types = build->types;
1387 guchar *data = build->data;
1389 guint32 old_offset = *offset;
1390 guint32 old_offset2 = *offset2;
1392 g_assert (node != NULL);
1394 g_debug ("build_typelib: %s%s(%s)",
1395 node->name ? node->name : "",
1396 node->name ? " " : "",
1397 _g_ir_node_type_to_string (node->type));
1400 appended_stack = node != (GIrNode*)build->stack->data;
1402 appended_stack = TRUE;
1404 build->stack = g_list_prepend (build->stack, node);
1406 _g_ir_node_compute_offsets (build, node);
1408 /* We should only be building each node once. If we do a typelib expansion, we also
1409 * reset the offset in girmodule.c.
1411 g_assert (node->offset == 0);
1412 node->offset = *offset;
1413 build->nodes_with_attributes = g_list_prepend (build->nodes_with_attributes, node);
1415 build->n_attributes += g_hash_table_size (node->attributes);
1419 case G_IR_NODE_TYPE:
1421 GIrNodeType *type = (GIrNodeType *)node;
1422 SimpleTypeBlob *blob = (SimpleTypeBlob *)&data[*offset];
1424 *offset += sizeof (SimpleTypeBlob);
1426 if (G_TYPE_TAG_IS_BASIC (type->tag))
1428 blob->flags.reserved = 0;
1429 blob->flags.reserved2 = 0;
1430 blob->flags.pointer = type->is_pointer;
1431 blob->flags.reserved3 = 0;
1432 blob->flags.tag = type->tag;
1440 str = g_string_new (0);
1441 serialize_type (build, type, str);
1442 s = g_string_free (str, FALSE);
1445 value = g_hash_table_lookup (types, s);
1448 blob->offset = GPOINTER_TO_UINT (value);
1453 unique_types_count += 1;
1454 g_hash_table_insert (types, s, GUINT_TO_POINTER(*offset2));
1456 blob->offset = *offset2;
1459 case GI_TYPE_TAG_ARRAY:
1461 ArrayTypeBlob *array = (ArrayTypeBlob *)&data[*offset2];
1464 array->pointer = type->is_pointer;
1465 array->reserved = 0;
1466 array->tag = type->tag;
1467 array->zero_terminated = type->zero_terminated;
1468 array->has_length = type->has_length;
1469 array->has_size = type->has_size;
1470 array->array_type = type->array_type;
1471 array->reserved2 = 0;
1472 if (array->has_length)
1473 array->dimensions.length = type->length;
1474 else if (array->has_size)
1475 array->dimensions.size = type->size;
1477 array->dimensions.length = -1;
1479 pos = *offset2 + G_STRUCT_OFFSET (ArrayTypeBlob, type);
1480 *offset2 += sizeof (ArrayTypeBlob);
1482 _g_ir_node_build_typelib ((GIrNode *)type->parameter_type1,
1483 node, build, &pos, offset2);
1487 case GI_TYPE_TAG_INTERFACE:
1489 InterfaceTypeBlob *iface = (InterfaceTypeBlob *)&data[*offset2];
1490 *offset2 += sizeof (InterfaceTypeBlob);
1492 iface->pointer = type->is_pointer;
1493 iface->reserved = 0;
1494 iface->tag = type->tag;
1495 iface->reserved2 = 0;
1496 iface->interface = find_entry (build, type->giinterface);
1501 case GI_TYPE_TAG_GLIST:
1502 case GI_TYPE_TAG_GSLIST:
1504 ParamTypeBlob *param = (ParamTypeBlob *)&data[*offset2];
1508 param->reserved = 0;
1509 param->tag = type->tag;
1510 param->reserved2 = 0;
1513 pos = *offset2 + G_STRUCT_OFFSET (ParamTypeBlob, type);
1514 *offset2 += sizeof (ParamTypeBlob) + sizeof (SimpleTypeBlob);
1516 _g_ir_node_build_typelib ((GIrNode *)type->parameter_type1,
1517 node, build, &pos, offset2);
1521 case GI_TYPE_TAG_GHASH:
1523 ParamTypeBlob *param = (ParamTypeBlob *)&data[*offset2];
1527 param->reserved = 0;
1528 param->tag = type->tag;
1529 param->reserved2 = 0;
1532 pos = *offset2 + G_STRUCT_OFFSET (ParamTypeBlob, type);
1533 *offset2 += sizeof (ParamTypeBlob) + sizeof (SimpleTypeBlob)*2;
1535 _g_ir_node_build_typelib ((GIrNode *)type->parameter_type1,
1536 node, build, &pos, offset2);
1537 _g_ir_node_build_typelib ((GIrNode *)type->parameter_type2,
1538 node, build, &pos, offset2);
1542 case GI_TYPE_TAG_ERROR:
1544 ErrorTypeBlob *blob = (ErrorTypeBlob *)&data[*offset2];
1548 blob->tag = type->tag;
1549 blob->reserved2 = 0;
1550 blob->n_domains = 0;
1552 *offset2 += sizeof (ErrorTypeBlob);
1557 g_error ("Unknown type tag %d\n", type->tag);
1565 case G_IR_NODE_FIELD:
1567 GIrNodeField *field = (GIrNodeField *)node;
1570 blob = (FieldBlob *)&data[*offset];
1572 blob->name = _g_ir_write_string (node->name, strings, data, offset2);
1573 blob->readable = field->readable;
1574 blob->writable = field->writable;
1577 if (field->offset >= 0)
1578 blob->struct_offset = field->offset;
1580 blob->struct_offset = 0xFFFF; /* mark as unknown */
1582 if (field->callback)
1584 blob->has_embedded_type = TRUE;
1585 blob->type.offset = GI_INFO_TYPE_CALLBACK;
1586 *offset += sizeof (FieldBlob);
1587 _g_ir_node_build_typelib ((GIrNode *)field->callback,
1588 node, build, offset, offset2);
1592 blob->has_embedded_type = FALSE;
1593 /* We handle the size member specially below, so subtract it */
1594 *offset += sizeof (FieldBlob) - sizeof (SimpleTypeBlob);
1595 _g_ir_node_build_typelib ((GIrNode *)field->type,
1596 node, build, offset, offset2);
1601 case G_IR_NODE_PROPERTY:
1603 GIrNodeProperty *prop = (GIrNodeProperty *)node;
1604 PropertyBlob *blob = (PropertyBlob *)&data[*offset];
1605 /* We handle the size member specially below, so subtract it */
1606 *offset += sizeof (PropertyBlob) - sizeof (SimpleTypeBlob);
1608 blob->name = _g_ir_write_string (node->name, strings, data, offset2);
1609 blob->deprecated = prop->deprecated;
1610 blob->readable = prop->readable;
1611 blob->writable = prop->writable;
1612 blob->construct = prop->construct;
1613 blob->construct_only = prop->construct_only;
1614 blob->transfer_ownership = prop->transfer;
1615 blob->transfer_container_ownership = prop->shallow_transfer;
1618 _g_ir_node_build_typelib ((GIrNode *)prop->type,
1619 node, build, offset, offset2);
1623 case G_IR_NODE_FUNCTION:
1625 FunctionBlob *blob = (FunctionBlob *)&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 (FunctionBlob);
1635 *offset2 += sizeof (SignatureBlob) + n * sizeof (ArgBlob);
1637 blob->blob_type = BLOB_TYPE_FUNCTION;
1638 blob->deprecated = function->deprecated;
1639 blob->is_static = !function->is_method;
1640 blob->setter = function->is_setter;
1641 blob->getter = function->is_getter;
1642 blob->constructor = function->is_constructor;
1643 blob->wraps_vfunc = function->wraps_vfunc;
1644 blob->throws = function->throws;
1646 blob->name = _g_ir_write_string (node->name, strings, data, offset2);
1647 blob->symbol = _g_ir_write_string (function->symbol, strings, data, offset2);
1648 blob->signature = signature;
1650 /* function->result is special since it doesn't appear in the serialized format but
1651 * we do want the attributes for it to appear
1653 build->nodes_with_attributes = g_list_prepend (build->nodes_with_attributes, function->result);
1654 build->n_attributes += g_hash_table_size (((GIrNode *) function->result)->attributes);
1655 g_assert (((GIrNode *) function->result)->offset == 0);
1656 ((GIrNode *) function->result)->offset = signature;
1658 g_debug ("building function '%s'", function->symbol);
1660 _g_ir_node_build_typelib ((GIrNode *)function->result->type,
1661 node, build, &signature, offset2);
1663 blob2->may_return_null = function->result->allow_none;
1664 blob2->caller_owns_return_value = function->result->transfer;
1665 blob2->caller_owns_return_container = function->result->shallow_transfer;
1666 blob2->skip_return = function->result->skip;
1667 blob2->reserved = 0;
1668 blob2->n_arguments = n;
1672 for (l = function->parameters; l; l = l->next)
1674 GIrNode *param = (GIrNode *)l->data;
1676 _g_ir_node_build_typelib (param, node, build, &signature, offset2);
1682 case G_IR_NODE_CALLBACK:
1684 CallbackBlob *blob = (CallbackBlob *)&data[*offset];
1685 SignatureBlob *blob2 = (SignatureBlob *)&data[*offset2];
1686 GIrNodeFunction *function = (GIrNodeFunction *)node;
1690 signature = *offset2;
1691 n = g_list_length (function->parameters);
1693 *offset += sizeof (CallbackBlob);
1694 *offset2 += sizeof (SignatureBlob) + n * sizeof (ArgBlob);
1696 blob->blob_type = BLOB_TYPE_CALLBACK;
1697 blob->deprecated = function->deprecated;
1699 blob->name = _g_ir_write_string (node->name, strings, data, offset2);
1700 blob->signature = signature;
1702 _g_ir_node_build_typelib ((GIrNode *)function->result->type,
1703 node, build, &signature, offset2);
1705 blob2->may_return_null = function->result->allow_none;
1706 blob2->caller_owns_return_value = function->result->transfer;
1707 blob2->caller_owns_return_container = function->result->shallow_transfer;
1708 blob2->reserved = 0;
1709 blob2->n_arguments = n;
1713 for (l = function->parameters; l; l = l->next)
1715 GIrNode *param = (GIrNode *)l->data;
1717 _g_ir_node_build_typelib (param, node, build, &signature, offset2);
1722 case G_IR_NODE_SIGNAL:
1724 SignalBlob *blob = (SignalBlob *)&data[*offset];
1725 SignatureBlob *blob2 = (SignatureBlob *)&data[*offset2];
1726 GIrNodeSignal *signal = (GIrNodeSignal *)node;
1730 signature = *offset2;
1731 n = g_list_length (signal->parameters);
1733 *offset += sizeof (SignalBlob);
1734 *offset2 += sizeof (SignatureBlob) + n * sizeof (ArgBlob);
1736 blob->deprecated = signal->deprecated;
1737 blob->run_first = signal->run_first;
1738 blob->run_last = signal->run_last;
1739 blob->run_cleanup = signal->run_cleanup;
1740 blob->no_recurse = signal->no_recurse;
1741 blob->detailed = signal->detailed;
1742 blob->action = signal->action;
1743 blob->no_hooks = signal->no_hooks;
1744 blob->has_class_closure = 0; /* FIXME */
1745 blob->true_stops_emit = 0; /* FIXME */
1747 blob->class_closure = 0; /* FIXME */
1748 blob->name = _g_ir_write_string (node->name, strings, data, offset2);
1749 blob->signature = signature;
1751 /* signal->result is special since it doesn't appear in the serialized format but
1752 * we do want the attributes for it to appear
1754 build->nodes_with_attributes = g_list_prepend (build->nodes_with_attributes, signal->result);
1755 build->n_attributes += g_hash_table_size (((GIrNode *) signal->result)->attributes);
1756 g_assert (((GIrNode *) signal->result)->offset == 0);
1757 ((GIrNode *) signal->result)->offset = signature;
1759 _g_ir_node_build_typelib ((GIrNode *)signal->result->type,
1760 node, build, &signature, offset2);
1762 blob2->may_return_null = signal->result->allow_none;
1763 blob2->caller_owns_return_value = signal->result->transfer;
1764 blob2->caller_owns_return_container = signal->result->shallow_transfer;
1765 blob2->reserved = 0;
1766 blob2->n_arguments = n;
1770 for (l = signal->parameters; l; l = l->next)
1772 GIrNode *param = (GIrNode *)l->data;
1774 _g_ir_node_build_typelib (param, node, build, &signature, offset2);
1779 case G_IR_NODE_VFUNC:
1781 VFuncBlob *blob = (VFuncBlob *)&data[*offset];
1782 SignatureBlob *blob2 = (SignatureBlob *)&data[*offset2];
1783 GIrNodeVFunc *vfunc = (GIrNodeVFunc *)node;
1787 signature = *offset2;
1788 n = g_list_length (vfunc->parameters);
1790 *offset += sizeof (VFuncBlob);
1791 *offset2 += sizeof (SignatureBlob) + n * sizeof (ArgBlob);
1793 blob->name = _g_ir_write_string (node->name, strings, data, offset2);
1794 blob->must_chain_up = 0; /* FIXME */
1795 blob->must_be_implemented = 0; /* FIXME */
1796 blob->must_not_be_implemented = 0; /* FIXME */
1797 blob->class_closure = 0; /* FIXME */
1798 blob->throws = vfunc->throws;
1803 int index = get_index_of_member_type ((GIrNodeInterface*)parent, G_IR_NODE_FUNCTION, vfunc->invoker);
1806 g_error ("Unknown member function %s for vfunc %s", vfunc->invoker, node->name);
1808 blob->invoker = (guint) index;
1811 blob->invoker = 0x3ff; /* max of 10 bits */
1813 blob->struct_offset = vfunc->offset;
1814 blob->reserved2 = 0;
1815 blob->signature = signature;
1817 _g_ir_node_build_typelib ((GIrNode *)vfunc->result->type,
1818 node, build, &signature, offset2);
1820 blob2->may_return_null = vfunc->result->allow_none;
1821 blob2->caller_owns_return_value = vfunc->result->transfer;
1822 blob2->caller_owns_return_container = vfunc->result->shallow_transfer;
1823 blob2->reserved = 0;
1824 blob2->n_arguments = n;
1828 for (l = vfunc->parameters; l; l = l->next)
1830 GIrNode *param = (GIrNode *)l->data;
1832 _g_ir_node_build_typelib (param, node, build, &signature, offset2);
1837 case G_IR_NODE_PARAM:
1839 ArgBlob *blob = (ArgBlob *)&data[*offset];
1840 GIrNodeParam *param = (GIrNodeParam *)node;
1842 /* The offset for this one is smaller than the struct because
1843 * we recursively build the simple type inline here below.
1845 *offset += sizeof (ArgBlob) - sizeof (SimpleTypeBlob);
1847 blob->name = _g_ir_write_string (node->name, strings, data, offset2);
1848 blob->in = param->in;
1849 blob->out = param->out;
1850 blob->caller_allocates = param->caller_allocates;
1851 blob->allow_none = param->allow_none;
1852 blob->skip = param->skip;
1853 blob->optional = param->optional;
1854 blob->transfer_ownership = param->transfer;
1855 blob->transfer_container_ownership = param->shallow_transfer;
1856 blob->return_value = param->retval;
1857 blob->scope = param->scope;
1859 blob->closure = param->closure;
1860 blob->destroy = param->destroy;
1862 _g_ir_node_build_typelib ((GIrNode *)param->type, node, build, offset, offset2);
1866 case G_IR_NODE_STRUCT:
1868 StructBlob *blob = (StructBlob *)&data[*offset];
1869 GIrNodeStruct *struct_ = (GIrNodeStruct *)node;
1872 blob->blob_type = BLOB_TYPE_STRUCT;
1873 blob->foreign = struct_->foreign;
1874 blob->deprecated = struct_->deprecated;
1875 blob->is_gtype_struct = struct_->is_gtype_struct;
1877 blob->name = _g_ir_write_string (node->name, strings, data, offset2);
1878 blob->alignment = struct_->alignment;
1879 blob->size = struct_->size;
1881 if (struct_->gtype_name)
1883 blob->unregistered = FALSE;
1884 blob->gtype_name = _g_ir_write_string (struct_->gtype_name, strings, data, offset2);
1885 blob->gtype_init = _g_ir_write_string (struct_->gtype_init, strings, data, offset2);
1889 blob->unregistered = TRUE;
1890 blob->gtype_name = 0;
1891 blob->gtype_init = 0;
1895 blob->n_methods = 0;
1897 *offset += sizeof (StructBlob);
1899 members = g_list_copy (struct_->members);
1901 _g_ir_node_build_members (&members, G_IR_NODE_FIELD, &blob->n_fields,
1902 node, build, offset, offset2);
1904 _g_ir_node_build_members (&members, G_IR_NODE_FUNCTION, &blob->n_methods,
1905 node, build, offset, offset2);
1907 _g_ir_node_check_unhandled_members (&members, node->type);
1909 g_assert (members == NULL);
1913 case G_IR_NODE_BOXED:
1915 StructBlob *blob = (StructBlob *)&data[*offset];
1916 GIrNodeBoxed *boxed = (GIrNodeBoxed *)node;
1919 blob->blob_type = BLOB_TYPE_BOXED;
1920 blob->deprecated = boxed->deprecated;
1921 blob->unregistered = FALSE;
1923 blob->name = _g_ir_write_string (node->name, strings, data, offset2);
1924 blob->gtype_name = _g_ir_write_string (boxed->gtype_name, strings, data, offset2);
1925 blob->gtype_init = _g_ir_write_string (boxed->gtype_init, strings, data, offset2);
1926 blob->alignment = boxed->alignment;
1927 blob->size = boxed->size;
1930 blob->n_methods = 0;
1932 *offset += sizeof (StructBlob);
1934 members = g_list_copy (boxed->members);
1936 _g_ir_node_build_members (&members, G_IR_NODE_FIELD, &blob->n_fields,
1937 node, build, offset, offset2);
1939 _g_ir_node_build_members (&members, G_IR_NODE_FUNCTION, &blob->n_methods,
1940 node, build, offset, offset2);
1942 _g_ir_node_check_unhandled_members (&members, node->type);
1944 g_assert (members == NULL);
1948 case G_IR_NODE_UNION:
1950 UnionBlob *blob = (UnionBlob *)&data[*offset];
1951 GIrNodeUnion *union_ = (GIrNodeUnion *)node;
1954 blob->blob_type = BLOB_TYPE_UNION;
1955 blob->deprecated = union_->deprecated;
1957 blob->name = _g_ir_write_string (node->name, strings, data, offset2);
1958 blob->alignment = union_->alignment;
1959 blob->size = union_->size;
1960 if (union_->gtype_name)
1962 blob->unregistered = FALSE;
1963 blob->gtype_name = _g_ir_write_string (union_->gtype_name, strings, data, offset2);
1964 blob->gtype_init = _g_ir_write_string (union_->gtype_init, strings, data, offset2);
1968 blob->unregistered = TRUE;
1969 blob->gtype_name = 0;
1970 blob->gtype_init = 0;
1974 blob->n_functions = 0;
1976 blob->discriminator_offset = union_->discriminator_offset;
1978 /* We don't support Union discriminators right now. */
1980 if (union_->discriminator_type)
1983 blob->discriminated = TRUE;
1984 _g_ir_node_build_typelib ((GIrNode *)union_->discriminator_type,
1985 build, offset, offset2);
1990 *offset += sizeof (UnionBlob);
1991 blob->discriminated = FALSE;
1992 blob->discriminator_type.offset = 0;
1994 members = g_list_copy (union_->members);
1996 _g_ir_node_build_members (&members, G_IR_NODE_FIELD, &blob->n_fields,
1997 node, build, offset, offset2);
1999 _g_ir_node_build_members (&members, G_IR_NODE_FUNCTION, &blob->n_functions,
2000 node, build, offset, offset2);
2002 _g_ir_node_check_unhandled_members (&members, node->type);
2004 g_assert (members == NULL);
2006 if (union_->discriminator_type)
2008 for (l = union_->discriminators; l; l = l->next)
2010 GIrNode *member = (GIrNode *)l->data;
2012 _g_ir_node_build_typelib (member, node, build, offset, offset2);
2018 case G_IR_NODE_ENUM:
2019 case G_IR_NODE_FLAGS:
2021 EnumBlob *blob = (EnumBlob *)&data[*offset];
2022 GIrNodeEnum *enum_ = (GIrNodeEnum *)node;
2024 *offset += sizeof (EnumBlob);
2026 if (node->type == G_IR_NODE_ENUM)
2027 blob->blob_type = BLOB_TYPE_ENUM;
2029 blob->blob_type = BLOB_TYPE_FLAGS;
2031 blob->deprecated = enum_->deprecated;
2033 blob->storage_type = enum_->storage_type;
2034 blob->name = _g_ir_write_string (node->name, strings, data, offset2);
2035 if (enum_->gtype_name)
2037 blob->unregistered = FALSE;
2038 blob->gtype_name = _g_ir_write_string (enum_->gtype_name, strings, data, offset2);
2039 blob->gtype_init = _g_ir_write_string (enum_->gtype_init, strings, data, offset2);
2043 blob->unregistered = TRUE;
2044 blob->gtype_name = 0;
2045 blob->gtype_init = 0;
2047 if (enum_->error_domain)
2048 blob->error_domain = _g_ir_write_string (enum_->error_domain, strings, data, offset2);
2050 blob->error_domain = 0;
2053 blob->n_methods = 0;
2055 for (l = enum_->values; l; l = l->next)
2057 GIrNode *value = (GIrNode *)l->data;
2060 _g_ir_node_build_typelib (value, node, build, offset, offset2);
2063 for (l = enum_->methods; l; l = l->next)
2065 GIrNode *method = (GIrNode *)l->data;
2068 _g_ir_node_build_typelib (method, node, build, offset, offset2);
2073 case G_IR_NODE_OBJECT:
2075 ObjectBlob *blob = (ObjectBlob *)&data[*offset];
2076 GIrNodeInterface *object = (GIrNodeInterface *)node;
2079 blob->blob_type = BLOB_TYPE_OBJECT;
2080 blob->abstract = object->abstract;
2081 blob->fundamental = object->fundamental;
2082 blob->deprecated = object->deprecated;
2084 blob->name = _g_ir_write_string (node->name, strings, data, offset2);
2085 blob->gtype_name = _g_ir_write_string (object->gtype_name, strings, data, offset2);
2086 blob->gtype_init = _g_ir_write_string (object->gtype_init, strings, data, offset2);
2087 if (object->ref_func)
2088 blob->ref_func = _g_ir_write_string (object->ref_func, strings, data, offset2);
2089 if (object->unref_func)
2090 blob->unref_func = _g_ir_write_string (object->unref_func, strings, data, offset2);
2091 if (object->set_value_func)
2092 blob->set_value_func = _g_ir_write_string (object->set_value_func, strings, data, offset2);
2093 if (object->get_value_func)
2094 blob->get_value_func = _g_ir_write_string (object->get_value_func, strings, data, offset2);
2096 blob->parent = find_entry (build, object->parent);
2099 if (object->glib_type_struct)
2100 blob->gtype_struct = find_entry (build, object->glib_type_struct);
2102 blob->gtype_struct = 0;
2104 blob->n_interfaces = 0;
2106 blob->n_properties = 0;
2107 blob->n_methods = 0;
2108 blob->n_signals = 0;
2110 blob->n_constants = 0;
2112 *offset += sizeof(ObjectBlob);
2113 for (l = object->interfaces; l; l = l->next)
2115 blob->n_interfaces++;
2116 *(guint16*)&data[*offset] = find_entry (build, (gchar *)l->data);
2120 members = g_list_copy (object->members);
2122 *offset = ALIGN_VALUE (*offset, 4);
2123 _g_ir_node_build_members (&members, G_IR_NODE_FIELD, &blob->n_fields,
2124 node, build, offset, offset2);
2126 *offset = ALIGN_VALUE (*offset, 4);
2127 _g_ir_node_build_members (&members, G_IR_NODE_PROPERTY, &blob->n_properties,
2128 node, build, offset, offset2);
2130 *offset = ALIGN_VALUE (*offset, 4);
2131 _g_ir_node_build_members (&members, G_IR_NODE_FUNCTION, &blob->n_methods,
2132 node, build, offset, offset2);
2134 *offset = ALIGN_VALUE (*offset, 4);
2135 _g_ir_node_build_members (&members, G_IR_NODE_SIGNAL, &blob->n_signals,
2136 node, build, offset, offset2);
2138 *offset = ALIGN_VALUE (*offset, 4);
2139 _g_ir_node_build_members (&members, G_IR_NODE_VFUNC, &blob->n_vfuncs,
2140 node, build, offset, offset2);
2142 *offset = ALIGN_VALUE (*offset, 4);
2143 _g_ir_node_build_members (&members, G_IR_NODE_CONSTANT, &blob->n_constants,
2144 node, build, offset, offset2);
2146 _g_ir_node_check_unhandled_members (&members, node->type);
2148 g_assert (members == NULL);
2152 case G_IR_NODE_INTERFACE:
2154 InterfaceBlob *blob = (InterfaceBlob *)&data[*offset];
2155 GIrNodeInterface *iface = (GIrNodeInterface *)node;
2158 blob->blob_type = BLOB_TYPE_INTERFACE;
2159 blob->deprecated = iface->deprecated;
2161 blob->name = _g_ir_write_string (node->name, strings, data, offset2);
2162 blob->gtype_name = _g_ir_write_string (iface->gtype_name, strings, data, offset2);
2163 blob->gtype_init = _g_ir_write_string (iface->gtype_init, strings, data, offset2);
2164 if (iface->glib_type_struct)
2165 blob->gtype_struct = find_entry (build, iface->glib_type_struct);
2167 blob->gtype_struct = 0;
2168 blob->n_prerequisites = 0;
2169 blob->n_properties = 0;
2170 blob->n_methods = 0;
2171 blob->n_signals = 0;
2173 blob->n_constants = 0;
2175 *offset += sizeof (InterfaceBlob);
2176 for (l = iface->prerequisites; l; l = l->next)
2178 blob->n_prerequisites++;
2179 *(guint16*)&data[*offset] = find_entry (build, (gchar *)l->data);
2183 members = g_list_copy (iface->members);
2185 *offset = ALIGN_VALUE (*offset, 4);
2186 _g_ir_node_build_members (&members, G_IR_NODE_PROPERTY, &blob->n_properties,
2187 node, build, offset, offset2);
2189 *offset = ALIGN_VALUE (*offset, 4);
2190 _g_ir_node_build_members (&members, G_IR_NODE_FUNCTION, &blob->n_methods,
2191 node, build, offset, offset2);
2193 *offset = ALIGN_VALUE (*offset, 4);
2194 _g_ir_node_build_members (&members, G_IR_NODE_SIGNAL, &blob->n_signals,
2195 node, build, offset, offset2);
2197 *offset = ALIGN_VALUE (*offset, 4);
2198 _g_ir_node_build_members (&members, G_IR_NODE_VFUNC, &blob->n_vfuncs,
2199 node, build, offset, offset2);
2201 *offset = ALIGN_VALUE (*offset, 4);
2202 _g_ir_node_build_members (&members, G_IR_NODE_CONSTANT, &blob->n_constants,
2203 node, build, offset, offset2);
2205 _g_ir_node_check_unhandled_members (&members, node->type);
2207 g_assert (members == NULL);
2212 case G_IR_NODE_VALUE:
2214 GIrNodeValue *value = (GIrNodeValue *)node;
2215 ValueBlob *blob = (ValueBlob *)&data[*offset];
2216 *offset += sizeof (ValueBlob);
2218 blob->deprecated = value->deprecated;
2220 blob->unsigned_value = value->value >= 0 ? 1 : 0;
2221 blob->name = _g_ir_write_string (node->name, strings, data, offset2);
2222 blob->value = (gint32)value->value;
2226 case G_IR_NODE_CONSTANT:
2228 GIrNodeConstant *constant = (GIrNodeConstant *)node;
2229 ConstantBlob *blob = (ConstantBlob *)&data[*offset];
2232 pos = *offset + G_STRUCT_OFFSET (ConstantBlob, type);
2233 *offset += sizeof (ConstantBlob);
2235 blob->blob_type = BLOB_TYPE_CONSTANT;
2236 blob->deprecated = constant->deprecated;
2238 blob->name = _g_ir_write_string (node->name, strings, data, offset2);
2240 blob->offset = *offset2;
2241 switch (constant->type->tag)
2243 case GI_TYPE_TAG_BOOLEAN:
2245 *(gboolean*)&data[blob->offset] = parse_boolean_value (constant->value);
2247 case GI_TYPE_TAG_INT8:
2249 *(gint8*)&data[blob->offset] = (gint8) parse_int_value (constant->value);
2251 case GI_TYPE_TAG_UINT8:
2253 *(guint8*)&data[blob->offset] = (guint8) parse_uint_value (constant->value);
2255 case GI_TYPE_TAG_INT16:
2257 *(gint16*)&data[blob->offset] = (gint16) parse_int_value (constant->value);
2259 case GI_TYPE_TAG_UINT16:
2261 *(guint16*)&data[blob->offset] = (guint16) parse_uint_value (constant->value);
2263 case GI_TYPE_TAG_INT32:
2265 *(gint32*)&data[blob->offset] = (gint32) parse_int_value (constant->value);
2267 case GI_TYPE_TAG_UINT32:
2269 *(guint32*)&data[blob->offset] = (guint32) parse_uint_value (constant->value);
2271 case GI_TYPE_TAG_INT64:
2273 DO_ALIGNED_COPY(&data[blob->offset], parse_int_value (constant->value), gint64);
2275 case GI_TYPE_TAG_UINT64:
2277 DO_ALIGNED_COPY(&data[blob->offset], parse_uint_value (constant->value), guint64);
2279 case GI_TYPE_TAG_FLOAT:
2280 blob->size = sizeof (gfloat);
2281 DO_ALIGNED_COPY(&data[blob->offset], parse_float_value (constant->value), gfloat);
2283 case GI_TYPE_TAG_DOUBLE:
2284 blob->size = sizeof (gdouble);
2285 DO_ALIGNED_COPY(&data[blob->offset], parse_float_value (constant->value), gdouble);
2287 case GI_TYPE_TAG_UTF8:
2288 case GI_TYPE_TAG_FILENAME:
2289 blob->size = strlen (constant->value) + 1;
2290 memcpy (&data[blob->offset], constant->value, blob->size);
2293 *offset2 += ALIGN_VALUE (blob->size, 4);
2295 _g_ir_node_build_typelib ((GIrNode *)constant->type, node, build, &pos, offset2);
2299 g_assert_not_reached ();
2302 g_debug ("node %s%s%s%p type '%s', offset %d -> %d, offset2 %d -> %d",
2303 node->name ? "'" : "",
2304 node->name ? node->name : "",
2305 node->name ? "' " : "",
2306 node, _g_ir_node_type_to_string (node->type),
2307 old_offset, *offset, old_offset2, *offset2);
2309 if (*offset2 - old_offset2 + *offset - old_offset > _g_ir_node_get_full_size (node))
2310 g_error ("exceeding space reservation; offset: %d (prev %d) offset2: %d (prev %d) nodesize: %d",
2311 *offset, old_offset, *offset2, old_offset2, _g_ir_node_get_full_size (node));
2314 build->stack = g_list_delete_link (build->stack, build->stack);
2317 /* if str is already in the pool, return previous location, otherwise write str
2318 * to the typelib at offset, put it in the pool and update offset. If the
2319 * typelib is not large enough to hold the string, reallocate it.
2322 _g_ir_write_string (const gchar *str,
2323 GHashTable *strings,
2331 string_size += strlen (str);
2333 value = g_hash_table_lookup (strings, str);
2336 return GPOINTER_TO_UINT (value);
2338 unique_string_count += 1;
2339 unique_string_size += strlen (str);
2341 g_hash_table_insert (strings, (gpointer)str, GUINT_TO_POINTER (*offset));
2344 *offset = ALIGN_VALUE (start + strlen (str) + 1, 4);
2346 strcpy ((gchar*)&data[start], str);