1 /* GObject introspection: Repository implementation
3 * Copyright (C) 2005 Matthias Clasen
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2 of the License, or (at your option) any later version.
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, write to the
17 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 * Boston, MA 02111-1307, USA.
25 #include <glib-object.h>
34 GIRepository *repository;
35 GIBaseInfo *container;
41 struct _GIUnresolvedInfo
45 GIBaseInfo *container;
48 const gchar *namespace;
51 struct _GICallableInfo
56 struct _GIFunctionInfo
58 GICallableInfo callable;
61 struct _GICallbackInfo
63 GICallableInfo callable;
66 struct _GIRegisteredTypeInfo
73 GIRegisteredTypeInfo registered;
78 GIRegisteredTypeInfo registered;
83 GIRegisteredTypeInfo registered;
86 struct _GIInterfaceInfo
88 GIRegisteredTypeInfo registered;
91 struct _GIConstantInfo
103 GICallableInfo callable;
108 GICallableInfo callable;
111 struct _GIPropertyInfo
133 GIRegisteredTypeInfo registered;
139 g_info_new_full (GIInfoType type,
140 GIRepository *repository,
141 GIBaseInfo *container,
147 g_return_val_if_fail (container != NULL || repository != NULL, NULL);
149 info = g_new0 (GIBaseInfo, 1);
154 info->typelib = typelib;
155 info->offset = offset;
158 info->container = g_base_info_ref (container);
160 info->repository = g_object_ref (repository);
166 g_info_new (GIInfoType type,
167 GIBaseInfo *container,
171 return g_info_new_full (type, container->repository, container, typelib, offset);
175 g_info_from_entry (GIRepository *repository,
180 DirEntry *entry = g_typelib_get_dir_entry (typelib, index);
183 result = g_info_new_full (entry->blob_type, repository, NULL, typelib, entry->offset);
186 const gchar *namespace = g_typelib_get_string (typelib, entry->offset);
187 const gchar *name = g_typelib_get_string (typelib, entry->name);
189 result = g_irepository_find_by_name (repository, namespace, name);
192 GIUnresolvedInfo *unresolved;
194 unresolved = g_new0 (GIUnresolvedInfo, 1);
196 unresolved->type = GI_INFO_TYPE_UNRESOLVED;
197 unresolved->ref_count = 1;
198 unresolved->container = NULL;
199 unresolved->name = name;
200 unresolved->namespace = namespace;
202 return (GIBaseInfo*)unresolved;
210 /* GIBaseInfo functions */
212 g_base_info_ref (GIBaseInfo *info)
220 g_base_info_unref (GIBaseInfo *info)
222 g_assert (info->ref_count > 0);
225 if (!info->ref_count)
228 g_base_info_unref (info->container);
230 if (info->repository)
231 g_object_unref (info->repository);
238 g_base_info_get_type (GIBaseInfo *info)
245 g_base_info_get_name (GIBaseInfo *info)
247 g_assert (info->ref_count > 0);
250 case GI_INFO_TYPE_FUNCTION:
251 case GI_INFO_TYPE_CALLBACK:
252 case GI_INFO_TYPE_STRUCT:
253 case GI_INFO_TYPE_BOXED:
254 case GI_INFO_TYPE_ENUM:
255 case GI_INFO_TYPE_FLAGS:
256 case GI_INFO_TYPE_OBJECT:
257 case GI_INFO_TYPE_INTERFACE:
258 case GI_INFO_TYPE_CONSTANT:
259 case GI_INFO_TYPE_ERROR_DOMAIN:
260 case GI_INFO_TYPE_UNION:
262 CommonBlob *blob = (CommonBlob *)&info->typelib->data[info->offset];
264 return g_typelib_get_string (info->typelib, blob->name);
268 case GI_INFO_TYPE_VALUE:
270 ValueBlob *blob = (ValueBlob *)&info->typelib->data[info->offset];
272 return g_typelib_get_string (info->typelib, blob->name);
276 case GI_INFO_TYPE_SIGNAL:
278 SignalBlob *blob = (SignalBlob *)&info->typelib->data[info->offset];
280 return g_typelib_get_string (info->typelib, blob->name);
284 case GI_INFO_TYPE_PROPERTY:
286 PropertyBlob *blob = (PropertyBlob *)&info->typelib->data[info->offset];
288 return g_typelib_get_string (info->typelib, blob->name);
292 case GI_INFO_TYPE_VFUNC:
294 VFuncBlob *blob = (VFuncBlob *)&info->typelib->data[info->offset];
296 return g_typelib_get_string (info->typelib, blob->name);
300 case GI_INFO_TYPE_FIELD:
302 FieldBlob *blob = (FieldBlob *)&info->typelib->data[info->offset];
304 return g_typelib_get_string (info->typelib, blob->name);
308 case GI_INFO_TYPE_ARG:
310 ArgBlob *blob = (ArgBlob *)&info->typelib->data[info->offset];
312 return g_typelib_get_string (info->typelib, blob->name);
315 case GI_INFO_TYPE_UNRESOLVED:
317 GIUnresolvedInfo *unresolved = (GIUnresolvedInfo *)info;
319 return unresolved->name;
322 case GI_INFO_TYPE_TYPE:
324 g_assert_not_reached ();
332 g_base_info_get_namespace (GIBaseInfo *info)
334 Header *header = (Header *)info->typelib->data;
336 g_assert (info->ref_count > 0);
338 if (info->type == GI_INFO_TYPE_UNRESOLVED)
340 GIUnresolvedInfo *unresolved = (GIUnresolvedInfo *)info;
342 return unresolved->namespace;
345 return g_typelib_get_string (info->typelib, header->namespace);
349 g_base_info_is_deprecated (GIBaseInfo *info)
353 case GI_INFO_TYPE_FUNCTION:
354 case GI_INFO_TYPE_CALLBACK:
355 case GI_INFO_TYPE_STRUCT:
356 case GI_INFO_TYPE_BOXED:
357 case GI_INFO_TYPE_ENUM:
358 case GI_INFO_TYPE_FLAGS:
359 case GI_INFO_TYPE_OBJECT:
360 case GI_INFO_TYPE_INTERFACE:
361 case GI_INFO_TYPE_CONSTANT:
362 case GI_INFO_TYPE_ERROR_DOMAIN:
364 CommonBlob *blob = (CommonBlob *)&info->typelib->data[info->offset];
366 return blob->deprecated;
370 case GI_INFO_TYPE_VALUE:
372 ValueBlob *blob = (ValueBlob *)&info->typelib->data[info->offset];
374 return blob->deprecated;
378 case GI_INFO_TYPE_SIGNAL:
380 SignalBlob *blob = (SignalBlob *)&info->typelib->data[info->offset];
382 return blob->deprecated;
386 case GI_INFO_TYPE_PROPERTY:
388 PropertyBlob *blob = (PropertyBlob *)&info->typelib->data[info->offset];
390 return blob->deprecated;
394 case GI_INFO_TYPE_VFUNC:
395 case GI_INFO_TYPE_FIELD:
396 case GI_INFO_TYPE_ARG:
397 case GI_INFO_TYPE_TYPE:
399 /* no deprecation flag for these */
406 cmp_annotation (const void *av,
409 const AnnotationBlob *a = av;
410 const AnnotationBlob *b = bv;
412 if (b->offset < a->offset)
415 if (b->offset > a->offset)
422 g_base_info_get_annotation (GIBaseInfo *info,
425 GIBaseInfo *base = (GIBaseInfo *)info;
426 Header *header = (Header *)base->typelib->data;
427 AnnotationBlob blob, *first, *after, *res, *next;
430 blob.offset = base->offset;
432 first = (AnnotationBlob *) &base->typelib->data[header->annotations];
433 after = (AnnotationBlob *) &base->typelib->data[header->annotations +
434 header->n_annotations * header->annotation_blob_size];
436 res = bsearch (&blob, first, header->n_annotations,
437 header->annotation_blob_size, cmp_annotation);
446 next = res -= header->annotation_blob_size;
448 while (next >= first && next->offset == base->offset);
455 rname = g_typelib_get_string (base->typelib, res->name);
456 if (strcmp (name, rname) == 0)
457 return g_typelib_get_string (base->typelib, res->value);
459 next = res += header->annotation_blob_size;
461 while (next < after && next->offset == base->offset);
467 g_base_info_get_container (GIBaseInfo *info)
469 return info->container;
473 g_base_info_get_typelib (GIBaseInfo *info)
475 return info->typelib;
478 /* GIFunctionInfo functions */
480 g_function_info_get_symbol (GIFunctionInfo *info)
482 GIBaseInfo *base = (GIBaseInfo *)info;
483 FunctionBlob *blob = (FunctionBlob *)&base->typelib->data[base->offset];
485 return g_typelib_get_string (base->typelib, blob->symbol);
489 g_function_info_get_flags (GIFunctionInfo *info)
491 GIFunctionInfoFlags flags;
492 GIBaseInfo *base = (GIBaseInfo *)info;
493 FunctionBlob *blob = (FunctionBlob *)&base->typelib->data[base->offset];
497 /* Make sure we don't flag Constructors as methods */
498 if (!blob->constructor && !blob->is_static)
499 flags = flags | GI_FUNCTION_IS_METHOD;
501 if (blob->constructor)
502 flags = flags | GI_FUNCTION_IS_CONSTRUCTOR;
505 flags = flags | GI_FUNCTION_IS_GETTER;
508 flags = flags | GI_FUNCTION_IS_SETTER;
510 if (blob->wraps_vfunc)
511 flags = flags | GI_FUNCTION_WRAPS_VFUNC;
514 flags = flags | GI_FUNCTION_THROWS;
520 g_function_info_get_property (GIFunctionInfo *info)
522 GIBaseInfo *base = (GIBaseInfo *)info;
523 FunctionBlob *blob = (FunctionBlob *)&base->typelib->data[base->offset];
524 GIInterfaceInfo *container = (GIInterfaceInfo *)base->container;
526 return g_interface_info_get_property (container, blob->index);
530 g_function_info_get_vfunc (GIFunctionInfo *info)
532 GIBaseInfo *base = (GIBaseInfo *)info;
533 FunctionBlob *blob = (FunctionBlob *)&base->typelib->data[base->offset];
534 GIInterfaceInfo *container = (GIInterfaceInfo *)base->container;
536 return g_interface_info_get_vfunc (container, blob->index);
540 /* GICallableInfo functions */
542 signature_offset (GICallableInfo *info)
545 switch (info->base.type)
547 case GI_INFO_TYPE_FUNCTION:
548 sigoff = G_STRUCT_OFFSET (FunctionBlob, signature);
550 case GI_INFO_TYPE_VFUNC:
551 sigoff = G_STRUCT_OFFSET (VFuncBlob, signature);
553 case GI_INFO_TYPE_CALLBACK:
554 sigoff = G_STRUCT_OFFSET (CallbackBlob, signature);
556 case GI_INFO_TYPE_SIGNAL:
557 sigoff = G_STRUCT_OFFSET (SignalBlob, signature);
561 return *(guint32 *)&info->base.typelib->data[info->base.offset + sigoff];
566 g_type_info_new (GIBaseInfo *container,
570 SimpleTypeBlob *type = (SimpleTypeBlob *)&typelib->data[offset];
572 return (GITypeInfo *) g_info_new (GI_INFO_TYPE_TYPE, container, typelib,
573 (type->reserved == 0 && type->reserved2 == 0) ? offset : type->offset);
577 * g_callable_info_get_return_type:
578 * @info: a #GICallableInfo
580 * Get the return type of a callable item as
583 * Returns: a #GITypeInfo idexing the TypeBlob for the
584 * return type of #info
587 g_callable_info_get_return_type (GICallableInfo *info)
589 GIBaseInfo *base = (GIBaseInfo *)info;
592 offset = signature_offset (info);
594 return g_type_info_new (base, base->typelib, offset);
598 * g_callable_info_may_return_null:
599 * @info: a #GICallableInfo
601 * See if a callable could return NULL.
603 * Returns: TRUE if callable could return NULL
606 g_callable_info_may_return_null (GICallableInfo *info)
608 GIBaseInfo *base = (GIBaseInfo *)info;
609 SignatureBlob *blob = (SignatureBlob *)&base->typelib->data[signature_offset (info)];
611 return blob->may_return_null;
615 * g_callable_info_get_caller_owns:
616 * @info: a #GICallableInfo
618 * See whether the caller owns the return value
621 * Returns: TRUE if the caller owns the return value, FALSE otherwise.
624 g_callable_info_get_caller_owns (GICallableInfo *info)
626 GIBaseInfo *base = (GIBaseInfo *)info;
627 SignatureBlob *blob = (SignatureBlob *)&base->typelib->data[signature_offset (info)];
629 if (blob->caller_owns_return_value)
630 return GI_TRANSFER_EVERYTHING;
631 else if (blob->caller_owns_return_container)
632 return GI_TRANSFER_CONTAINER;
634 return GI_TRANSFER_NOTHING;
638 * g_callable_info_get_n_args:
639 * @info: a #GICallableInfo
641 * Get the number of arguments (both IN and OUT) for this callable.
643 * Returns: The number of arguments this callable expects.
646 g_callable_info_get_n_args (GICallableInfo *info)
648 GIBaseInfo *base = (GIBaseInfo *)info;
652 offset = signature_offset (info);
653 blob = (SignatureBlob *)&base->typelib->data[offset];
655 return blob->n_arguments;
659 * g_callable_info_get_arg:
660 * @info: a #GICallableInfo
662 * Get information about a particular argument of this callable.
664 * Returns: A #GIArgInfo indexing the typelib on the given argument.
667 g_callable_info_get_arg (GICallableInfo *info,
670 GIBaseInfo *base = (GIBaseInfo *)info;
671 Header *header = (Header *)base->typelib->data;
674 offset = signature_offset (info);
676 return (GIArgInfo *) g_info_new (GI_INFO_TYPE_ARG, base, base->typelib,
677 offset + header->signature_blob_size + n * header->arg_blob_size);
680 /* GIArgInfo function */
682 g_arg_info_get_direction (GIArgInfo *info)
684 GIBaseInfo *base = (GIBaseInfo *)info;
685 ArgBlob *blob = (ArgBlob *)&base->typelib->data[base->offset];
687 if (blob->in && blob->out)
688 return GI_DIRECTION_INOUT;
690 return GI_DIRECTION_OUT;
692 return GI_DIRECTION_IN;
696 g_arg_info_is_return_value (GIArgInfo *info)
698 GIBaseInfo *base = (GIBaseInfo *)info;
699 ArgBlob *blob = (ArgBlob *)&base->typelib->data[base->offset];
701 return blob->return_value;
705 g_arg_info_is_dipper (GIArgInfo *info)
707 GIBaseInfo *base = (GIBaseInfo *)info;
708 ArgBlob *blob = (ArgBlob *)&base->typelib->data[base->offset];
714 g_arg_info_is_optional (GIArgInfo *info)
716 GIBaseInfo *base = (GIBaseInfo *)info;
717 ArgBlob *blob = (ArgBlob *)&base->typelib->data[base->offset];
719 return blob->optional;
723 g_arg_info_may_be_null (GIArgInfo *info)
725 GIBaseInfo *base = (GIBaseInfo *)info;
726 ArgBlob *blob = (ArgBlob *)&base->typelib->data[base->offset];
728 return blob->allow_none;
732 g_arg_info_get_ownership_transfer (GIArgInfo *info)
734 GIBaseInfo *base = (GIBaseInfo *)info;
735 ArgBlob *blob = (ArgBlob *)&base->typelib->data[base->offset];
737 if (blob->transfer_ownership)
738 return GI_TRANSFER_EVERYTHING;
739 else if (blob->transfer_container_ownership)
740 return GI_TRANSFER_CONTAINER;
742 return GI_TRANSFER_NOTHING;
746 g_arg_info_get_scope (GIArgInfo *info)
748 GIBaseInfo *base = (GIBaseInfo *)info;
749 ArgBlob *blob = (ArgBlob *)&base->typelib->data[base->offset];
755 g_arg_info_get_closure (GIArgInfo *info)
757 GIBaseInfo *base = (GIBaseInfo *)info;
758 ArgBlob *blob = (ArgBlob *)&base->typelib->data[base->offset];
760 return blob->closure;
764 g_arg_info_get_destroy (GIArgInfo *info)
766 GIBaseInfo *base = (GIBaseInfo *)info;
767 ArgBlob *blob = (ArgBlob *)&base->typelib->data[base->offset];
769 return blob->destroy;
773 g_arg_info_get_type (GIArgInfo *info)
775 GIBaseInfo *base = (GIBaseInfo *)info;
777 return g_type_info_new (base, base->typelib, base->offset + 12);
780 /* GITypeInfo functions */
782 g_type_info_is_pointer (GITypeInfo *info)
784 GIBaseInfo *base = (GIBaseInfo *)info;
785 SimpleTypeBlob *type = (SimpleTypeBlob *)&base->typelib->data[base->offset];
787 if (type->reserved == 0 && type->reserved2 == 0)
788 return type->pointer;
791 InterfaceTypeBlob *iface = (InterfaceTypeBlob *)&base->typelib->data[base->offset];
793 return iface->pointer;
798 g_type_info_get_tag (GITypeInfo *info)
800 GIBaseInfo *base = (GIBaseInfo *)info;
801 SimpleTypeBlob *type = (SimpleTypeBlob *)&base->typelib->data[base->offset];
803 if (type->reserved == 0 && type->reserved2 == 0)
807 InterfaceTypeBlob *iface = (InterfaceTypeBlob *)&base->typelib->data[base->offset];
814 g_type_info_get_param_type (GITypeInfo *info,
817 GIBaseInfo *base = (GIBaseInfo *)info;
818 SimpleTypeBlob *type = (SimpleTypeBlob *)&base->typelib->data[base->offset];
820 if (!(type->reserved == 0 && type->reserved2 == 0))
822 ParamTypeBlob *param = (ParamTypeBlob *)&base->typelib->data[base->offset];
826 case GI_TYPE_TAG_ARRAY:
827 case GI_TYPE_TAG_GLIST:
828 case GI_TYPE_TAG_GSLIST:
829 case GI_TYPE_TAG_GHASH:
830 return g_type_info_new (base, base->typelib, base->offset + 4 + 4 * n);
841 g_type_info_get_interface (GITypeInfo *info)
843 GIBaseInfo *base = (GIBaseInfo *)info;
844 SimpleTypeBlob *type = (SimpleTypeBlob *)&base->typelib->data[base->offset];
846 if (!(type->reserved == 0 && type->reserved2 == 0))
848 InterfaceTypeBlob *blob = (InterfaceTypeBlob *)&base->typelib->data[base->offset];
850 if (blob->tag == GI_TYPE_TAG_INTERFACE)
851 return g_info_from_entry (base->repository, base->typelib, blob->interface);
858 g_type_info_get_array_length (GITypeInfo *info)
860 GIBaseInfo *base = (GIBaseInfo *)info;
861 SimpleTypeBlob *type = (SimpleTypeBlob *)&base->typelib->data[base->offset];
863 if (!(type->reserved == 0 && type->reserved2 == 0))
865 ArrayTypeBlob *blob = (ArrayTypeBlob *)&base->typelib->data[base->offset];
867 if (blob->tag == GI_TYPE_TAG_ARRAY)
869 if (blob->has_length)
878 g_type_info_get_array_fixed_size (GITypeInfo *info)
880 GIBaseInfo *base = (GIBaseInfo *)info;
881 SimpleTypeBlob *type = (SimpleTypeBlob *)&base->typelib->data[base->offset];
883 if (!(type->reserved == 0 && type->reserved2 == 0))
885 ArrayTypeBlob *blob = (ArrayTypeBlob *)&base->typelib->data[base->offset];
887 if (blob->tag == GI_TYPE_TAG_ARRAY)
898 g_type_info_is_zero_terminated (GITypeInfo *info)
900 GIBaseInfo *base = (GIBaseInfo *)info;
901 SimpleTypeBlob *type = (SimpleTypeBlob *)&base->typelib->data[base->offset];
903 if (!(type->reserved == 0 && type->reserved2 == 0))
905 ArrayTypeBlob *blob = (ArrayTypeBlob *)&base->typelib->data[base->offset];
907 if (blob->tag == GI_TYPE_TAG_ARRAY)
908 return blob->zero_terminated;
915 g_type_info_get_n_error_domains (GITypeInfo *info)
917 GIBaseInfo *base = (GIBaseInfo *)info;
918 SimpleTypeBlob *type = (SimpleTypeBlob *)&base->typelib->data[base->offset];
920 if (!(type->reserved == 0 && type->reserved2 == 0))
922 ErrorTypeBlob *blob = (ErrorTypeBlob *)&base->typelib->data[base->offset];
924 if (blob->tag == GI_TYPE_TAG_ERROR)
925 return blob->n_domains;
932 g_type_info_get_error_domain (GITypeInfo *info,
935 GIBaseInfo *base = (GIBaseInfo *)info;
936 SimpleTypeBlob *type = (SimpleTypeBlob *)&base->typelib->data[base->offset];
938 if (!(type->reserved == 0 && type->reserved2 == 0))
940 ErrorTypeBlob *blob = (ErrorTypeBlob *)&base->typelib->data[base->offset];
942 if (blob->tag == GI_TYPE_TAG_ERROR)
943 return (GIErrorDomainInfo *) g_info_from_entry (base->repository,
952 /* GIErrorDomainInfo functions */
954 g_error_domain_info_get_quark (GIErrorDomainInfo *info)
956 GIBaseInfo *base = (GIBaseInfo *)info;
957 ErrorDomainBlob *blob = (ErrorDomainBlob *)&base->typelib->data[base->offset];
959 return g_typelib_get_string (base->typelib, blob->get_quark);
963 g_error_domain_info_get_codes (GIErrorDomainInfo *info)
965 GIBaseInfo *base = (GIBaseInfo *)info;
966 ErrorDomainBlob *blob = (ErrorDomainBlob *)&base->typelib->data[base->offset];
968 return (GIInterfaceInfo *) g_info_from_entry (base->repository,
969 base->typelib, blob->error_codes);
973 /* GIValueInfo functions */
975 g_value_info_get_value (GIValueInfo *info)
977 GIBaseInfo *base = (GIBaseInfo *)info;
978 ValueBlob *blob = (ValueBlob *)&base->typelib->data[base->offset];
980 return (glong)blob->value;
983 /* GIFieldInfo functions */
985 g_field_info_get_flags (GIFieldInfo *info)
987 GIFieldInfoFlags flags;
989 GIBaseInfo *base = (GIBaseInfo *)info;
990 FieldBlob *blob = (FieldBlob *)&base->typelib->data[base->offset];
995 flags = flags | GI_FIELD_IS_READABLE;
998 flags = flags | GI_FIELD_IS_WRITABLE;
1004 g_field_info_get_size (GIFieldInfo *info)
1006 GIBaseInfo *base = (GIBaseInfo *)info;
1007 FieldBlob *blob = (FieldBlob *)&base->typelib->data[base->offset];
1013 g_field_info_get_offset (GIFieldInfo *info)
1015 GIBaseInfo *base = (GIBaseInfo *)info;
1016 FieldBlob *blob = (FieldBlob *)&base->typelib->data[base->offset];
1018 return blob->struct_offset;
1022 g_field_info_get_type (GIFieldInfo *info)
1024 GIBaseInfo *base = (GIBaseInfo *)info;
1026 return g_type_info_new (base, base->typelib, base->offset + 8);
1029 /* GIRegisteredTypeInfo functions */
1031 g_registered_type_info_get_type_name (GIRegisteredTypeInfo *info)
1033 GIBaseInfo *base = (GIBaseInfo *)info;
1034 RegisteredTypeBlob *blob = (RegisteredTypeBlob *)&base->typelib->data[base->offset];
1036 if (blob->gtype_name)
1037 return g_typelib_get_string (base->typelib, blob->gtype_name);
1043 g_registered_type_info_get_type_init (GIRegisteredTypeInfo *info)
1045 GIBaseInfo *base = (GIBaseInfo *)info;
1046 RegisteredTypeBlob *blob = (RegisteredTypeBlob *)&base->typelib->data[base->offset];
1048 if (blob->gtype_init)
1049 return g_typelib_get_string (base->typelib, blob->gtype_init);
1055 g_registered_type_info_get_g_type (GIRegisteredTypeInfo *info)
1057 const char *type_init;
1058 GType (* get_type_func) (void);
1060 type_init = g_registered_type_info_get_type_init (info);
1062 if (type_init == NULL)
1065 get_type_func = NULL;
1066 if (!g_typelib_symbol (((GIBaseInfo*)info)->typelib,
1068 (void**) &get_type_func))
1071 return (* get_type_func) ();
1074 /* GIStructInfo functions */
1076 g_struct_info_get_n_fields (GIStructInfo *info)
1078 GIBaseInfo *base = (GIBaseInfo *)info;
1079 StructBlob *blob = (StructBlob *)&base->typelib->data[base->offset];
1081 return blob->n_fields;
1085 g_struct_info_get_field (GIStructInfo *info,
1088 GIBaseInfo *base = (GIBaseInfo *)info;
1089 Header *header = (Header *)base->typelib->data;
1091 return (GIFieldInfo *) g_info_new (GI_INFO_TYPE_FIELD, base, base->typelib,
1092 base->offset + header->struct_blob_size +
1093 n * header->field_blob_size);
1097 g_struct_info_get_n_methods (GIStructInfo *info)
1099 GIBaseInfo *base = (GIBaseInfo *)info;
1100 StructBlob *blob = (StructBlob *)&base->typelib->data[base->offset];
1102 return blob->n_methods;
1106 g_struct_info_get_method (GIStructInfo *info,
1109 GIBaseInfo *base = (GIBaseInfo *)info;
1110 StructBlob *blob = (StructBlob *)&base->typelib->data[base->offset];
1111 Header *header = (Header *)base->typelib->data;
1114 offset = base->offset + header->struct_blob_size
1115 + blob->n_fields * header->field_blob_size
1116 + n * header->function_blob_size;
1117 return (GIFunctionInfo *) g_info_new (GI_INFO_TYPE_FUNCTION, base,
1118 base->typelib, offset);
1121 static GIFunctionInfo *
1122 find_method (GIBaseInfo *base,
1128 Header *header = (Header *)base->typelib->data;
1131 for (i = 0; i < n_methods; i++)
1133 FunctionBlob *fblob = (FunctionBlob *)&base->typelib->data[offset];
1134 const gchar *fname = (const gchar *)&base->typelib->data[fblob->name];
1136 if (strcmp (name, fname) == 0)
1137 return (GIFunctionInfo *) g_info_new (GI_INFO_TYPE_FUNCTION, base,
1138 base->typelib, offset);
1140 offset += header->function_blob_size;
1147 g_struct_info_find_method (GIStructInfo *info,
1151 GIBaseInfo *base = (GIBaseInfo *)info;
1152 Header *header = (Header *)base->typelib->data;
1153 StructBlob *blob = (StructBlob *)&base->typelib->data[base->offset];
1155 offset = base->offset + header->struct_blob_size
1156 + blob->n_fields * header->field_blob_size;
1158 return find_method (base, offset, blob->n_methods, name);
1162 g_struct_info_get_size (GIStructInfo *info)
1164 GIBaseInfo *base = (GIBaseInfo *)info;
1165 StructBlob *blob = (StructBlob *)&base->typelib->data[base->offset];
1171 g_struct_info_get_alignment (GIStructInfo *info)
1173 GIBaseInfo *base = (GIBaseInfo *)info;
1174 StructBlob *blob = (StructBlob *)&base->typelib->data[base->offset];
1176 return blob->alignment;
1180 g_enum_info_get_n_values (GIEnumInfo *info)
1182 GIBaseInfo *base = (GIBaseInfo *)info;
1183 EnumBlob *blob = (EnumBlob *)&base->typelib->data[base->offset];
1185 return blob->n_values;
1189 g_enum_info_get_value (GIEnumInfo *info,
1192 GIBaseInfo *base = (GIBaseInfo *)info;
1193 Header *header = (Header *)base->typelib->data;
1196 offset = base->offset + header->enum_blob_size
1197 + n * header->value_blob_size;
1198 return (GIValueInfo *) g_info_new (GI_INFO_TYPE_VALUE, base, base->typelib, offset);
1202 * g_enum_info_get_storage_type:
1205 * Gets the tag of the type used for the enum in the C ABI. This will
1206 * will be a signed or unsigned integral type.
1208 * Note that in the current implementation the width of the type is
1209 * computed correctly, but the signed or unsigned nature of the type
1210 * may not match the sign of the type used by the C compiler.
1212 * Return Value: the storage type for the enumeration
1215 g_enum_info_get_storage_type (GIEnumInfo *info)
1217 GIBaseInfo *base = (GIBaseInfo *)info;
1218 EnumBlob *blob = (EnumBlob *)&base->typelib->data[base->offset];
1220 return blob->storage_type;
1223 /* GIObjectInfo functions */
1225 g_object_info_get_parent (GIObjectInfo *info)
1227 GIBaseInfo *base = (GIBaseInfo *)info;
1228 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1231 return (GIObjectInfo *) g_info_from_entry (base->repository,
1232 base->typelib, blob->parent);
1238 g_object_info_get_abstract (GIObjectInfo *info)
1240 GIBaseInfo *base = (GIBaseInfo *)info;
1241 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1242 return blob->abstract != 0;
1246 g_object_info_get_type_name (GIObjectInfo *info)
1248 GIBaseInfo *base = (GIBaseInfo *)info;
1249 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1251 return g_typelib_get_string (base->typelib, blob->gtype_name);
1255 g_object_info_get_type_init (GIObjectInfo *info)
1257 GIBaseInfo *base = (GIBaseInfo *)info;
1258 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1260 return g_typelib_get_string (base->typelib, blob->gtype_init);
1264 g_object_info_get_n_interfaces (GIObjectInfo *info)
1266 GIBaseInfo *base = (GIBaseInfo *)info;
1267 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1269 return blob->n_interfaces;
1273 g_object_info_get_interface (GIObjectInfo *info,
1276 GIBaseInfo *base = (GIBaseInfo *)info;
1277 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1279 return (GIInterfaceInfo *) g_info_from_entry (base->repository,
1280 base->typelib, blob->interfaces[n]);
1284 g_object_info_get_n_fields (GIObjectInfo *info)
1286 GIBaseInfo *base = (GIBaseInfo *)info;
1287 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1289 return blob->n_fields;
1293 g_object_info_get_field (GIObjectInfo *info,
1297 GIBaseInfo *base = (GIBaseInfo *)info;
1298 Header *header = (Header *)base->typelib->data;
1299 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1301 offset = base->offset + header->object_blob_size
1302 + (blob->n_interfaces + blob->n_interfaces % 2) * 2
1303 + n * header->field_blob_size;
1305 return (GIFieldInfo *) g_info_new (GI_INFO_TYPE_FIELD, base, base->typelib, offset);
1309 g_object_info_get_n_properties (GIObjectInfo *info)
1311 GIBaseInfo *base = (GIBaseInfo *)info;
1312 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1314 return blob->n_properties;
1318 g_object_info_get_property (GIObjectInfo *info,
1322 GIBaseInfo *base = (GIBaseInfo *)info;
1323 Header *header = (Header *)base->typelib->data;
1324 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1326 offset = base->offset + header->object_blob_size
1327 + (blob->n_interfaces + blob->n_interfaces % 2) * 2
1328 + blob->n_fields * header->field_blob_size
1329 + n * header->property_blob_size;
1331 return (GIPropertyInfo *) g_info_new (GI_INFO_TYPE_PROPERTY, base,
1332 base->typelib, offset);
1336 g_object_info_get_n_methods (GIObjectInfo *info)
1338 GIBaseInfo *base = (GIBaseInfo *)info;
1339 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1341 return blob->n_methods;
1345 g_object_info_get_method (GIObjectInfo *info,
1349 GIBaseInfo *base = (GIBaseInfo *)info;
1350 Header *header = (Header *)base->typelib->data;
1351 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1353 offset = base->offset + header->object_blob_size
1354 + (blob->n_interfaces + blob->n_interfaces % 2) * 2
1355 + blob->n_fields * header->field_blob_size
1356 + blob->n_properties * header->property_blob_size
1357 + n * header->function_blob_size;
1359 return (GIFunctionInfo *) g_info_new (GI_INFO_TYPE_FUNCTION, base,
1360 base->typelib, offset);
1364 g_object_info_find_method (GIObjectInfo *info,
1368 GIBaseInfo *base = (GIBaseInfo *)info;
1369 Header *header = (Header *)base->typelib->data;
1370 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1372 offset = base->offset + header->object_blob_size
1373 + (blob->n_interfaces + blob->n_interfaces % 2) * 2
1374 + blob->n_fields * header->field_blob_size +
1375 + blob->n_properties * header->property_blob_size;
1377 return find_method (base, offset, blob->n_methods, name);
1381 g_object_info_get_n_signals (GIObjectInfo *info)
1383 GIBaseInfo *base = (GIBaseInfo *)info;
1384 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1386 return blob->n_signals;
1390 g_object_info_get_signal (GIObjectInfo *info,
1394 GIBaseInfo *base = (GIBaseInfo *)info;
1395 Header *header = (Header *)base->typelib->data;
1396 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1398 offset = base->offset + header->object_blob_size
1399 + (blob->n_interfaces + blob->n_interfaces % 2) * 2
1400 + blob->n_fields * header->field_blob_size
1401 + blob->n_properties * header->property_blob_size
1402 + blob->n_methods * header->function_blob_size
1403 + n * header->signal_blob_size;
1405 return (GISignalInfo *) g_info_new (GI_INFO_TYPE_SIGNAL, base,
1406 base->typelib, offset);
1410 g_object_info_get_n_vfuncs (GIObjectInfo *info)
1412 GIBaseInfo *base = (GIBaseInfo *)info;
1413 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1415 return blob->n_vfuncs;
1419 g_object_info_get_vfunc (GIObjectInfo *info,
1423 GIBaseInfo *base = (GIBaseInfo *)info;
1424 Header *header = (Header *)base->typelib->data;
1425 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1427 offset = base->offset + header->object_blob_size
1428 + (blob->n_interfaces + blob->n_interfaces % 2) * 2
1429 + blob->n_fields * header->field_blob_size
1430 + blob->n_properties * header->property_blob_size
1431 + blob->n_methods * header->function_blob_size
1432 + blob->n_signals * header->signal_blob_size
1433 + n * header->vfunc_blob_size;
1435 return (GIVFuncInfo *) g_info_new (GI_INFO_TYPE_VFUNC, base,
1436 base->typelib, offset);
1440 g_object_info_get_n_constants (GIObjectInfo *info)
1442 GIBaseInfo *base = (GIBaseInfo *)info;
1443 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1445 return blob->n_constants;
1449 g_object_info_get_constant (GIObjectInfo *info,
1453 GIBaseInfo *base = (GIBaseInfo *)info;
1454 Header *header = (Header *)base->typelib->data;
1455 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1457 offset = base->offset + header->object_blob_size
1458 + (blob->n_interfaces + blob->n_interfaces % 2) * 2
1459 + blob->n_fields * header->field_blob_size
1460 + blob->n_properties * header->property_blob_size
1461 + blob->n_methods * header->function_blob_size
1462 + blob->n_signals * header->signal_blob_size
1463 + blob->n_vfuncs * header->vfunc_blob_size
1464 + n * header->constant_blob_size;
1466 return (GIConstantInfo *) g_info_new (GI_INFO_TYPE_CONSTANT, base,
1467 base->typelib, offset);
1471 /* GIInterfaceInfo functions */
1473 g_interface_info_get_n_prerequisites (GIInterfaceInfo *info)
1475 GIBaseInfo *base = (GIBaseInfo *)info;
1476 InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset];
1478 return blob->n_prerequisites;
1482 g_interface_info_get_prerequisite (GIInterfaceInfo *info,
1485 GIBaseInfo *base = (GIBaseInfo *)info;
1486 InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset];
1488 return g_info_from_entry (base->repository,
1489 base->typelib, blob->prerequisites[n]);
1494 g_interface_info_get_n_properties (GIInterfaceInfo *info)
1496 GIBaseInfo *base = (GIBaseInfo *)info;
1497 InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset];
1499 return blob->n_properties;
1503 g_interface_info_get_property (GIInterfaceInfo *info,
1507 GIBaseInfo *base = (GIBaseInfo *)info;
1508 Header *header = (Header *)base->typelib->data;
1509 InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset];
1511 offset = base->offset + header->interface_blob_size
1512 + (blob->n_prerequisites + (blob->n_prerequisites % 2)) * 2
1513 + n * header->property_blob_size;
1515 return (GIPropertyInfo *) g_info_new (GI_INFO_TYPE_PROPERTY, base,
1516 base->typelib, offset);
1520 g_interface_info_get_n_methods (GIInterfaceInfo *info)
1522 GIBaseInfo *base = (GIBaseInfo *)info;
1523 InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset];
1525 return blob->n_methods;
1529 g_interface_info_get_method (GIInterfaceInfo *info,
1533 GIBaseInfo *base = (GIBaseInfo *)info;
1534 Header *header = (Header *)base->typelib->data;
1535 InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset];
1537 offset = base->offset + header->interface_blob_size
1538 + (blob->n_prerequisites + (blob->n_prerequisites % 2)) * 2
1539 + blob->n_properties * header->property_blob_size
1540 + n * header->function_blob_size;
1542 return (GIFunctionInfo *) g_info_new (GI_INFO_TYPE_FUNCTION, base,
1543 base->typelib, offset);
1547 g_interface_info_find_method (GIInterfaceInfo *info,
1551 GIBaseInfo *base = (GIBaseInfo *)info;
1552 Header *header = (Header *)base->typelib->data;
1553 InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset];
1555 offset = base->offset + header->interface_blob_size
1556 + (blob->n_prerequisites + (blob->n_prerequisites % 2)) * 2
1557 + blob->n_properties * header->property_blob_size;
1559 return find_method (base, offset, blob->n_methods, name);
1563 g_interface_info_get_n_signals (GIInterfaceInfo *info)
1565 GIBaseInfo *base = (GIBaseInfo *)info;
1566 InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset];
1568 return blob->n_signals;
1572 g_interface_info_get_signal (GIInterfaceInfo *info,
1576 GIBaseInfo *base = (GIBaseInfo *)info;
1577 Header *header = (Header *)base->typelib->data;
1578 InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset];
1580 offset = base->offset + header->interface_blob_size
1581 + (blob->n_prerequisites + (blob->n_prerequisites % 2)) * 2
1582 + blob->n_properties * header->property_blob_size
1583 + blob->n_methods * header->function_blob_size
1584 + n * header->signal_blob_size;
1586 return (GISignalInfo *) g_info_new (GI_INFO_TYPE_SIGNAL, base,
1587 base->typelib, offset);
1591 g_interface_info_get_n_vfuncs (GIInterfaceInfo *info)
1593 GIBaseInfo *base = (GIBaseInfo *)info;
1594 InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset];
1596 return blob->n_vfuncs;
1600 g_interface_info_get_vfunc (GIInterfaceInfo *info,
1604 GIBaseInfo *base = (GIBaseInfo *)info;
1605 Header *header = (Header *)base->typelib->data;
1606 InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset];
1608 offset = base->offset + header->interface_blob_size
1609 + (blob->n_prerequisites + (blob->n_prerequisites % 2)) * 2
1610 + blob->n_properties * header->property_blob_size
1611 + blob->n_methods * header->function_blob_size
1612 + blob->n_signals * header->signal_blob_size
1613 + n * header->vfunc_blob_size;
1615 return (GIVFuncInfo *) g_info_new (GI_INFO_TYPE_VFUNC, base,
1616 base->typelib, offset);
1620 g_interface_info_get_n_constants (GIInterfaceInfo *info)
1622 GIBaseInfo *base = (GIBaseInfo *)info;
1623 InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset];
1625 return blob->n_constants;
1629 g_interface_info_get_constant (GIInterfaceInfo *info,
1633 GIBaseInfo *base = (GIBaseInfo *)info;
1634 Header *header = (Header *)base->typelib->data;
1635 InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset];
1637 offset = base->offset + header->interface_blob_size
1638 + (blob->n_prerequisites + (blob->n_prerequisites % 2)) * 2
1639 + blob->n_properties * header->property_blob_size
1640 + blob->n_methods * header->function_blob_size
1641 + blob->n_signals * header->signal_blob_size
1642 + blob->n_vfuncs * header->vfunc_blob_size
1643 + n * header->constant_blob_size;
1645 return (GIConstantInfo *) g_info_new (GI_INFO_TYPE_CONSTANT, base,
1646 base->typelib, offset);
1652 /* GIPropertyInfo functions */
1654 g_property_info_get_flags (GIPropertyInfo *info)
1657 GIBaseInfo *base = (GIBaseInfo *)info;
1658 PropertyBlob *blob = (PropertyBlob *)&base->typelib->data[base->offset];
1663 flags = flags | G_PARAM_READABLE;
1666 flags = flags | G_PARAM_WRITABLE;
1668 if (blob->construct)
1669 flags = flags | G_PARAM_CONSTRUCT;
1671 if (blob->construct_only)
1672 flags = flags | G_PARAM_CONSTRUCT_ONLY;
1678 g_property_info_get_type (GIPropertyInfo *info)
1680 GIBaseInfo *base = (GIBaseInfo *)info;
1682 return g_type_info_new (base, base->typelib, base->offset + 8);
1686 /* GISignalInfo functions */
1688 g_signal_info_get_flags (GISignalInfo *info)
1692 GIBaseInfo *base = (GIBaseInfo *)info;
1693 SignalBlob *blob = (SignalBlob *)&base->typelib->data[base->offset];
1697 if (blob->run_first)
1698 flags = flags | G_SIGNAL_RUN_FIRST;
1701 flags = flags | G_SIGNAL_RUN_LAST;
1703 if (blob->run_cleanup)
1704 flags = flags | G_SIGNAL_RUN_CLEANUP;
1706 if (blob->no_recurse)
1707 flags = flags | G_SIGNAL_NO_RECURSE;
1710 flags = flags | G_SIGNAL_DETAILED;
1713 flags = flags | G_SIGNAL_ACTION;
1716 flags = flags | G_SIGNAL_NO_HOOKS;
1722 g_signal_info_get_class_closure (GISignalInfo *info)
1724 GIBaseInfo *base = (GIBaseInfo *)info;
1725 SignalBlob *blob = (SignalBlob *)&base->typelib->data[base->offset];
1727 if (blob->has_class_closure)
1728 return g_interface_info_get_vfunc ((GIInterfaceInfo *)base->container, blob->class_closure);
1734 g_signal_info_true_stops_emit (GISignalInfo *info)
1736 GIBaseInfo *base = (GIBaseInfo *)info;
1737 SignalBlob *blob = (SignalBlob *)&base->typelib->data[base->offset];
1739 return blob->true_stops_emit;
1742 /* GIVFuncInfo functions */
1744 g_vfunc_info_get_flags (GIVFuncInfo *info)
1746 GIVFuncInfoFlags flags;
1748 GIBaseInfo *base = (GIBaseInfo *)info;
1749 VFuncBlob *blob = (VFuncBlob *)&base->typelib->data[base->offset];
1753 if (blob->must_chain_up)
1754 flags = flags | GI_VFUNC_MUST_CHAIN_UP;
1756 if (blob->must_be_implemented)
1757 flags = flags | GI_VFUNC_MUST_OVERRIDE;
1759 if (blob->must_not_be_implemented)
1760 flags = flags | GI_VFUNC_MUST_NOT_OVERRIDE;
1766 g_vfunc_info_get_offset (GIVFuncInfo *info)
1768 GIBaseInfo *base = (GIBaseInfo *)info;
1769 VFuncBlob *blob = (VFuncBlob *)&base->typelib->data[base->offset];
1771 return blob->struct_offset;
1775 g_vfunc_info_get_signal (GIVFuncInfo *info)
1777 GIBaseInfo *base = (GIBaseInfo *)info;
1778 VFuncBlob *blob = (VFuncBlob *)&base->typelib->data[base->offset];
1780 if (blob->class_closure)
1781 return g_interface_info_get_signal ((GIInterfaceInfo *)base->container, blob->signal);
1787 /* GIConstantInfo functions */
1789 g_constant_info_get_type (GIConstantInfo *info)
1791 GIBaseInfo *base = (GIBaseInfo *)info;
1793 return g_type_info_new (base, base->typelib, base->offset + 8);
1797 g_constant_info_get_value (GIConstantInfo *info,
1800 GIBaseInfo *base = (GIBaseInfo *)info;
1801 ConstantBlob *blob = (ConstantBlob *)&base->typelib->data[base->offset];
1803 /* FIXME non-basic types ? */
1804 if (blob->type.reserved == 0 && blob->type.reserved2 == 0)
1806 if (blob->type.pointer)
1807 value->v_pointer = g_memdup (&base->typelib->data[blob->offset], blob->size);
1810 switch (blob->type.tag)
1812 case GI_TYPE_TAG_BOOLEAN:
1813 value->v_boolean = *(gboolean*)&base->typelib->data[blob->offset];
1815 case GI_TYPE_TAG_INT8:
1816 value->v_int8 = *(gint8*)&base->typelib->data[blob->offset];
1818 case GI_TYPE_TAG_UINT8:
1819 value->v_uint8 = *(guint8*)&base->typelib->data[blob->offset];
1821 case GI_TYPE_TAG_INT16:
1822 value->v_int16 = *(gint16*)&base->typelib->data[blob->offset];
1824 case GI_TYPE_TAG_UINT16:
1825 value->v_uint16 = *(guint16*)&base->typelib->data[blob->offset];
1827 case GI_TYPE_TAG_INT32:
1828 value->v_int32 = *(gint32*)&base->typelib->data[blob->offset];
1830 case GI_TYPE_TAG_UINT32:
1831 value->v_uint32 = *(guint32*)&base->typelib->data[blob->offset];
1833 case GI_TYPE_TAG_INT64:
1834 value->v_int64 = *(gint64*)&base->typelib->data[blob->offset];
1836 case GI_TYPE_TAG_UINT64:
1837 value->v_uint64 = *(guint64*)&base->typelib->data[blob->offset];
1839 case GI_TYPE_TAG_FLOAT:
1840 value->v_float = *(gfloat*)&base->typelib->data[blob->offset];
1842 case GI_TYPE_TAG_DOUBLE:
1843 value->v_double = *(gdouble*)&base->typelib->data[blob->offset];
1845 case GI_TYPE_TAG_TIME_T:
1846 value->v_long = *(long*)&base->typelib->data[blob->offset];
1848 case GI_TYPE_TAG_INT:
1849 value->v_int = *(gint*)&base->typelib->data[blob->offset];
1851 case GI_TYPE_TAG_UINT:
1852 value->v_uint = *(guint*)&base->typelib->data[blob->offset];
1854 case GI_TYPE_TAG_LONG:
1855 value->v_long = *(glong*)&base->typelib->data[blob->offset];
1857 case GI_TYPE_TAG_ULONG:
1858 value->v_ulong = *(gulong*)&base->typelib->data[blob->offset];
1867 /* GIUnionInfo functions */
1869 g_union_info_get_n_fields (GIUnionInfo *info)
1871 GIBaseInfo *base = (GIBaseInfo *)info;
1872 UnionBlob *blob = (UnionBlob *)&base->typelib->data[base->offset];
1874 return blob->n_fields;
1878 g_union_info_get_field (GIUnionInfo *info,
1881 GIBaseInfo *base = (GIBaseInfo *)info;
1882 Header *header = (Header *)base->typelib->data;
1884 return (GIFieldInfo *) g_info_new (GI_INFO_TYPE_FIELD, base, base->typelib,
1885 base->offset + header->union_blob_size +
1886 n * header->field_blob_size);
1890 g_union_info_get_n_methods (GIUnionInfo *info)
1892 GIBaseInfo *base = (GIBaseInfo *)info;
1893 UnionBlob *blob = (UnionBlob *)&base->typelib->data[base->offset];
1895 return blob->n_functions;
1899 g_union_info_get_method (GIUnionInfo *info,
1902 GIBaseInfo *base = (GIBaseInfo *)info;
1903 UnionBlob *blob = (UnionBlob *)&base->typelib->data[base->offset];
1904 Header *header = (Header *)base->typelib->data;
1907 offset = base->offset + header->union_blob_size
1908 + blob->n_fields * header->field_blob_size
1909 + n * header->function_blob_size;
1910 return (GIFunctionInfo *) g_info_new (GI_INFO_TYPE_FUNCTION, base,
1911 base->typelib, offset);
1915 g_union_info_is_discriminated (GIUnionInfo *info)
1917 GIBaseInfo *base = (GIBaseInfo *)info;
1918 UnionBlob *blob = (UnionBlob *)&base->typelib->data[base->offset];
1920 return blob->discriminated;
1924 g_union_info_get_discriminator_offset (GIUnionInfo *info)
1926 GIBaseInfo *base = (GIBaseInfo *)info;
1927 UnionBlob *blob = (UnionBlob *)&base->typelib->data[base->offset];
1929 return blob->discriminator_offset;
1933 g_union_info_get_discriminator_type (GIUnionInfo *info)
1935 GIBaseInfo *base = (GIBaseInfo *)info;
1937 return g_type_info_new (base, base->typelib, base->offset + 24);
1941 g_union_info_get_discriminator (GIUnionInfo *info,
1944 GIBaseInfo *base = (GIBaseInfo *)info;
1945 UnionBlob *blob = (UnionBlob *)&base->typelib->data[base->offset];
1947 if (blob->discriminated)
1949 Header *header = (Header *)base->typelib->data;
1952 offset = base->offset + header->union_blob_size
1953 + blob->n_fields * header->field_blob_size
1954 + blob->n_functions * header->function_blob_size
1955 + n * header->constant_blob_size;
1957 return (GIConstantInfo *) g_info_new (GI_INFO_TYPE_CONSTANT, base,
1958 base->typelib, offset);
1965 g_union_info_find_method (GIUnionInfo *info,
1969 GIBaseInfo *base = (GIBaseInfo *)info;
1970 Header *header = (Header *)base->typelib->data;
1971 UnionBlob *blob = (UnionBlob *)&base->typelib->data[base->offset];
1973 offset = base->offset + header->union_blob_size
1974 + blob->n_fields * header->field_blob_size;
1976 return find_method (base, offset, blob->n_functions, name);
1980 g_union_info_get_size (GIUnionInfo *info)
1982 GIBaseInfo *base = (GIBaseInfo *)info;
1983 UnionBlob *blob = (UnionBlob *)&base->typelib->data[base->offset];
1989 g_union_info_get_alignment (GIUnionInfo *info)
1991 GIBaseInfo *base = (GIBaseInfo *)info;
1992 UnionBlob *blob = (UnionBlob *)&base->typelib->data[base->offset];
1994 return blob->alignment;