1 /* GObject introspection: Metadata 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.
24 #include "gidlmodule.h"
26 #include "gmetadata.h"
28 static gulong string_count
= 0;
29 static gulong unique_string_count
= 0;
30 static gulong string_size
= 0;
31 static gulong unique_string_size
= 0;
32 static gulong types_count
= 0;
33 static gulong unique_types_count
= 0;
39 unique_string_count
= 0;
41 unique_string_size
= 0;
43 unique_types_count
= 0;
49 g_message ("%d strings (%d before sharing), %d bytes (%d before sharing)",
50 unique_string_count
, string_count
, unique_string_size
, string_size
);
51 g_message ("%d types (%d before sharing)", unique_types_count
, types_count
);
54 #define ALIGN_VALUE(this, boundary) \
55 (( ((unsigned long)(this)) + (((unsigned long)(boundary)) -1)) & (~(((unsigned long)(boundary))-1)))
59 g_idl_node_new (GIdlNodeTypeId type
)
61 GIdlNode
*node
= NULL
;
65 case G_IDL_NODE_FUNCTION
:
66 node
= g_malloc0 (sizeof (GIdlNodeFunction
));
69 case G_IDL_NODE_PARAM
:
70 node
= g_malloc0 (sizeof (GIdlNodeParam
));
74 node
= g_malloc0 (sizeof (GIdlNodeType
));
77 case G_IDL_NODE_OBJECT
:
78 case G_IDL_NODE_INTERFACE
:
79 node
= g_malloc0 (sizeof (GIdlNodeInterface
));
82 case G_IDL_NODE_SIGNAL
:
83 node
= g_malloc0 (sizeof (GIdlNodeSignal
));
86 case G_IDL_NODE_PROPERTY
:
87 node
= g_malloc0 (sizeof (GIdlNodeProperty
));
90 case G_IDL_NODE_VFUNC
:
91 node
= g_malloc0 (sizeof (GIdlNodeFunction
));
94 case G_IDL_NODE_FIELD
:
95 node
= g_malloc0 (sizeof (GIdlNodeField
));
99 case G_IDL_NODE_FLAGS
:
100 node
= g_malloc0 (sizeof (GIdlNodeEnum
));
103 case G_IDL_NODE_BOXED
:
104 node
= g_malloc0 (sizeof (GIdlNodeBoxed
));
107 case G_IDL_NODE_STRUCT
:
108 node
= g_malloc0 (sizeof (GIdlNodeStruct
));
111 case G_IDL_NODE_VALUE
:
112 node
= g_malloc0 (sizeof (GIdlNodeValue
));
115 case G_IDL_NODE_CONSTANT
:
116 node
= g_malloc0 (sizeof (GIdlNodeConstant
));
119 case G_IDL_NODE_ERROR_DOMAIN
:
120 node
= g_malloc0 (sizeof (GIdlNodeErrorDomain
));
123 case G_IDL_NODE_XREF
:
124 node
= g_malloc0 (sizeof (GIdlNodeXRef
));
127 case G_IDL_NODE_UNION
:
128 node
= g_malloc0 (sizeof (GIdlNodeUnion
));
132 g_error ("Unhandled node type %d\n", type
);
142 g_idl_node_free (GIdlNode
*node
)
151 case G_IDL_NODE_FUNCTION
:
152 case G_IDL_NODE_CALLBACK
:
154 GIdlNodeFunction
*function
= (GIdlNodeFunction
*)node
;
157 g_free (function
->symbol
);
158 g_idl_node_free ((GIdlNode
*)function
->result
);
159 for (l
= function
->parameters
; l
; l
= l
->next
)
160 g_idl_node_free ((GIdlNode
*)l
->data
);
161 g_list_free (function
->parameters
);
165 case G_IDL_NODE_TYPE
:
167 GIdlNodeType
*type
= (GIdlNodeType
*)node
;
170 g_idl_node_free ((GIdlNode
*)type
->parameter_type1
);
171 g_idl_node_free ((GIdlNode
*)type
->parameter_type2
);
173 g_free (type
->interface
);
174 g_strfreev (type
->errors
);
179 case G_IDL_NODE_PARAM
:
181 GIdlNodeParam
*param
= (GIdlNodeParam
*)node
;
184 g_idl_node_free ((GIdlNode
*)param
->type
);
188 case G_IDL_NODE_PROPERTY
:
190 GIdlNodeProperty
*property
= (GIdlNodeProperty
*)node
;
193 g_idl_node_free ((GIdlNode
*)property
->type
);
197 case G_IDL_NODE_SIGNAL
:
199 GIdlNodeSignal
*signal
= (GIdlNodeSignal
*)node
;
202 for (l
= signal
->parameters
; l
; l
= l
->next
)
203 g_idl_node_free ((GIdlNode
*)l
->data
);
204 g_list_free (signal
->parameters
);
205 g_idl_node_free ((GIdlNode
*)signal
->result
);
209 case G_IDL_NODE_VFUNC
:
211 GIdlNodeVFunc
*vfunc
= (GIdlNodeVFunc
*)node
;
214 for (l
= vfunc
->parameters
; l
; l
= l
->next
)
215 g_idl_node_free ((GIdlNode
*)l
->data
);
216 g_list_free (vfunc
->parameters
);
217 g_idl_node_free ((GIdlNode
*)vfunc
->result
);
221 case G_IDL_NODE_FIELD
:
223 GIdlNodeField
*field
= (GIdlNodeField
*)node
;
226 g_idl_node_free ((GIdlNode
*)field
->type
);
230 case G_IDL_NODE_OBJECT
:
231 case G_IDL_NODE_INTERFACE
:
233 GIdlNodeInterface
*iface
= (GIdlNodeInterface
*)node
;
236 g_free (iface
->gtype_name
);
237 g_free (iface
->gtype_init
);
239 g_free (iface
->parent
);
241 for (l
= iface
->interfaces
; l
; l
= l
->next
)
242 g_free ((GIdlNode
*)l
->data
);
243 g_list_free (iface
->interfaces
);
245 for (l
= iface
->members
; l
; l
= l
->next
)
246 g_idl_node_free ((GIdlNode
*)l
->data
);
247 g_list_free (iface
->members
);
252 case G_IDL_NODE_VALUE
:
254 GIdlNodeValue
*value
= (GIdlNodeValue
*)node
;
260 case G_IDL_NODE_ENUM
:
261 case G_IDL_NODE_FLAGS
:
263 GIdlNodeEnum
*enum_
= (GIdlNodeEnum
*)node
;
266 g_free (enum_
->gtype_name
);
267 g_free (enum_
->gtype_init
);
269 for (l
= enum_
->values
; l
; l
= l
->next
)
270 g_idl_node_free ((GIdlNode
*)l
->data
);
271 g_list_free (enum_
->values
);
275 case G_IDL_NODE_BOXED
:
277 GIdlNodeBoxed
*boxed
= (GIdlNodeBoxed
*)node
;
280 g_free (boxed
->gtype_name
);
281 g_free (boxed
->gtype_init
);
283 for (l
= boxed
->members
; l
; l
= l
->next
)
284 g_idl_node_free ((GIdlNode
*)l
->data
);
285 g_list_free (boxed
->members
);
289 case G_IDL_NODE_STRUCT
:
291 GIdlNodeStruct
*struct_
= (GIdlNodeStruct
*)node
;
294 for (l
= struct_
->members
; l
; l
= l
->next
)
295 g_idl_node_free ((GIdlNode
*)l
->data
);
296 g_list_free (struct_
->members
);
300 case G_IDL_NODE_CONSTANT
:
302 GIdlNodeConstant
*constant
= (GIdlNodeConstant
*)node
;
305 g_free (constant
->value
);
306 g_idl_node_free ((GIdlNode
*)constant
->type
);
310 case G_IDL_NODE_ERROR_DOMAIN
:
312 GIdlNodeErrorDomain
*domain
= (GIdlNodeErrorDomain
*)node
;
315 g_free (domain
->getquark
);
316 g_free (domain
->codes
);
320 case G_IDL_NODE_XREF
:
322 GIdlNodeXRef
*xref
= (GIdlNodeXRef
*)node
;
325 g_free (xref
->namespace);
329 case G_IDL_NODE_UNION
:
331 GIdlNodeUnion
*union_
= (GIdlNodeUnion
*)node
;
334 g_free (union_
->gtype_name
);
335 g_free (union_
->gtype_init
);
337 g_idl_node_free ((GIdlNode
*)union_
->discriminator_type
);
338 for (l
= union_
->members
; l
; l
= l
->next
)
339 g_idl_node_free ((GIdlNode
*)l
->data
);
340 for (l
= union_
->discriminators
; l
; l
= l
->next
)
341 g_idl_node_free ((GIdlNode
*)l
->data
);
346 g_error ("Unhandled node type %d\n", node
->type
);
353 /* returns the fixed size of the blob */
355 g_idl_node_get_size (GIdlNode
*node
)
362 case G_IDL_NODE_CALLBACK
:
366 case G_IDL_NODE_FUNCTION
:
370 case G_IDL_NODE_PARAM
:
374 case G_IDL_NODE_TYPE
:
378 case G_IDL_NODE_OBJECT
:
380 GIdlNodeInterface
*iface
= (GIdlNodeInterface
*)node
;
382 n
= g_list_length (iface
->interfaces
);
383 size
= 32 + 2 * (n
+ (n
% 2));
385 for (l
= iface
->members
; l
; l
= l
->next
)
386 size
+= g_idl_node_get_size ((GIdlNode
*)l
->data
);
390 case G_IDL_NODE_INTERFACE
:
392 GIdlNodeInterface
*iface
= (GIdlNodeInterface
*)node
;
394 n
= g_list_length (iface
->prerequisites
);
395 size
= 28 + 2 * (n
+ (n
% 2));
397 for (l
= iface
->members
; l
; l
= l
->next
)
398 size
+= g_idl_node_get_size ((GIdlNode
*)l
->data
);
402 case G_IDL_NODE_ENUM
:
403 case G_IDL_NODE_FLAGS
:
405 GIdlNodeEnum
*enum_
= (GIdlNodeEnum
*)node
;
408 for (l
= enum_
->values
; l
; l
= l
->next
)
409 size
+= g_idl_node_get_size ((GIdlNode
*)l
->data
);
413 case G_IDL_NODE_VALUE
:
417 case G_IDL_NODE_STRUCT
:
419 GIdlNodeStruct
*struct_
= (GIdlNodeStruct
*)node
;
422 for (l
= struct_
->members
; l
; l
= l
->next
)
423 size
+= g_idl_node_get_size ((GIdlNode
*)l
->data
);
427 case G_IDL_NODE_BOXED
:
429 GIdlNodeBoxed
*boxed
= (GIdlNodeBoxed
*)node
;
432 for (l
= boxed
->members
; l
; l
= l
->next
)
433 size
+= g_idl_node_get_size ((GIdlNode
*)l
->data
);
437 case G_IDL_NODE_PROPERTY
:
441 case G_IDL_NODE_SIGNAL
:
445 case G_IDL_NODE_VFUNC
:
449 case G_IDL_NODE_FIELD
:
453 case G_IDL_NODE_CONSTANT
:
457 case G_IDL_NODE_ERROR_DOMAIN
:
461 case G_IDL_NODE_XREF
:
465 case G_IDL_NODE_UNION
:
467 GIdlNodeUnion
*union_
= (GIdlNodeUnion
*)node
;
470 for (l
= union_
->members
; l
; l
= l
->next
)
471 size
+= g_idl_node_get_size ((GIdlNode
*)l
->data
);
472 for (l
= union_
->discriminators
; l
; l
= l
->next
)
473 size
+= g_idl_node_get_size ((GIdlNode
*)l
->data
);
478 g_error ("Unhandled node type %d\n", node
->type
);
482 g_debug ("node %d type %d size %d", node
, node
->type
, size
);
487 /* returns the full size of the blob including variable-size parts */
489 g_idl_node_get_full_size (GIdlNode
*node
)
494 g_assert (node
!= NULL
);
498 case G_IDL_NODE_CALLBACK
:
500 GIdlNodeFunction
*function
= (GIdlNodeFunction
*)node
;
502 size
+= ALIGN_VALUE (strlen (node
->name
) + 1, 4);
503 for (l
= function
->parameters
; l
; l
= l
->next
)
504 size
+= g_idl_node_get_full_size ((GIdlNode
*)l
->data
);
505 size
+= g_idl_node_get_full_size ((GIdlNode
*)function
->result
);
509 case G_IDL_NODE_FUNCTION
:
511 GIdlNodeFunction
*function
= (GIdlNodeFunction
*)node
;
513 size
+= ALIGN_VALUE (strlen (node
->name
) + 1, 4);
514 size
+= ALIGN_VALUE (strlen (function
->symbol
) + 1, 4);
515 for (l
= function
->parameters
; l
; l
= l
->next
)
516 size
+= g_idl_node_get_full_size ((GIdlNode
*)l
->data
);
517 size
+= g_idl_node_get_full_size ((GIdlNode
*)function
->result
);
521 case G_IDL_NODE_PARAM
:
523 GIdlNodeParam
*param
= (GIdlNodeParam
*)node
;
527 size
+= ALIGN_VALUE (strlen (node
->name
) + 1, 4);
528 size
+= g_idl_node_get_full_size ((GIdlNode
*)param
->type
);
532 case G_IDL_NODE_TYPE
:
534 GIdlNodeType
*type
= (GIdlNodeType
*)node
;
535 if (type
->tag
< TYPE_TAG_ARRAY
)
543 if (type
->parameter_type1
)
544 size
+= g_idl_node_get_full_size ((GIdlNode
*)type
->parameter_type1
);
546 case TYPE_TAG_INTERFACE
:
552 if (type
->parameter_type1
)
553 size
+= g_idl_node_get_full_size ((GIdlNode
*)type
->parameter_type1
);
557 if (type
->parameter_type1
)
558 size
+= g_idl_node_get_full_size ((GIdlNode
*)type
->parameter_type1
);
559 if (type
->parameter_type2
)
560 size
+= g_idl_node_get_full_size ((GIdlNode
*)type
->parameter_type2
);
567 n
= g_strv_length (type
->errors
);
571 size
= 4 + 4 + 2 * (n
+ n
% 2);
575 g_error ("Unknown type tag %d\n", type
->tag
);
582 case G_IDL_NODE_OBJECT
:
584 GIdlNodeInterface
*iface
= (GIdlNodeInterface
*)node
;
586 n
= g_list_length (iface
->interfaces
);
589 size
+= ALIGN_VALUE (strlen (iface
->parent
) + 1, 4);
590 size
+= ALIGN_VALUE (strlen (node
->name
) + 1, 4);
591 size
+= ALIGN_VALUE (strlen (iface
->gtype_name
) + 1, 4);
592 size
+= ALIGN_VALUE (strlen (iface
->gtype_init
) + 1, 4);
593 size
+= 2 * (n
+ (n
% 2));
595 for (l
= iface
->members
; l
; l
= l
->next
)
596 size
+= g_idl_node_get_full_size ((GIdlNode
*)l
->data
);
600 case G_IDL_NODE_INTERFACE
:
602 GIdlNodeInterface
*iface
= (GIdlNodeInterface
*)node
;
604 n
= g_list_length (iface
->prerequisites
);
606 size
+= ALIGN_VALUE (strlen (node
->name
) + 1, 4);
607 size
+= ALIGN_VALUE (strlen (iface
->gtype_name
) + 1, 4);
608 size
+= ALIGN_VALUE (strlen (iface
->gtype_init
) + 1, 4);
609 size
+= 2 * (n
+ (n
% 2));
611 for (l
= iface
->members
; l
; l
= l
->next
)
612 size
+= g_idl_node_get_full_size ((GIdlNode
*)l
->data
);
616 case G_IDL_NODE_ENUM
:
617 case G_IDL_NODE_FLAGS
:
619 GIdlNodeEnum
*enum_
= (GIdlNodeEnum
*)node
;
622 size
+= ALIGN_VALUE (strlen (node
->name
) + 1, 4);
623 if (enum_
->gtype_name
)
625 size
+= ALIGN_VALUE (strlen (enum_
->gtype_name
) + 1, 4);
626 size
+= ALIGN_VALUE (strlen (enum_
->gtype_init
) + 1, 4);
629 for (l
= enum_
->values
; l
; l
= l
->next
)
630 size
+= g_idl_node_get_full_size ((GIdlNode
*)l
->data
);
634 case G_IDL_NODE_VALUE
:
636 GIdlNodeValue
*value
= (GIdlNodeValue
*)node
;
639 size
+= ALIGN_VALUE (strlen (node
->name
) + 1, 4);
643 case G_IDL_NODE_STRUCT
:
645 GIdlNodeStruct
*struct_
= (GIdlNodeStruct
*)node
;
648 size
+= ALIGN_VALUE (strlen (node
->name
) + 1, 4);
649 for (l
= struct_
->members
; l
; l
= l
->next
)
650 size
+= g_idl_node_get_full_size ((GIdlNode
*)l
->data
);
654 case G_IDL_NODE_BOXED
:
656 GIdlNodeBoxed
*boxed
= (GIdlNodeBoxed
*)node
;
659 size
+= ALIGN_VALUE (strlen (node
->name
) + 1, 4);
660 if (boxed
->gtype_name
)
662 size
+= ALIGN_VALUE (strlen (boxed
->gtype_name
) + 1, 4);
663 size
+= ALIGN_VALUE (strlen (boxed
->gtype_init
) + 1, 4);
665 for (l
= boxed
->members
; l
; l
= l
->next
)
666 size
+= g_idl_node_get_full_size ((GIdlNode
*)l
->data
);
670 case G_IDL_NODE_PROPERTY
:
672 GIdlNodeProperty
*prop
= (GIdlNodeProperty
*)node
;
675 size
+= ALIGN_VALUE (strlen (node
->name
) + 1, 4);
676 size
+= g_idl_node_get_full_size ((GIdlNode
*)prop
->type
);
680 case G_IDL_NODE_SIGNAL
:
682 GIdlNodeSignal
*signal
= (GIdlNodeSignal
*)node
;
685 size
+= ALIGN_VALUE (strlen (node
->name
) + 1, 4);
686 for (l
= signal
->parameters
; l
; l
= l
->next
)
687 size
+= g_idl_node_get_full_size ((GIdlNode
*)l
->data
);
688 size
+= g_idl_node_get_full_size ((GIdlNode
*)signal
->result
);
692 case G_IDL_NODE_VFUNC
:
694 GIdlNodeVFunc
*vfunc
= (GIdlNodeVFunc
*)node
;
697 size
+= ALIGN_VALUE (strlen (node
->name
) + 1, 4);
698 for (l
= vfunc
->parameters
; l
; l
= l
->next
)
699 size
+= g_idl_node_get_full_size ((GIdlNode
*)l
->data
);
700 size
+= g_idl_node_get_full_size ((GIdlNode
*)vfunc
->result
);
704 case G_IDL_NODE_FIELD
:
706 GIdlNodeField
*field
= (GIdlNodeField
*)node
;
709 size
+= ALIGN_VALUE (strlen (node
->name
) + 1, 4);
710 size
+= g_idl_node_get_full_size ((GIdlNode
*)field
->type
);
714 case G_IDL_NODE_CONSTANT
:
716 GIdlNodeConstant
*constant
= (GIdlNodeConstant
*)node
;
719 size
+= ALIGN_VALUE (strlen (node
->name
) + 1, 4);
720 /* FIXME non-string values */
721 size
+= ALIGN_VALUE (strlen (constant
->value
) + 1, 4);
722 size
+= g_idl_node_get_full_size ((GIdlNode
*)constant
->type
);
726 case G_IDL_NODE_ERROR_DOMAIN
:
728 GIdlNodeErrorDomain
*domain
= (GIdlNodeErrorDomain
*)node
;
731 size
+= ALIGN_VALUE (strlen (node
->name
) + 1, 4);
732 size
+= ALIGN_VALUE (strlen (domain
->getquark
) + 1, 4);
736 case G_IDL_NODE_XREF
:
738 GIdlNodeXRef
*xref
= (GIdlNodeXRef
*)node
;
741 size
+= ALIGN_VALUE (strlen (node
->name
) + 1, 4);
742 size
+= ALIGN_VALUE (strlen (xref
->namespace) + 1, 4);
746 case G_IDL_NODE_UNION
:
748 GIdlNodeUnion
*union_
= (GIdlNodeUnion
*)node
;
751 size
+= ALIGN_VALUE (strlen (node
->name
) + 1, 4);
752 for (l
= union_
->members
; l
; l
= l
->next
)
753 size
+= g_idl_node_get_full_size ((GIdlNode
*)l
->data
);
754 for (l
= union_
->discriminators
; l
; l
= l
->next
)
755 size
+= g_idl_node_get_full_size ((GIdlNode
*)l
->data
);
760 g_error ("Unknown type tag %d\n", node
->type
);
764 g_debug ("node %d type %d full size %d", node
, node
->type
, size
);
770 parse_int_value (const gchar
*str
)
772 return strtoll (str
, NULL
, 0);
776 parse_uint_value (const gchar
*str
)
778 return strtoull (str
, NULL
, 0);
782 parse_float_value (const gchar
*str
)
784 return strtod (str
, NULL
);
788 parse_boolean_value (const gchar
*str
)
790 if (strcmp (str
, "TRUE") == 0)
793 if (strcmp (str
, "FALSE") == 0)
796 return parse_int_value (str
) ? TRUE
: FALSE
;
800 find_entry_node (GIdlModule
*module
,
810 GIdlNode
*result
= NULL
;
812 names
= g_strsplit (name
, ".", 0);
813 n_names
= g_strv_length (names
);
815 g_error ("Too many name parts");
817 for (l
= module
->entries
, i
= 1; l
; l
= l
->next
, i
++)
819 GIdlNode
*node
= (GIdlNode
*)l
->data
;
823 if (node
->type
!= G_IDL_NODE_XREF
)
826 if (((GIdlNodeXRef
*)node
)->namespace == NULL
||
827 strcmp (((GIdlNodeXRef
*)node
)->namespace, names
[0]) != 0)
831 if (strcmp (node
->name
, names
[n_names
- 1]) == 0)
843 GIdlNode
*node
= g_idl_node_new (G_IDL_NODE_XREF
);
845 ((GIdlNodeXRef
*)node
)->namespace = g_strdup (names
[0]);
846 node
->name
= g_strdup (names
[1]);
848 module
->entries
= g_list_append (module
->entries
, node
);
851 *idx
= g_list_length (module
->entries
);
858 g_warning ("Entry %s not found", name
);
868 find_entry (GIdlModule
*module
,
874 find_entry_node (module
, modules
, name
, &idx
);
880 serialize_type (GIdlModule
*module
,
886 const gchar
* basic
[] = {
911 g_string_append_printf (str
, "%s%s",
912 basic
[node
->tag
], node
->is_pointer
? "*" : "");
914 else if (node
->tag
== 20)
916 serialize_type (module
, modules
, node
->parameter_type1
, str
);
917 g_string_append (str
, "[");
919 if (node
->has_length
)
920 g_string_append_printf (str
, "length=%d", node
->length
);
922 if (node
->zero_terminated
)
923 g_string_append_printf (str
, "%szero-terminated=1",
924 node
->has_length
? "," : "");
926 g_string_append (str
, "]");
928 else if (node
->tag
== 21)
933 iface
= find_entry_node (module
, modules
, node
->interface
, NULL
);
938 g_warning ("Interface for type reference %s not found", node
->interface
);
939 name
= node
->interface
;
942 g_string_append_printf (str
, "%s%s", name
, node
->is_pointer
? "*" : "");
944 else if (node
->tag
== 22)
946 g_string_append (str
, "GList");
947 if (node
->parameter_type1
)
949 g_string_append (str
, "<");
950 serialize_type (module
, modules
, node
->parameter_type1
, str
);
951 g_string_append (str
, ">");
954 else if (node
->tag
== 23)
956 g_string_append (str
, "GSList");
957 if (node
->parameter_type1
)
959 g_string_append (str
, "<");
960 serialize_type (module
, modules
, node
->parameter_type1
, str
);
961 g_string_append (str
, ">");
964 else if (node
->tag
== 24)
966 g_string_append (str
, "GHashTable<");
967 if (node
->parameter_type1
)
969 g_string_append (str
, "<");
970 serialize_type (module
, modules
, node
->parameter_type1
, str
);
971 g_string_append (str
, ",");
972 serialize_type (module
, modules
, node
->parameter_type2
, str
);
973 g_string_append (str
, ">");
976 else if (node
->tag
== 25)
978 g_string_append (str
, "GError");
981 g_string_append (str
, "<");
982 for (i
= 0; node
->errors
[i
]; i
++)
985 g_string_append (str
, ",");
986 g_string_append (str
, node
->errors
[i
]);
988 g_string_append (str
, ">");
994 g_idl_node_build_metadata (GIdlNode
*node
,
1004 guint32 old_offset
= *offset
;
1005 guint32 old_offset2
= *offset2
;
1009 case G_IDL_NODE_TYPE
:
1011 GIdlNodeType
*type
= (GIdlNodeType
*)node
;
1012 SimpleTypeBlob
*blob
= (SimpleTypeBlob
*)&data
[*offset
];
1016 if (type
->tag
< TYPE_TAG_ARRAY
)
1019 blob
->reserved2
= 0;
1020 blob
->pointer
= type
->is_pointer
;
1021 blob
->reserved3
= 0;
1022 blob
->tag
= type
->tag
;
1030 str
= g_string_new (0);
1031 serialize_type (module
, modules
, type
, str
);
1032 s
= g_string_free (str
, FALSE
);
1035 value
= g_hash_table_lookup (types
, s
);
1038 blob
->offset
= GPOINTER_TO_INT (value
);
1043 unique_types_count
+= 1;
1044 g_hash_table_insert (types
, s
, GINT_TO_POINTER(*offset2
));
1046 blob
->offset
= *offset2
;
1049 case TYPE_TAG_ARRAY
:
1051 ArrayTypeBlob
*array
= (ArrayTypeBlob
*)&data
[*offset2
];
1055 array
->reserved
= 0;
1056 array
->tag
= type
->tag
;
1057 array
->zero_terminated
= type
->zero_terminated
;
1058 array
->has_length
= type
->has_length
;
1059 array
->reserved2
= 0;
1060 array
->length
= type
->length
;
1065 g_idl_node_build_metadata ((GIdlNode
*)type
->parameter_type1
,
1066 module
, modules
, strings
, types
,
1067 data
, &pos
, offset2
);
1071 case TYPE_TAG_INTERFACE
:
1073 InterfaceTypeBlob
*iface
= (InterfaceTypeBlob
*)&data
[*offset2
];
1076 iface
->pointer
= type
->is_pointer
;
1077 iface
->reserved
= 0;
1078 iface
->tag
= type
->tag
;
1079 iface
->reserved2
= 0;
1080 iface
->interface
= find_entry (module
, modules
, type
->interface
);
1086 case TYPE_TAG_SLIST
:
1088 ParamTypeBlob
*param
= (ParamTypeBlob
*)&data
[*offset2
];
1092 param
->reserved
= 0;
1093 param
->tag
= type
->tag
;
1094 param
->reserved2
= 0;
1100 g_idl_node_build_metadata ((GIdlNode
*)type
->parameter_type1
,
1101 module
, modules
, strings
, types
,
1102 data
, &pos
, offset2
);
1108 ParamTypeBlob
*param
= (ParamTypeBlob
*)&data
[*offset2
];
1112 param
->reserved
= 0;
1113 param
->tag
= type
->tag
;
1114 param
->reserved2
= 0;
1120 g_idl_node_build_metadata ((GIdlNode
*)type
->parameter_type1
,
1121 module
, modules
, strings
, types
,
1122 data
, &pos
, offset2
);
1123 g_idl_node_build_metadata ((GIdlNode
*)type
->parameter_type2
,
1124 module
, modules
, strings
, types
,
1125 data
, &pos
, offset2
);
1129 case TYPE_TAG_ERROR
:
1131 ErrorTypeBlob
*blob
= (ErrorTypeBlob
*)&data
[*offset2
];
1136 blob
->tag
= type
->tag
;
1137 blob
->reserved2
= 0;
1139 blob
->n_domains
= g_strv_length (type
->errors
);
1141 blob
->n_domains
= 0;
1143 *offset2
= ALIGN_VALUE (*offset2
+ 4 + 2 * blob
->n_domains
, 4);
1144 for (i
= 0; i
< blob
->n_domains
; i
++)
1145 blob
->domains
[i
] = find_entry (module
, modules
, type
->errors
[i
]);
1150 g_error ("Unknown type tag %d\n", type
->tag
);
1158 case G_IDL_NODE_FIELD
:
1160 GIdlNodeField
*field
= (GIdlNodeField
*)node
;
1163 blob
= (FieldBlob
*)&data
[*offset
];
1166 blob
->name
= write_string (node
->name
, strings
, data
, offset2
);
1167 blob
->readable
= field
->readable
;
1168 blob
->writable
= field
->writable
;
1171 blob
->struct_offset
= field
->offset
;
1173 g_idl_node_build_metadata ((GIdlNode
*)field
->type
,
1174 module
, modules
, strings
, types
,
1175 data
, offset
, offset2
);
1179 case G_IDL_NODE_PROPERTY
:
1181 GIdlNodeProperty
*prop
= (GIdlNodeProperty
*)node
;
1182 PropertyBlob
*blob
= (PropertyBlob
*)&data
[*offset
];
1185 blob
->name
= write_string (node
->name
, strings
, data
, offset2
);
1186 blob
->deprecated
= prop
->deprecated
;
1187 blob
->readable
= prop
->readable
;
1188 blob
->writable
= prop
->writable
;
1189 blob
->construct
= prop
->construct
;
1190 blob
->construct_only
= prop
->construct_only
;
1193 g_idl_node_build_metadata ((GIdlNode
*)prop
->type
,
1194 module
, modules
, strings
, types
,
1195 data
, offset
, offset2
);
1199 case G_IDL_NODE_FUNCTION
:
1201 FunctionBlob
*blob
= (FunctionBlob
*)&data
[*offset
];
1202 SignatureBlob
*blob2
= (SignatureBlob
*)&data
[*offset2
];
1203 GIdlNodeFunction
*function
= (GIdlNodeFunction
*)node
;
1204 guint32 signature
, res
;
1207 signature
= *offset2
;
1208 n
= g_list_length (function
->parameters
);
1211 *offset2
+= 8 + n
* 12;
1213 blob
->blob_type
= BLOB_TYPE_FUNCTION
;
1214 blob
->deprecated
= function
->deprecated
;
1215 blob
->setter
= function
->is_setter
;
1216 blob
->getter
= function
->is_getter
;
1217 blob
->constructor
= function
->is_constructor
;
1218 blob
->wraps_vfunc
= function
->wraps_vfunc
;
1221 blob
->name
= write_string (node
->name
, strings
, data
, offset2
);
1222 blob
->symbol
= write_string (function
->symbol
, strings
, data
, offset2
);
1223 blob
->signature
= signature
;
1225 g_idl_node_build_metadata ((GIdlNode
*)function
->result
->type
,
1226 module
, modules
, strings
, types
,
1227 data
, &signature
, offset2
);
1229 blob2
->may_return_null
= function
->result
->null_ok
;
1230 blob2
->caller_owns_return_value
= function
->result
->transfer
;
1231 blob2
->caller_owns_return_container
= function
->result
->shallow_transfer
;
1232 blob2
->reserved
= 0;
1233 blob2
->n_arguments
= n
;
1237 for (l
= function
->parameters
; l
; l
= l
->next
)
1239 GIdlNode
*param
= (GIdlNode
*)l
->data
;
1241 g_idl_node_build_metadata (param
,
1242 module
, modules
, strings
, types
,
1243 data
, &signature
, offset2
);
1248 case G_IDL_NODE_CALLBACK
:
1250 CallbackBlob
*blob
= (CallbackBlob
*)&data
[*offset
];
1251 SignatureBlob
*blob2
= (SignatureBlob
*)&data
[*offset2
];
1252 GIdlNodeFunction
*function
= (GIdlNodeFunction
*)node
;
1253 guint32 signature
, res
;
1256 signature
= *offset2
;
1257 n
= g_list_length (function
->parameters
);
1260 *offset2
+= 8 + n
* 12;
1262 blob
->blob_type
= BLOB_TYPE_CALLBACK
;
1263 blob
->deprecated
= function
->deprecated
;
1265 blob
->name
= write_string (node
->name
, strings
, data
, offset2
);
1266 blob
->signature
= signature
;
1268 g_idl_node_build_metadata ((GIdlNode
*)function
->result
->type
,
1269 module
, modules
, strings
, types
,
1270 data
, &signature
, offset2
);
1272 blob2
->may_return_null
= function
->result
->null_ok
;
1273 blob2
->caller_owns_return_value
= function
->result
->transfer
;
1274 blob2
->caller_owns_return_container
= function
->result
->shallow_transfer
;
1275 blob2
->reserved
= 0;
1276 blob2
->n_arguments
= n
;
1280 for (l
= function
->parameters
; l
; l
= l
->next
)
1282 GIdlNode
*param
= (GIdlNode
*)l
->data
;
1284 g_idl_node_build_metadata (param
,
1285 module
, modules
, strings
, types
,
1286 data
, &signature
, offset2
);
1291 case G_IDL_NODE_SIGNAL
:
1293 SignalBlob
*blob
= (SignalBlob
*)&data
[*offset
];
1294 SignatureBlob
*blob2
= (SignatureBlob
*)&data
[*offset2
];
1295 GIdlNodeSignal
*signal
= (GIdlNodeSignal
*)node
;
1296 guint32 signature
, res
;
1299 signature
= *offset2
;
1300 n
= g_list_length (signal
->parameters
);
1303 *offset2
+= 8 + n
* 12;
1305 blob
->deprecated
= signal
->deprecated
;
1306 blob
->run_first
= signal
->run_first
;
1307 blob
->run_last
= signal
->run_last
;
1308 blob
->run_cleanup
= signal
->run_cleanup
;
1309 blob
->no_recurse
= signal
->no_recurse
;
1310 blob
->detailed
= signal
->detailed
;
1311 blob
->action
= signal
->action
;
1312 blob
->no_hooks
= signal
->no_hooks
;
1313 blob
->has_class_closure
= 0; /* FIXME */
1314 blob
->true_stops_emit
= 0; /* FIXME */
1316 blob
->class_closure
= 0; /* FIXME */
1317 blob
->name
= write_string (node
->name
, strings
, data
, offset2
);
1318 blob
->signature
= signature
;
1320 g_idl_node_build_metadata ((GIdlNode
*)signal
->result
->type
,
1321 module
, modules
, strings
, types
,
1322 data
, &signature
, offset2
);
1324 blob2
->may_return_null
= signal
->result
->null_ok
;
1325 blob2
->caller_owns_return_value
= signal
->result
->transfer
;
1326 blob2
->caller_owns_return_container
= signal
->result
->shallow_transfer
;
1327 blob2
->reserved
= 0;
1328 blob2
->n_arguments
= n
;
1332 for (l
= signal
->parameters
; l
; l
= l
->next
)
1334 GIdlNode
*param
= (GIdlNode
*)l
->data
;
1336 g_idl_node_build_metadata (param
, module
, modules
, strings
, types
,
1337 data
, &signature
, offset2
);
1342 case G_IDL_NODE_VFUNC
:
1344 VFuncBlob
*blob
= (VFuncBlob
*)&data
[*offset
];
1345 SignatureBlob
*blob2
= (SignatureBlob
*)&data
[*offset2
];
1346 GIdlNodeVFunc
*vfunc
= (GIdlNodeVFunc
*)node
;
1347 guint32 signature
, res
;
1350 signature
= *offset2
;
1351 n
= g_list_length (vfunc
->parameters
);
1354 *offset2
+= 8 + n
* 12;
1356 blob
->name
= write_string (node
->name
, strings
, data
, offset2
);
1357 blob
->must_chain_up
= 0; /* FIXME */
1358 blob
->must_be_implemented
= 0; /* FIXME */
1359 blob
->must_not_be_implemented
= 0; /* FIXME */
1360 blob
->class_closure
= 0; /* FIXME */
1363 blob
->struct_offset
= vfunc
->offset
;
1364 blob
->reserved2
= 0;
1365 blob
->signature
= signature
;
1367 g_idl_node_build_metadata ((GIdlNode
*)vfunc
->result
->type
,
1368 module
, modules
, strings
, types
,
1369 data
, &signature
, offset2
);
1371 blob2
->may_return_null
= vfunc
->result
->null_ok
;
1372 blob2
->caller_owns_return_value
= vfunc
->result
->transfer
;
1373 blob2
->caller_owns_return_container
= vfunc
->result
->shallow_transfer
;
1374 blob2
->reserved
= 0;
1375 blob2
->n_arguments
= n
;
1379 for (l
= vfunc
->parameters
; l
; l
= l
->next
)
1381 GIdlNode
*param
= (GIdlNode
*)l
->data
;
1383 g_idl_node_build_metadata (param
, module
, modules
, strings
,
1384 types
, data
, &signature
, offset2
);
1389 case G_IDL_NODE_PARAM
:
1391 ArgBlob
*blob
= (ArgBlob
*)&data
[*offset
];
1392 GIdlNodeParam
*param
= (GIdlNodeParam
*)node
;
1397 blob
->name
= write_string (node
->name
, strings
, data
, offset2
);
1398 blob
->in
= param
->in
;
1399 blob
->out
= param
->out
;
1400 blob
->dipper
= param
->dipper
;
1401 blob
->null_ok
= param
->null_ok
;
1402 blob
->optional
= param
->optional
;
1403 blob
->transfer_ownership
= param
->transfer
;
1404 blob
->transfer_container_ownership
= param
->shallow_transfer
;
1405 blob
->return_value
= param
->retval
;
1408 g_idl_node_build_metadata ((GIdlNode
*)param
->type
, module
, modules
,
1409 strings
, types
, data
, offset
, offset2
);
1413 case G_IDL_NODE_STRUCT
:
1415 StructBlob
*blob
= (StructBlob
*)&data
[*offset
];
1416 GIdlNodeStruct
*struct_
= (GIdlNodeStruct
*)node
;
1419 blob
->blob_type
= BLOB_TYPE_STRUCT
;
1420 blob
->deprecated
= struct_
->deprecated
;
1421 blob
->unregistered
= TRUE
;
1423 blob
->name
= write_string (node
->name
, strings
, data
, offset2
);
1424 blob
->gtype_name
= 0;
1425 blob
->gtype_init
= 0;
1428 blob
->n_methods
= 0;
1431 for (l
= struct_
->members
; l
; l
= l
->next
)
1433 GIdlNode
*member
= (GIdlNode
*)l
->data
;
1435 if (member
->type
== G_IDL_NODE_FIELD
)
1438 g_idl_node_build_metadata (member
, module
, modules
, strings
,
1439 types
, data
, offset
, offset2
);
1443 for (l
= struct_
->members
; l
; l
= l
->next
)
1445 GIdlNode
*member
= (GIdlNode
*)l
->data
;
1447 if (member
->type
== G_IDL_NODE_FUNCTION
)
1450 g_idl_node_build_metadata (member
, module
, modules
, strings
,
1451 types
, data
, offset
, offset2
);
1457 case G_IDL_NODE_BOXED
:
1459 StructBlob
*blob
= (StructBlob
*)&data
[*offset
];
1460 GIdlNodeBoxed
*boxed
= (GIdlNodeBoxed
*)node
;
1462 blob
->blob_type
= BLOB_TYPE_BOXED
;
1463 blob
->deprecated
= boxed
->deprecated
;
1464 blob
->unregistered
= FALSE
;
1466 blob
->name
= write_string (node
->name
, strings
, data
, offset2
);
1467 blob
->gtype_name
= write_string (boxed
->gtype_name
, strings
, data
, offset2
);
1468 blob
->gtype_init
= write_string (boxed
->gtype_init
, strings
, data
, offset2
);
1471 blob
->n_methods
= 0;
1474 for (l
= boxed
->members
; l
; l
= l
->next
)
1476 GIdlNode
*member
= (GIdlNode
*)l
->data
;
1478 if (member
->type
== G_IDL_NODE_FIELD
)
1481 g_idl_node_build_metadata (member
, module
, modules
, strings
,
1482 types
, data
, offset
, offset2
);
1486 for (l
= boxed
->members
; l
; l
= l
->next
)
1488 GIdlNode
*member
= (GIdlNode
*)l
->data
;
1490 if (member
->type
== G_IDL_NODE_FUNCTION
)
1493 g_idl_node_build_metadata (member
, module
, modules
, strings
,
1494 types
, data
, offset
, offset2
);
1500 case G_IDL_NODE_UNION
:
1502 UnionBlob
*blob
= (UnionBlob
*)&data
[*offset
];
1503 GIdlNodeUnion
*union_
= (GIdlNodeUnion
*)node
;
1505 blob
->blob_type
= BLOB_TYPE_UNION
;
1506 blob
->deprecated
= union_
->deprecated
;
1508 blob
->name
= write_string (node
->name
, strings
, data
, offset2
);
1509 if (union_
->gtype_name
)
1511 blob
->unregistered
= FALSE
;
1512 blob
->gtype_name
= write_string (union_
->gtype_name
, strings
, data
, offset2
);
1513 blob
->gtype_init
= write_string (union_
->gtype_init
, strings
, data
, offset2
);
1517 blob
->unregistered
= TRUE
;
1518 blob
->gtype_name
= 0;
1519 blob
->gtype_init
= 0;
1523 blob
->n_functions
= 0;
1525 blob
->discriminator_offset
= union_
->discriminator_offset
;
1527 if (union_
->discriminator_type
)
1530 blob
->discriminated
= TRUE
;
1531 g_idl_node_build_metadata ((GIdlNode
*)union_
->discriminator_type
,
1532 module
, modules
, strings
, types
,
1533 data
, offset
, offset2
);
1538 blob
->discriminated
= FALSE
;
1539 blob
->discriminator_type
.offset
= 0;
1543 for (l
= union_
->members
; l
; l
= l
->next
)
1545 GIdlNode
*member
= (GIdlNode
*)l
->data
;
1547 if (member
->type
== G_IDL_NODE_FIELD
)
1550 g_idl_node_build_metadata (member
, module
, modules
, strings
,
1551 types
, data
, offset
, offset2
);
1555 for (l
= union_
->members
; l
; l
= l
->next
)
1557 GIdlNode
*member
= (GIdlNode
*)l
->data
;
1559 if (member
->type
== G_IDL_NODE_FUNCTION
)
1561 blob
->n_functions
++;
1562 g_idl_node_build_metadata (member
, module
, modules
, strings
,
1563 types
, data
, offset
, offset2
);
1567 if (union_
->discriminator_type
)
1569 for (l
= union_
->discriminators
; l
; l
= l
->next
)
1571 GIdlNode
*member
= (GIdlNode
*)l
->data
;
1573 g_idl_node_build_metadata (member
, module
, modules
, strings
,
1574 types
, data
, offset
, offset2
);
1580 case G_IDL_NODE_ENUM
:
1581 case G_IDL_NODE_FLAGS
:
1583 EnumBlob
*blob
= (EnumBlob
*)&data
[*offset
];
1584 GIdlNodeEnum
*enum_
= (GIdlNodeEnum
*)node
;
1588 if (node
->type
== G_IDL_NODE_ENUM
)
1589 blob
->blob_type
= BLOB_TYPE_ENUM
;
1591 blob
->blob_type
= BLOB_TYPE_FLAGS
;
1593 blob
->deprecated
= enum_
->deprecated
;
1595 blob
->name
= write_string (node
->name
, strings
, data
, offset2
);
1596 if (enum_
->gtype_name
)
1598 blob
->unregistered
= FALSE
;
1599 blob
->gtype_name
= write_string (enum_
->gtype_name
, strings
, data
, offset2
);
1600 blob
->gtype_init
= write_string (enum_
->gtype_init
, strings
, data
, offset2
);
1604 blob
->unregistered
= TRUE
;
1605 blob
->gtype_name
= 0;
1606 blob
->gtype_init
= 0;
1610 blob
->reserved2
= 0;
1612 for (l
= enum_
->values
; l
; l
= l
->next
)
1614 GIdlNode
*value
= (GIdlNode
*)l
->data
;
1617 g_idl_node_build_metadata (value
, module
, modules
, strings
, types
,
1618 data
, offset
, offset2
);
1623 case G_IDL_NODE_OBJECT
:
1625 ObjectBlob
*blob
= (ObjectBlob
*)&data
[*offset
];
1626 GIdlNodeInterface
*object
= (GIdlNodeInterface
*)node
;
1629 blob
->blob_type
= BLOB_TYPE_OBJECT
;
1630 blob
->deprecated
= object
->deprecated
;
1632 blob
->name
= write_string (node
->name
, strings
, data
, offset2
);
1633 blob
->gtype_name
= write_string (object
->gtype_name
, strings
, data
, offset2
);
1634 blob
->gtype_init
= write_string (object
->gtype_init
, strings
, data
, offset2
);
1636 blob
->parent
= find_entry (module
, modules
, object
->parent
);
1640 blob
->n_interfaces
= 0;
1642 blob
->n_properties
= 0;
1643 blob
->n_methods
= 0;
1644 blob
->n_signals
= 0;
1646 blob
->n_constants
= 0;
1649 for (l
= object
->interfaces
; l
; l
= l
->next
)
1651 blob
->n_interfaces
++;
1652 *(guint16
*)&data
[*offset
] = find_entry (module
, modules
, (gchar
*)l
->data
);
1656 *offset
= ALIGN_VALUE (*offset
, 4);
1657 for (l
= object
->members
; l
; l
= l
->next
)
1659 GIdlNode
*member
= (GIdlNode
*)l
->data
;
1661 if (member
->type
== G_IDL_NODE_FIELD
)
1664 g_idl_node_build_metadata (member
, module
, modules
, strings
,
1665 types
, data
, offset
, offset2
);
1669 *offset
= ALIGN_VALUE (*offset
, 4);
1670 for (l
= object
->members
; l
; l
= l
->next
)
1672 GIdlNode
*member
= (GIdlNode
*)l
->data
;
1674 if (member
->type
== G_IDL_NODE_PROPERTY
)
1676 blob
->n_properties
++;
1677 g_idl_node_build_metadata (member
, module
, modules
, strings
,
1678 types
, data
, offset
, offset2
);
1682 *offset
= ALIGN_VALUE (*offset
, 4);
1683 for (l
= object
->members
; l
; l
= l
->next
)
1685 GIdlNode
*member
= (GIdlNode
*)l
->data
;
1687 if (member
->type
== G_IDL_NODE_FUNCTION
)
1690 g_idl_node_build_metadata (member
, module
, modules
, strings
,
1691 types
, data
, offset
, offset2
);
1695 *offset
= ALIGN_VALUE (*offset
, 4);
1696 for (l
= object
->members
; l
; l
= l
->next
)
1698 GIdlNode
*member
= (GIdlNode
*)l
->data
;
1700 if (member
->type
== G_IDL_NODE_SIGNAL
)
1703 g_idl_node_build_metadata (member
, module
, modules
, strings
,
1704 types
, data
, offset
, offset2
);
1708 *offset
= ALIGN_VALUE (*offset
, 4);
1709 for (l
= object
->members
; l
; l
= l
->next
)
1711 GIdlNode
*member
= (GIdlNode
*)l
->data
;
1713 if (member
->type
== G_IDL_NODE_VFUNC
)
1716 g_idl_node_build_metadata (member
, module
, modules
, strings
,
1717 types
, data
, offset
, offset2
);
1721 *offset
= ALIGN_VALUE (*offset
, 4);
1722 for (l
= object
->members
; l
; l
= l
->next
)
1724 GIdlNode
*member
= (GIdlNode
*)l
->data
;
1726 if (member
->type
== G_IDL_NODE_CONSTANT
)
1728 blob
->n_constants
++;
1729 g_idl_node_build_metadata (member
, module
, modules
, strings
,
1730 types
, data
, offset
, offset2
);
1736 case G_IDL_NODE_INTERFACE
:
1738 InterfaceBlob
*blob
= (InterfaceBlob
*)&data
[*offset
];
1739 GIdlNodeInterface
*iface
= (GIdlNodeInterface
*)node
;
1741 blob
->blob_type
= BLOB_TYPE_INTERFACE
;
1742 blob
->deprecated
= iface
->deprecated
;
1744 blob
->name
= write_string (node
->name
, strings
, data
, offset2
);
1745 blob
->gtype_name
= write_string (iface
->gtype_name
, strings
, data
, offset2
);
1746 blob
->gtype_init
= write_string (iface
->gtype_init
, strings
, data
, offset2
);
1747 blob
->n_prerequisites
= 0;
1748 blob
->n_properties
= 0;
1749 blob
->n_methods
= 0;
1750 blob
->n_signals
= 0;
1752 blob
->n_constants
= 0;
1755 for (l
= iface
->prerequisites
; l
; l
= l
->next
)
1757 blob
->n_prerequisites
++;
1758 *(guint16
*)&data
[*offset
] = find_entry (module
, modules
, (gchar
*)l
->data
);
1762 *offset
= ALIGN_VALUE (*offset
, 4);
1763 for (l
= iface
->members
; l
; l
= l
->next
)
1765 GIdlNode
*member
= (GIdlNode
*)l
->data
;
1767 if (member
->type
== G_IDL_NODE_PROPERTY
)
1769 blob
->n_properties
++;
1770 g_idl_node_build_metadata (member
, module
, modules
, strings
,
1771 types
, data
, offset
, offset2
);
1775 *offset
= ALIGN_VALUE (*offset
, 4);
1776 for (l
= iface
->members
; l
; l
= l
->next
)
1778 GIdlNode
*member
= (GIdlNode
*)l
->data
;
1780 if (member
->type
== G_IDL_NODE_FUNCTION
)
1783 g_idl_node_build_metadata (member
, module
, modules
, strings
,
1784 types
, data
, offset
, offset2
);
1788 *offset
= ALIGN_VALUE (*offset
, 4);
1789 for (l
= iface
->members
; l
; l
= l
->next
)
1791 GIdlNode
*member
= (GIdlNode
*)l
->data
;
1793 if (member
->type
== G_IDL_NODE_SIGNAL
)
1796 g_idl_node_build_metadata (member
, module
, modules
, strings
,
1797 types
, data
, offset
, offset2
);
1801 *offset
= ALIGN_VALUE (*offset
, 4);
1802 for (l
= iface
->members
; l
; l
= l
->next
)
1804 GIdlNode
*member
= (GIdlNode
*)l
->data
;
1806 if (member
->type
== G_IDL_NODE_VFUNC
)
1809 g_idl_node_build_metadata (member
, module
, modules
, strings
,
1810 types
, data
, offset
, offset2
);
1814 *offset
= ALIGN_VALUE (*offset
, 4);
1815 for (l
= iface
->members
; l
; l
= l
->next
)
1817 GIdlNode
*member
= (GIdlNode
*)l
->data
;
1819 if (member
->type
== G_IDL_NODE_CONSTANT
)
1821 blob
->n_constants
++;
1822 g_idl_node_build_metadata (member
, module
, modules
, strings
,
1823 types
, data
, offset
, offset2
);
1830 case G_IDL_NODE_VALUE
:
1832 GIdlNodeValue
*value
= (GIdlNodeValue
*)node
;
1833 ValueBlob
*blob
= (ValueBlob
*)&data
[*offset
];
1836 blob
->deprecated
= value
->deprecated
;
1838 blob
->name
= write_string (node
->name
, strings
, data
, offset2
);
1839 blob
->value
= value
->value
;
1843 case G_IDL_NODE_ERROR_DOMAIN
:
1845 GIdlNodeErrorDomain
*domain
= (GIdlNodeErrorDomain
*)node
;
1846 ErrorDomainBlob
*blob
= (ErrorDomainBlob
*)&data
[*offset
];
1849 blob
->blob_type
= BLOB_TYPE_ERROR_DOMAIN
;
1850 blob
->deprecated
= domain
->deprecated
;
1852 blob
->name
= write_string (node
->name
, strings
, data
, offset2
);
1853 blob
->get_quark
= write_string (domain
->getquark
, strings
, data
, offset2
);
1854 blob
->error_codes
= find_entry (module
, modules
, domain
->codes
);
1855 blob
->reserved2
= 0;
1859 case G_IDL_NODE_CONSTANT
:
1861 GIdlNodeConstant
*constant
= (GIdlNodeConstant
*)node
;
1862 ConstantBlob
*blob
= (ConstantBlob
*)&data
[*offset
];
1868 blob
->blob_type
= BLOB_TYPE_CONSTANT
;
1869 blob
->deprecated
= constant
->deprecated
;
1871 blob
->name
= write_string (node
->name
, strings
, data
, offset2
);
1873 blob
->offset
= *offset2
;
1874 switch (constant
->type
->tag
)
1876 case TYPE_TAG_BOOLEAN
:
1878 *(gboolean
*)&data
[blob
->offset
] = parse_boolean_value (constant
->value
);
1882 *(gint8
*)&data
[blob
->offset
] = (gint8
) parse_int_value (constant
->value
);
1884 case TYPE_TAG_UINT8
:
1886 *(guint8
*)&data
[blob
->offset
] = (guint8
) parse_uint_value (constant
->value
);
1888 case TYPE_TAG_INT16
:
1890 *(gint16
*)&data
[blob
->offset
] = (gint16
) parse_int_value (constant
->value
);
1892 case TYPE_TAG_UINT16
:
1894 *(guint16
*)&data
[blob
->offset
] = (guint16
) parse_uint_value (constant
->value
);
1896 case TYPE_TAG_INT32
:
1898 *(gint32
*)&data
[blob
->offset
] = (gint32
) parse_int_value (constant
->value
);
1900 case TYPE_TAG_UINT32
:
1902 *(guint32
*)&data
[blob
->offset
] = (guint32
) parse_uint_value (constant
->value
);
1904 case TYPE_TAG_INT64
:
1906 *(gint64
*)&data
[blob
->offset
] = (gint64
) parse_int_value (constant
->value
);
1908 case TYPE_TAG_UINT64
:
1910 *(guint64
*)&data
[blob
->offset
] = (guint64
) parse_uint_value (constant
->value
);
1913 blob
->size
= sizeof (gint
);
1914 *(gint
*)&data
[blob
->offset
] = (gint
) parse_int_value (constant
->value
);
1917 blob
->size
= sizeof (guint
);
1918 *(gint
*)&data
[blob
->offset
] = (guint
) parse_uint_value (constant
->value
);
1920 case TYPE_TAG_SSIZE
: /* FIXME */
1922 blob
->size
= sizeof (glong
);
1923 *(glong
*)&data
[blob
->offset
] = (glong
) parse_int_value (constant
->value
);
1925 case TYPE_TAG_SIZE
: /* FIXME */
1926 case TYPE_TAG_ULONG
:
1927 blob
->size
= sizeof (gulong
);
1928 *(gulong
*)&data
[blob
->offset
] = (gulong
) parse_uint_value (constant
->value
);
1930 case TYPE_TAG_FLOAT
:
1931 blob
->size
= sizeof (gfloat
);
1932 *(gfloat
*)&data
[blob
->offset
] = (gfloat
) parse_float_value (constant
->value
);
1934 case TYPE_TAG_DOUBLE
:
1935 blob
->size
= sizeof (gdouble
);
1936 *(gdouble
*)&data
[blob
->offset
] = (gdouble
) parse_float_value (constant
->value
);
1939 case TYPE_TAG_FILENAME
:
1940 blob
->size
= strlen (constant
->value
) + 1;
1941 memcpy (&data
[blob
->offset
], constant
->value
, blob
->size
);
1944 *offset2
+= ALIGN_VALUE (blob
->size
, 4);
1946 g_idl_node_build_metadata ((GIdlNode
*)constant
->type
, module
, modules
,
1947 strings
, types
, data
, &pos
, offset2
);
1952 g_debug ("node %p type %d, offset %d -> %d, offset2 %d -> %d",
1953 node
, node
->type
, old_offset
, *offset
, old_offset2
, *offset2
);
1955 if (*offset2
- old_offset2
+ *offset
- old_offset
> g_idl_node_get_full_size (node
))
1956 g_error ("exceeding space reservation !!");
1959 /* if str is already in the pool, return previous location, otherwise write str
1960 * to the metadata at offset, put it in the pool and update offset. If the
1961 * metadata is not large enough to hold the string, reallocate it.
1964 write_string (const gchar
*str
,
1965 GHashTable
*strings
,
1973 string_size
+= strlen (str
);
1975 value
= g_hash_table_lookup (strings
, str
);
1978 return GPOINTER_TO_INT (value
);
1980 unique_string_count
+= 1;
1981 unique_string_size
+= strlen (str
);
1983 g_hash_table_insert (strings
, (gpointer
)str
, GINT_TO_POINTER (*offset
));
1986 *offset
= ALIGN_VALUE (start
+ strlen (str
) + 1, 4);
1988 strcpy ((gchar
*)&data
[start
], str
);