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 g_object_unref (info->repository);
237 g_base_info_get_type (GIBaseInfo *info)
244 g_base_info_get_name (GIBaseInfo *info)
246 g_assert (info->ref_count > 0);
249 case GI_INFO_TYPE_FUNCTION:
250 case GI_INFO_TYPE_CALLBACK:
251 case GI_INFO_TYPE_STRUCT:
252 case GI_INFO_TYPE_BOXED:
253 case GI_INFO_TYPE_ENUM:
254 case GI_INFO_TYPE_FLAGS:
255 case GI_INFO_TYPE_OBJECT:
256 case GI_INFO_TYPE_INTERFACE:
257 case GI_INFO_TYPE_CONSTANT:
258 case GI_INFO_TYPE_ERROR_DOMAIN:
259 case GI_INFO_TYPE_UNION:
261 CommonBlob *blob = (CommonBlob *)&info->typelib->data[info->offset];
263 return g_typelib_get_string (info->typelib, blob->name);
267 case GI_INFO_TYPE_VALUE:
269 ValueBlob *blob = (ValueBlob *)&info->typelib->data[info->offset];
271 return g_typelib_get_string (info->typelib, blob->name);
275 case GI_INFO_TYPE_SIGNAL:
277 SignalBlob *blob = (SignalBlob *)&info->typelib->data[info->offset];
279 return g_typelib_get_string (info->typelib, blob->name);
283 case GI_INFO_TYPE_PROPERTY:
285 PropertyBlob *blob = (PropertyBlob *)&info->typelib->data[info->offset];
287 return g_typelib_get_string (info->typelib, blob->name);
291 case GI_INFO_TYPE_VFUNC:
293 VFuncBlob *blob = (VFuncBlob *)&info->typelib->data[info->offset];
295 return g_typelib_get_string (info->typelib, blob->name);
299 case GI_INFO_TYPE_FIELD:
301 FieldBlob *blob = (FieldBlob *)&info->typelib->data[info->offset];
303 return g_typelib_get_string (info->typelib, blob->name);
307 case GI_INFO_TYPE_ARG:
309 ArgBlob *blob = (ArgBlob *)&info->typelib->data[info->offset];
311 return g_typelib_get_string (info->typelib, blob->name);
314 case GI_INFO_TYPE_UNRESOLVED:
316 GIUnresolvedInfo *unresolved = (GIUnresolvedInfo *)info;
318 return unresolved->name;
321 case GI_INFO_TYPE_TYPE:
323 g_assert_not_reached ();
331 g_base_info_get_namespace (GIBaseInfo *info)
333 Header *header = (Header *)info->typelib->data;
335 g_assert (info->ref_count > 0);
337 if (info->type == GI_INFO_TYPE_UNRESOLVED)
339 GIUnresolvedInfo *unresolved = (GIUnresolvedInfo *)info;
341 return unresolved->namespace;
344 return g_typelib_get_string (info->typelib, header->namespace);
348 g_base_info_is_deprecated (GIBaseInfo *info)
352 case GI_INFO_TYPE_FUNCTION:
353 case GI_INFO_TYPE_CALLBACK:
354 case GI_INFO_TYPE_STRUCT:
355 case GI_INFO_TYPE_BOXED:
356 case GI_INFO_TYPE_ENUM:
357 case GI_INFO_TYPE_FLAGS:
358 case GI_INFO_TYPE_OBJECT:
359 case GI_INFO_TYPE_INTERFACE:
360 case GI_INFO_TYPE_CONSTANT:
361 case GI_INFO_TYPE_ERROR_DOMAIN:
363 CommonBlob *blob = (CommonBlob *)&info->typelib->data[info->offset];
365 return blob->deprecated;
369 case GI_INFO_TYPE_VALUE:
371 ValueBlob *blob = (ValueBlob *)&info->typelib->data[info->offset];
373 return blob->deprecated;
377 case GI_INFO_TYPE_SIGNAL:
379 SignalBlob *blob = (SignalBlob *)&info->typelib->data[info->offset];
381 return blob->deprecated;
385 case GI_INFO_TYPE_PROPERTY:
387 PropertyBlob *blob = (PropertyBlob *)&info->typelib->data[info->offset];
389 return blob->deprecated;
393 case GI_INFO_TYPE_VFUNC:
394 case GI_INFO_TYPE_FIELD:
395 case GI_INFO_TYPE_ARG:
396 case GI_INFO_TYPE_TYPE:
398 /* no deprecation flag for these */
405 cmp_annotation (const void *av,
408 const AnnotationBlob *a = av;
409 const AnnotationBlob *b = bv;
411 if (b->offset < a->offset)
414 if (b->offset > a->offset)
421 g_base_info_get_annotation (GIBaseInfo *info,
424 GIBaseInfo *base = (GIBaseInfo *)info;
425 Header *header = (Header *)base->typelib->data;
426 AnnotationBlob blob, *first, *after, *res, *next;
429 blob.offset = base->offset;
431 first = (AnnotationBlob *) &base->typelib->data[header->annotations];
432 after = (AnnotationBlob *) &base->typelib->data[header->annotations +
433 header->n_annotations * header->annotation_blob_size];
435 res = bsearch (&blob, first, header->n_annotations,
436 header->annotation_blob_size, cmp_annotation);
445 next = res -= header->annotation_blob_size;
447 while (next >= first && next->offset == base->offset);
454 rname = g_typelib_get_string (base->typelib, res->name);
455 if (strcmp (name, rname) == 0)
456 return g_typelib_get_string (base->typelib, res->value);
458 next = res += header->annotation_blob_size;
460 while (next < after && next->offset == base->offset);
466 g_base_info_get_container (GIBaseInfo *info)
468 return info->container;
472 g_base_info_get_typelib (GIBaseInfo *info)
474 return info->typelib;
477 /* GIFunctionInfo functions */
479 g_function_info_get_symbol (GIFunctionInfo *info)
481 GIBaseInfo *base = (GIBaseInfo *)info;
482 FunctionBlob *blob = (FunctionBlob *)&base->typelib->data[base->offset];
484 return g_typelib_get_string (base->typelib, blob->symbol);
488 g_function_info_get_flags (GIFunctionInfo *info)
490 GIFunctionInfoFlags flags;
491 GIBaseInfo *base = (GIBaseInfo *)info;
492 FunctionBlob *blob = (FunctionBlob *)&base->typelib->data[base->offset];
496 /* Make sure we don't flag Constructors as methods */
497 if (!blob->constructor && !blob->is_static)
498 flags = flags | GI_FUNCTION_IS_METHOD;
500 if (blob->constructor)
501 flags = flags | GI_FUNCTION_IS_CONSTRUCTOR;
504 flags = flags | GI_FUNCTION_IS_GETTER;
507 flags = flags | GI_FUNCTION_IS_SETTER;
509 if (blob->wraps_vfunc)
510 flags = flags | GI_FUNCTION_WRAPS_VFUNC;
513 flags = flags | GI_FUNCTION_THROWS;
519 g_function_info_get_property (GIFunctionInfo *info)
521 GIBaseInfo *base = (GIBaseInfo *)info;
522 FunctionBlob *blob = (FunctionBlob *)&base->typelib->data[base->offset];
523 GIInterfaceInfo *container = (GIInterfaceInfo *)base->container;
525 return g_interface_info_get_property (container, blob->index);
529 g_function_info_get_vfunc (GIFunctionInfo *info)
531 GIBaseInfo *base = (GIBaseInfo *)info;
532 FunctionBlob *blob = (FunctionBlob *)&base->typelib->data[base->offset];
533 GIInterfaceInfo *container = (GIInterfaceInfo *)base->container;
535 return g_interface_info_get_vfunc (container, blob->index);
539 /* GICallableInfo functions */
541 signature_offset (GICallableInfo *info)
544 switch (info->base.type)
546 case GI_INFO_TYPE_FUNCTION:
547 sigoff = G_STRUCT_OFFSET (FunctionBlob, signature);
549 case GI_INFO_TYPE_VFUNC:
550 sigoff = G_STRUCT_OFFSET (VFuncBlob, signature);
552 case GI_INFO_TYPE_CALLBACK:
553 sigoff = G_STRUCT_OFFSET (CallbackBlob, signature);
555 case GI_INFO_TYPE_SIGNAL:
556 sigoff = G_STRUCT_OFFSET (SignalBlob, signature);
560 return *(guint32 *)&info->base.typelib->data[info->base.offset + sigoff];
565 g_type_info_new (GIBaseInfo *container,
569 SimpleTypeBlob *type = (SimpleTypeBlob *)&typelib->data[offset];
571 return (GITypeInfo *) g_info_new (GI_INFO_TYPE_TYPE, container, typelib,
572 (type->reserved == 0 && type->reserved2 == 0) ? offset : type->offset);
576 * g_callable_info_get_return_type:
577 * @info: a #GICallableInfo
579 * Get the return type of a callable item as
582 * Returns: a #GITypeInfo idexing the TypeBlob for the
583 * return type of #info
586 g_callable_info_get_return_type (GICallableInfo *info)
588 GIBaseInfo *base = (GIBaseInfo *)info;
591 offset = signature_offset (info);
593 return g_type_info_new (base, base->typelib, offset);
597 * g_callable_info_may_return_null:
598 * @info: a #GICallableInfo
600 * See if a callable could return NULL.
602 * Returns: TRUE if callable could return NULL
605 g_callable_info_may_return_null (GICallableInfo *info)
607 GIBaseInfo *base = (GIBaseInfo *)info;
608 SignatureBlob *blob = (SignatureBlob *)&base->typelib->data[signature_offset (info)];
610 return blob->may_return_null;
614 * g_callable_info_get_caller_owns:
615 * @info: a #GICallableInfo
617 * See whether the caller owns the return value
620 * Returns: TRUE if the caller owns the return value, FALSE otherwise.
623 g_callable_info_get_caller_owns (GICallableInfo *info)
625 GIBaseInfo *base = (GIBaseInfo *)info;
626 SignatureBlob *blob = (SignatureBlob *)&base->typelib->data[signature_offset (info)];
628 if (blob->caller_owns_return_value)
629 return GI_TRANSFER_EVERYTHING;
630 else if (blob->caller_owns_return_container)
631 return GI_TRANSFER_CONTAINER;
633 return GI_TRANSFER_NOTHING;
637 * g_callable_info_get_n_args:
638 * @info: a #GICallableInfo
640 * Get the number of arguments (both IN and OUT) for this callable.
642 * Returns: The number of arguments this callable expects.
645 g_callable_info_get_n_args (GICallableInfo *info)
647 GIBaseInfo *base = (GIBaseInfo *)info;
651 offset = signature_offset (info);
652 blob = (SignatureBlob *)&base->typelib->data[offset];
654 return blob->n_arguments;
658 * g_callable_info_get_arg:
659 * @info: a #GICallableInfo
661 * Get information about a particular argument of this callable.
663 * Returns: A #GIArgInfo indexing the typelib on the given argument.
666 g_callable_info_get_arg (GICallableInfo *info,
669 GIBaseInfo *base = (GIBaseInfo *)info;
670 Header *header = (Header *)base->typelib->data;
673 offset = signature_offset (info);
675 return (GIArgInfo *) g_info_new (GI_INFO_TYPE_ARG, base, base->typelib,
676 offset + header->signature_blob_size + n * header->arg_blob_size);
679 /* GIArgInfo function */
681 g_arg_info_get_direction (GIArgInfo *info)
683 GIBaseInfo *base = (GIBaseInfo *)info;
684 ArgBlob *blob = (ArgBlob *)&base->typelib->data[base->offset];
686 if (blob->in && blob->out)
687 return GI_DIRECTION_INOUT;
689 return GI_DIRECTION_OUT;
691 return GI_DIRECTION_IN;
695 g_arg_info_is_return_value (GIArgInfo *info)
697 GIBaseInfo *base = (GIBaseInfo *)info;
698 ArgBlob *blob = (ArgBlob *)&base->typelib->data[base->offset];
700 return blob->return_value;
704 g_arg_info_is_dipper (GIArgInfo *info)
706 GIBaseInfo *base = (GIBaseInfo *)info;
707 ArgBlob *blob = (ArgBlob *)&base->typelib->data[base->offset];
713 g_arg_info_is_optional (GIArgInfo *info)
715 GIBaseInfo *base = (GIBaseInfo *)info;
716 ArgBlob *blob = (ArgBlob *)&base->typelib->data[base->offset];
718 return blob->optional;
722 g_arg_info_may_be_null (GIArgInfo *info)
724 GIBaseInfo *base = (GIBaseInfo *)info;
725 ArgBlob *blob = (ArgBlob *)&base->typelib->data[base->offset];
727 return blob->allow_none;
731 g_arg_info_get_ownership_transfer (GIArgInfo *info)
733 GIBaseInfo *base = (GIBaseInfo *)info;
734 ArgBlob *blob = (ArgBlob *)&base->typelib->data[base->offset];
736 if (blob->transfer_ownership)
737 return GI_TRANSFER_EVERYTHING;
738 else if (blob->transfer_container_ownership)
739 return GI_TRANSFER_CONTAINER;
741 return GI_TRANSFER_NOTHING;
745 g_arg_info_get_scope (GIArgInfo *info)
747 GIBaseInfo *base = (GIBaseInfo *)info;
748 ArgBlob *blob = (ArgBlob *)&base->typelib->data[base->offset];
754 g_arg_info_get_closure (GIArgInfo *info)
756 GIBaseInfo *base = (GIBaseInfo *)info;
757 ArgBlob *blob = (ArgBlob *)&base->typelib->data[base->offset];
759 return blob->closure;
763 g_arg_info_get_destroy (GIArgInfo *info)
765 GIBaseInfo *base = (GIBaseInfo *)info;
766 ArgBlob *blob = (ArgBlob *)&base->typelib->data[base->offset];
768 return blob->destroy;
772 g_arg_info_get_type (GIArgInfo *info)
774 GIBaseInfo *base = (GIBaseInfo *)info;
776 return g_type_info_new (base, base->typelib, base->offset + 12);
779 /* GITypeInfo functions */
781 g_type_info_is_pointer (GITypeInfo *info)
783 GIBaseInfo *base = (GIBaseInfo *)info;
784 SimpleTypeBlob *type = (SimpleTypeBlob *)&base->typelib->data[base->offset];
786 if (type->reserved == 0 && type->reserved2 == 0)
787 return type->pointer;
790 InterfaceTypeBlob *iface = (InterfaceTypeBlob *)&base->typelib->data[base->offset];
792 return iface->pointer;
797 g_type_info_get_tag (GITypeInfo *info)
799 GIBaseInfo *base = (GIBaseInfo *)info;
800 SimpleTypeBlob *type = (SimpleTypeBlob *)&base->typelib->data[base->offset];
802 if (type->reserved == 0 && type->reserved2 == 0)
806 InterfaceTypeBlob *iface = (InterfaceTypeBlob *)&base->typelib->data[base->offset];
813 g_type_info_get_param_type (GITypeInfo *info,
816 GIBaseInfo *base = (GIBaseInfo *)info;
817 SimpleTypeBlob *type = (SimpleTypeBlob *)&base->typelib->data[base->offset];
819 if (!(type->reserved == 0 && type->reserved2 == 0))
821 ParamTypeBlob *param = (ParamTypeBlob *)&base->typelib->data[base->offset];
825 case GI_TYPE_TAG_ARRAY:
826 case GI_TYPE_TAG_GLIST:
827 case GI_TYPE_TAG_GSLIST:
828 case GI_TYPE_TAG_GHASH:
829 return g_type_info_new (base, base->typelib, base->offset + 4 + 4 * n);
840 g_type_info_get_interface (GITypeInfo *info)
842 GIBaseInfo *base = (GIBaseInfo *)info;
843 SimpleTypeBlob *type = (SimpleTypeBlob *)&base->typelib->data[base->offset];
845 if (!(type->reserved == 0 && type->reserved2 == 0))
847 InterfaceTypeBlob *blob = (InterfaceTypeBlob *)&base->typelib->data[base->offset];
849 if (blob->tag == GI_TYPE_TAG_INTERFACE)
850 return g_info_from_entry (base->repository, base->typelib, blob->interface);
857 g_type_info_get_array_length (GITypeInfo *info)
859 GIBaseInfo *base = (GIBaseInfo *)info;
860 SimpleTypeBlob *type = (SimpleTypeBlob *)&base->typelib->data[base->offset];
862 if (!(type->reserved == 0 && type->reserved2 == 0))
864 ArrayTypeBlob *blob = (ArrayTypeBlob *)&base->typelib->data[base->offset];
866 if (blob->tag == GI_TYPE_TAG_ARRAY)
868 if (blob->has_length)
877 g_type_info_get_array_fixed_size (GITypeInfo *info)
879 GIBaseInfo *base = (GIBaseInfo *)info;
880 SimpleTypeBlob *type = (SimpleTypeBlob *)&base->typelib->data[base->offset];
882 if (!(type->reserved == 0 && type->reserved2 == 0))
884 ArrayTypeBlob *blob = (ArrayTypeBlob *)&base->typelib->data[base->offset];
886 if (blob->tag == GI_TYPE_TAG_ARRAY)
897 g_type_info_is_zero_terminated (GITypeInfo *info)
899 GIBaseInfo *base = (GIBaseInfo *)info;
900 SimpleTypeBlob *type = (SimpleTypeBlob *)&base->typelib->data[base->offset];
902 if (!(type->reserved == 0 && type->reserved2 == 0))
904 ArrayTypeBlob *blob = (ArrayTypeBlob *)&base->typelib->data[base->offset];
906 if (blob->tag == GI_TYPE_TAG_ARRAY)
907 return blob->zero_terminated;
914 g_type_info_get_n_error_domains (GITypeInfo *info)
916 GIBaseInfo *base = (GIBaseInfo *)info;
917 SimpleTypeBlob *type = (SimpleTypeBlob *)&base->typelib->data[base->offset];
919 if (!(type->reserved == 0 && type->reserved2 == 0))
921 ErrorTypeBlob *blob = (ErrorTypeBlob *)&base->typelib->data[base->offset];
923 if (blob->tag == GI_TYPE_TAG_ERROR)
924 return blob->n_domains;
931 g_type_info_get_error_domain (GITypeInfo *info,
934 GIBaseInfo *base = (GIBaseInfo *)info;
935 SimpleTypeBlob *type = (SimpleTypeBlob *)&base->typelib->data[base->offset];
937 if (!(type->reserved == 0 && type->reserved2 == 0))
939 ErrorTypeBlob *blob = (ErrorTypeBlob *)&base->typelib->data[base->offset];
941 if (blob->tag == GI_TYPE_TAG_ERROR)
942 return (GIErrorDomainInfo *) g_info_from_entry (base->repository,
951 /* GIErrorDomainInfo functions */
953 g_error_domain_info_get_quark (GIErrorDomainInfo *info)
955 GIBaseInfo *base = (GIBaseInfo *)info;
956 ErrorDomainBlob *blob = (ErrorDomainBlob *)&base->typelib->data[base->offset];
958 return g_typelib_get_string (base->typelib, blob->get_quark);
962 g_error_domain_info_get_codes (GIErrorDomainInfo *info)
964 GIBaseInfo *base = (GIBaseInfo *)info;
965 ErrorDomainBlob *blob = (ErrorDomainBlob *)&base->typelib->data[base->offset];
967 return (GIInterfaceInfo *) g_info_from_entry (base->repository,
968 base->typelib, blob->error_codes);
972 /* GIValueInfo functions */
974 g_value_info_get_value (GIValueInfo *info)
976 GIBaseInfo *base = (GIBaseInfo *)info;
977 ValueBlob *blob = (ValueBlob *)&base->typelib->data[base->offset];
979 return (glong)blob->value;
982 /* GIFieldInfo functions */
984 g_field_info_get_flags (GIFieldInfo *info)
986 GIFieldInfoFlags flags;
988 GIBaseInfo *base = (GIBaseInfo *)info;
989 FieldBlob *blob = (FieldBlob *)&base->typelib->data[base->offset];
994 flags = flags | GI_FIELD_IS_READABLE;
997 flags = flags | GI_FIELD_IS_WRITABLE;
1003 g_field_info_get_size (GIFieldInfo *info)
1005 GIBaseInfo *base = (GIBaseInfo *)info;
1006 FieldBlob *blob = (FieldBlob *)&base->typelib->data[base->offset];
1012 g_field_info_get_offset (GIFieldInfo *info)
1014 GIBaseInfo *base = (GIBaseInfo *)info;
1015 FieldBlob *blob = (FieldBlob *)&base->typelib->data[base->offset];
1017 return blob->struct_offset;
1021 g_field_info_get_type (GIFieldInfo *info)
1023 GIBaseInfo *base = (GIBaseInfo *)info;
1025 return g_type_info_new (base, base->typelib, base->offset + 8);
1028 /* GIRegisteredTypeInfo functions */
1030 g_registered_type_info_get_type_name (GIRegisteredTypeInfo *info)
1032 GIBaseInfo *base = (GIBaseInfo *)info;
1033 RegisteredTypeBlob *blob = (RegisteredTypeBlob *)&base->typelib->data[base->offset];
1035 if (blob->gtype_name)
1036 return g_typelib_get_string (base->typelib, blob->gtype_name);
1042 g_registered_type_info_get_type_init (GIRegisteredTypeInfo *info)
1044 GIBaseInfo *base = (GIBaseInfo *)info;
1045 RegisteredTypeBlob *blob = (RegisteredTypeBlob *)&base->typelib->data[base->offset];
1047 if (blob->gtype_init)
1048 return g_typelib_get_string (base->typelib, blob->gtype_init);
1054 g_registered_type_info_get_g_type (GIRegisteredTypeInfo *info)
1056 const char *type_init;
1057 GType (* get_type_func) (void);
1059 type_init = g_registered_type_info_get_type_init (info);
1061 if (type_init == NULL)
1064 get_type_func = NULL;
1065 if (!g_typelib_symbol (((GIBaseInfo*)info)->typelib,
1067 (void**) &get_type_func))
1070 return (* get_type_func) ();
1073 /* GIStructInfo functions */
1075 g_struct_info_get_n_fields (GIStructInfo *info)
1077 GIBaseInfo *base = (GIBaseInfo *)info;
1078 StructBlob *blob = (StructBlob *)&base->typelib->data[base->offset];
1080 return blob->n_fields;
1084 g_struct_info_get_field (GIStructInfo *info,
1087 GIBaseInfo *base = (GIBaseInfo *)info;
1088 Header *header = (Header *)base->typelib->data;
1090 return (GIFieldInfo *) g_info_new (GI_INFO_TYPE_FIELD, base, base->typelib,
1091 base->offset + header->struct_blob_size +
1092 n * header->field_blob_size);
1096 g_struct_info_get_n_methods (GIStructInfo *info)
1098 GIBaseInfo *base = (GIBaseInfo *)info;
1099 StructBlob *blob = (StructBlob *)&base->typelib->data[base->offset];
1101 return blob->n_methods;
1105 g_struct_info_get_method (GIStructInfo *info,
1108 GIBaseInfo *base = (GIBaseInfo *)info;
1109 StructBlob *blob = (StructBlob *)&base->typelib->data[base->offset];
1110 Header *header = (Header *)base->typelib->data;
1113 offset = base->offset + header->struct_blob_size
1114 + blob->n_fields * header->field_blob_size
1115 + n * header->function_blob_size;
1116 return (GIFunctionInfo *) g_info_new (GI_INFO_TYPE_FUNCTION, base,
1117 base->typelib, offset);
1120 static GIFunctionInfo *
1121 find_method (GIBaseInfo *base,
1127 Header *header = (Header *)base->typelib->data;
1130 for (i = 0; i < n_methods; i++)
1132 FunctionBlob *fblob = (FunctionBlob *)&base->typelib->data[offset];
1133 const gchar *fname = (const gchar *)&base->typelib->data[fblob->name];
1135 if (strcmp (name, fname) == 0)
1136 return (GIFunctionInfo *) g_info_new (GI_INFO_TYPE_FUNCTION, base,
1137 base->typelib, offset);
1139 offset += header->function_blob_size;
1146 g_struct_info_find_method (GIStructInfo *info,
1150 GIBaseInfo *base = (GIBaseInfo *)info;
1151 Header *header = (Header *)base->typelib->data;
1152 StructBlob *blob = (StructBlob *)&base->typelib->data[base->offset];
1154 offset = base->offset + header->struct_blob_size
1155 + blob->n_fields * header->field_blob_size;
1157 return find_method (base, offset, blob->n_methods, name);
1161 g_struct_info_get_size (GIStructInfo *info)
1163 GIBaseInfo *base = (GIBaseInfo *)info;
1164 StructBlob *blob = (StructBlob *)&base->typelib->data[base->offset];
1170 g_struct_info_get_alignment (GIStructInfo *info)
1172 GIBaseInfo *base = (GIBaseInfo *)info;
1173 StructBlob *blob = (StructBlob *)&base->typelib->data[base->offset];
1175 return blob->alignment;
1179 g_enum_info_get_n_values (GIEnumInfo *info)
1181 GIBaseInfo *base = (GIBaseInfo *)info;
1182 EnumBlob *blob = (EnumBlob *)&base->typelib->data[base->offset];
1184 return blob->n_values;
1188 g_enum_info_get_value (GIEnumInfo *info,
1191 GIBaseInfo *base = (GIBaseInfo *)info;
1192 Header *header = (Header *)base->typelib->data;
1195 offset = base->offset + header->enum_blob_size
1196 + n * header->value_blob_size;
1197 return (GIValueInfo *) g_info_new (GI_INFO_TYPE_VALUE, base, base->typelib, offset);
1201 * g_enum_info_get_storage_type:
1204 * Gets the tag of the type used for the enum in the C ABI. This will
1205 * will be a signed or unsigned integral type.
1207 * Note that in the current implementation the width of the type is
1208 * computed correctly, but the signed or unsigned nature of the type
1209 * may not match the sign of the type used by the C compiler.
1211 * Return Value: the storage type for the enumeration
1214 g_enum_info_get_storage_type (GIEnumInfo *info)
1216 GIBaseInfo *base = (GIBaseInfo *)info;
1217 EnumBlob *blob = (EnumBlob *)&base->typelib->data[base->offset];
1219 return blob->storage_type;
1222 /* GIObjectInfo functions */
1224 g_object_info_get_parent (GIObjectInfo *info)
1226 GIBaseInfo *base = (GIBaseInfo *)info;
1227 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1230 return (GIObjectInfo *) g_info_from_entry (base->repository,
1231 base->typelib, blob->parent);
1237 g_object_info_get_abstract (GIObjectInfo *info)
1239 GIBaseInfo *base = (GIBaseInfo *)info;
1240 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1241 return blob->abstract != 0;
1245 g_object_info_get_type_name (GIObjectInfo *info)
1247 GIBaseInfo *base = (GIBaseInfo *)info;
1248 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1250 return g_typelib_get_string (base->typelib, blob->gtype_name);
1254 g_object_info_get_type_init (GIObjectInfo *info)
1256 GIBaseInfo *base = (GIBaseInfo *)info;
1257 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1259 return g_typelib_get_string (base->typelib, blob->gtype_init);
1263 g_object_info_get_n_interfaces (GIObjectInfo *info)
1265 GIBaseInfo *base = (GIBaseInfo *)info;
1266 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1268 return blob->n_interfaces;
1272 g_object_info_get_interface (GIObjectInfo *info,
1275 GIBaseInfo *base = (GIBaseInfo *)info;
1276 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1278 return (GIInterfaceInfo *) g_info_from_entry (base->repository,
1279 base->typelib, blob->interfaces[n]);
1283 g_object_info_get_n_fields (GIObjectInfo *info)
1285 GIBaseInfo *base = (GIBaseInfo *)info;
1286 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1288 return blob->n_fields;
1292 g_object_info_get_field (GIObjectInfo *info,
1296 GIBaseInfo *base = (GIBaseInfo *)info;
1297 Header *header = (Header *)base->typelib->data;
1298 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1300 offset = base->offset + header->object_blob_size
1301 + (blob->n_interfaces + blob->n_interfaces % 2) * 2
1302 + n * header->field_blob_size;
1304 return (GIFieldInfo *) g_info_new (GI_INFO_TYPE_FIELD, base, base->typelib, offset);
1308 g_object_info_get_n_properties (GIObjectInfo *info)
1310 GIBaseInfo *base = (GIBaseInfo *)info;
1311 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1313 return blob->n_properties;
1317 g_object_info_get_property (GIObjectInfo *info,
1321 GIBaseInfo *base = (GIBaseInfo *)info;
1322 Header *header = (Header *)base->typelib->data;
1323 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1325 offset = base->offset + header->object_blob_size
1326 + (blob->n_interfaces + blob->n_interfaces % 2) * 2
1327 + blob->n_fields * header->field_blob_size
1328 + n * header->property_blob_size;
1330 return (GIPropertyInfo *) g_info_new (GI_INFO_TYPE_PROPERTY, base,
1331 base->typelib, offset);
1335 g_object_info_get_n_methods (GIObjectInfo *info)
1337 GIBaseInfo *base = (GIBaseInfo *)info;
1338 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1340 return blob->n_methods;
1344 g_object_info_get_method (GIObjectInfo *info,
1348 GIBaseInfo *base = (GIBaseInfo *)info;
1349 Header *header = (Header *)base->typelib->data;
1350 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1352 offset = base->offset + header->object_blob_size
1353 + (blob->n_interfaces + blob->n_interfaces % 2) * 2
1354 + blob->n_fields * header->field_blob_size
1355 + blob->n_properties * header->property_blob_size
1356 + n * header->function_blob_size;
1358 return (GIFunctionInfo *) g_info_new (GI_INFO_TYPE_FUNCTION, base,
1359 base->typelib, offset);
1363 g_object_info_find_method (GIObjectInfo *info,
1367 GIBaseInfo *base = (GIBaseInfo *)info;
1368 Header *header = (Header *)base->typelib->data;
1369 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1371 offset = base->offset + header->object_blob_size
1372 + (blob->n_interfaces + blob->n_interfaces % 2) * 2
1373 + blob->n_fields * header->field_blob_size +
1374 + blob->n_properties * header->property_blob_size;
1376 return find_method (base, offset, blob->n_methods, name);
1380 g_object_info_get_n_signals (GIObjectInfo *info)
1382 GIBaseInfo *base = (GIBaseInfo *)info;
1383 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1385 return blob->n_signals;
1389 g_object_info_get_signal (GIObjectInfo *info,
1393 GIBaseInfo *base = (GIBaseInfo *)info;
1394 Header *header = (Header *)base->typelib->data;
1395 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1397 offset = base->offset + header->object_blob_size
1398 + (blob->n_interfaces + blob->n_interfaces % 2) * 2
1399 + blob->n_fields * header->field_blob_size
1400 + blob->n_properties * header->property_blob_size
1401 + blob->n_methods * header->function_blob_size
1402 + n * header->signal_blob_size;
1404 return (GISignalInfo *) g_info_new (GI_INFO_TYPE_SIGNAL, base,
1405 base->typelib, offset);
1409 g_object_info_get_n_vfuncs (GIObjectInfo *info)
1411 GIBaseInfo *base = (GIBaseInfo *)info;
1412 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1414 return blob->n_vfuncs;
1418 g_object_info_get_vfunc (GIObjectInfo *info,
1422 GIBaseInfo *base = (GIBaseInfo *)info;
1423 Header *header = (Header *)base->typelib->data;
1424 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1426 offset = base->offset + header->object_blob_size
1427 + (blob->n_interfaces + blob->n_interfaces % 2) * 2
1428 + blob->n_fields * header->field_blob_size
1429 + blob->n_properties * header->property_blob_size
1430 + blob->n_methods * header->function_blob_size
1431 + blob->n_signals * header->signal_blob_size
1432 + n * header->vfunc_blob_size;
1434 return (GIVFuncInfo *) g_info_new (GI_INFO_TYPE_VFUNC, base,
1435 base->typelib, offset);
1439 g_object_info_get_n_constants (GIObjectInfo *info)
1441 GIBaseInfo *base = (GIBaseInfo *)info;
1442 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1444 return blob->n_constants;
1448 g_object_info_get_constant (GIObjectInfo *info,
1452 GIBaseInfo *base = (GIBaseInfo *)info;
1453 Header *header = (Header *)base->typelib->data;
1454 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1456 offset = base->offset + header->object_blob_size
1457 + (blob->n_interfaces + blob->n_interfaces % 2) * 2
1458 + blob->n_fields * header->field_blob_size
1459 + blob->n_properties * header->property_blob_size
1460 + blob->n_methods * header->function_blob_size
1461 + blob->n_signals * header->signal_blob_size
1462 + blob->n_vfuncs * header->vfunc_blob_size
1463 + n * header->constant_blob_size;
1465 return (GIConstantInfo *) g_info_new (GI_INFO_TYPE_CONSTANT, base,
1466 base->typelib, offset);
1470 /* GIInterfaceInfo functions */
1472 g_interface_info_get_n_prerequisites (GIInterfaceInfo *info)
1474 GIBaseInfo *base = (GIBaseInfo *)info;
1475 InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset];
1477 return blob->n_prerequisites;
1481 g_interface_info_get_prerequisite (GIInterfaceInfo *info,
1484 GIBaseInfo *base = (GIBaseInfo *)info;
1485 InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset];
1487 return g_info_from_entry (base->repository,
1488 base->typelib, blob->prerequisites[n]);
1493 g_interface_info_get_n_properties (GIInterfaceInfo *info)
1495 GIBaseInfo *base = (GIBaseInfo *)info;
1496 InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset];
1498 return blob->n_properties;
1502 g_interface_info_get_property (GIInterfaceInfo *info,
1506 GIBaseInfo *base = (GIBaseInfo *)info;
1507 Header *header = (Header *)base->typelib->data;
1508 InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset];
1510 offset = base->offset + header->interface_blob_size
1511 + (blob->n_prerequisites + (blob->n_prerequisites % 2)) * 2
1512 + n * header->property_blob_size;
1514 return (GIPropertyInfo *) g_info_new (GI_INFO_TYPE_PROPERTY, base,
1515 base->typelib, offset);
1519 g_interface_info_get_n_methods (GIInterfaceInfo *info)
1521 GIBaseInfo *base = (GIBaseInfo *)info;
1522 InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset];
1524 return blob->n_methods;
1528 g_interface_info_get_method (GIInterfaceInfo *info,
1532 GIBaseInfo *base = (GIBaseInfo *)info;
1533 Header *header = (Header *)base->typelib->data;
1534 InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset];
1536 offset = base->offset + header->interface_blob_size
1537 + (blob->n_prerequisites + (blob->n_prerequisites % 2)) * 2
1538 + blob->n_properties * header->property_blob_size
1539 + n * header->function_blob_size;
1541 return (GIFunctionInfo *) g_info_new (GI_INFO_TYPE_FUNCTION, base,
1542 base->typelib, offset);
1546 g_interface_info_find_method (GIInterfaceInfo *info,
1550 GIBaseInfo *base = (GIBaseInfo *)info;
1551 Header *header = (Header *)base->typelib->data;
1552 InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset];
1554 offset = base->offset + header->interface_blob_size
1555 + (blob->n_prerequisites + (blob->n_prerequisites % 2)) * 2
1556 + blob->n_properties * header->property_blob_size;
1558 return find_method (base, offset, blob->n_methods, name);
1562 g_interface_info_get_n_signals (GIInterfaceInfo *info)
1564 GIBaseInfo *base = (GIBaseInfo *)info;
1565 InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset];
1567 return blob->n_signals;
1571 g_interface_info_get_signal (GIInterfaceInfo *info,
1575 GIBaseInfo *base = (GIBaseInfo *)info;
1576 Header *header = (Header *)base->typelib->data;
1577 InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset];
1579 offset = base->offset + header->interface_blob_size
1580 + (blob->n_prerequisites + (blob->n_prerequisites % 2)) * 2
1581 + blob->n_properties * header->property_blob_size
1582 + blob->n_methods * header->function_blob_size
1583 + n * header->signal_blob_size;
1585 return (GISignalInfo *) g_info_new (GI_INFO_TYPE_SIGNAL, base,
1586 base->typelib, offset);
1590 g_interface_info_get_n_vfuncs (GIInterfaceInfo *info)
1592 GIBaseInfo *base = (GIBaseInfo *)info;
1593 InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset];
1595 return blob->n_vfuncs;
1599 g_interface_info_get_vfunc (GIInterfaceInfo *info,
1603 GIBaseInfo *base = (GIBaseInfo *)info;
1604 Header *header = (Header *)base->typelib->data;
1605 InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset];
1607 offset = base->offset + header->interface_blob_size
1608 + (blob->n_prerequisites + (blob->n_prerequisites % 2)) * 2
1609 + blob->n_properties * header->property_blob_size
1610 + blob->n_methods * header->function_blob_size
1611 + blob->n_signals * header->signal_blob_size
1612 + n * header->vfunc_blob_size;
1614 return (GIVFuncInfo *) g_info_new (GI_INFO_TYPE_VFUNC, base,
1615 base->typelib, offset);
1619 g_interface_info_get_n_constants (GIInterfaceInfo *info)
1621 GIBaseInfo *base = (GIBaseInfo *)info;
1622 InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset];
1624 return blob->n_constants;
1628 g_interface_info_get_constant (GIInterfaceInfo *info,
1632 GIBaseInfo *base = (GIBaseInfo *)info;
1633 Header *header = (Header *)base->typelib->data;
1634 InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset];
1636 offset = base->offset + header->interface_blob_size
1637 + (blob->n_prerequisites + (blob->n_prerequisites % 2)) * 2
1638 + blob->n_properties * header->property_blob_size
1639 + blob->n_methods * header->function_blob_size
1640 + blob->n_signals * header->signal_blob_size
1641 + blob->n_vfuncs * header->vfunc_blob_size
1642 + n * header->constant_blob_size;
1644 return (GIConstantInfo *) g_info_new (GI_INFO_TYPE_CONSTANT, base,
1645 base->typelib, offset);
1651 /* GIPropertyInfo functions */
1653 g_property_info_get_flags (GIPropertyInfo *info)
1656 GIBaseInfo *base = (GIBaseInfo *)info;
1657 PropertyBlob *blob = (PropertyBlob *)&base->typelib->data[base->offset];
1662 flags = flags | G_PARAM_READABLE;
1665 flags = flags | G_PARAM_WRITABLE;
1667 if (blob->construct)
1668 flags = flags | G_PARAM_CONSTRUCT;
1670 if (blob->construct_only)
1671 flags = flags | G_PARAM_CONSTRUCT_ONLY;
1677 g_property_info_get_type (GIPropertyInfo *info)
1679 GIBaseInfo *base = (GIBaseInfo *)info;
1681 return g_type_info_new (base, base->typelib, base->offset + 8);
1685 /* GISignalInfo functions */
1687 g_signal_info_get_flags (GISignalInfo *info)
1691 GIBaseInfo *base = (GIBaseInfo *)info;
1692 SignalBlob *blob = (SignalBlob *)&base->typelib->data[base->offset];
1696 if (blob->run_first)
1697 flags = flags | G_SIGNAL_RUN_FIRST;
1700 flags = flags | G_SIGNAL_RUN_LAST;
1702 if (blob->run_cleanup)
1703 flags = flags | G_SIGNAL_RUN_CLEANUP;
1705 if (blob->no_recurse)
1706 flags = flags | G_SIGNAL_NO_RECURSE;
1709 flags = flags | G_SIGNAL_DETAILED;
1712 flags = flags | G_SIGNAL_ACTION;
1715 flags = flags | G_SIGNAL_NO_HOOKS;
1721 g_signal_info_get_class_closure (GISignalInfo *info)
1723 GIBaseInfo *base = (GIBaseInfo *)info;
1724 SignalBlob *blob = (SignalBlob *)&base->typelib->data[base->offset];
1726 if (blob->has_class_closure)
1727 return g_interface_info_get_vfunc ((GIInterfaceInfo *)base->container, blob->class_closure);
1733 g_signal_info_true_stops_emit (GISignalInfo *info)
1735 GIBaseInfo *base = (GIBaseInfo *)info;
1736 SignalBlob *blob = (SignalBlob *)&base->typelib->data[base->offset];
1738 return blob->true_stops_emit;
1741 /* GIVFuncInfo functions */
1743 g_vfunc_info_get_flags (GIVFuncInfo *info)
1745 GIVFuncInfoFlags flags;
1747 GIBaseInfo *base = (GIBaseInfo *)info;
1748 VFuncBlob *blob = (VFuncBlob *)&base->typelib->data[base->offset];
1752 if (blob->must_chain_up)
1753 flags = flags | GI_VFUNC_MUST_CHAIN_UP;
1755 if (blob->must_be_implemented)
1756 flags = flags | GI_VFUNC_MUST_OVERRIDE;
1758 if (blob->must_not_be_implemented)
1759 flags = flags | GI_VFUNC_MUST_NOT_OVERRIDE;
1765 g_vfunc_info_get_offset (GIVFuncInfo *info)
1767 GIBaseInfo *base = (GIBaseInfo *)info;
1768 VFuncBlob *blob = (VFuncBlob *)&base->typelib->data[base->offset];
1770 return blob->struct_offset;
1774 g_vfunc_info_get_signal (GIVFuncInfo *info)
1776 GIBaseInfo *base = (GIBaseInfo *)info;
1777 VFuncBlob *blob = (VFuncBlob *)&base->typelib->data[base->offset];
1779 if (blob->class_closure)
1780 return g_interface_info_get_signal ((GIInterfaceInfo *)base->container, blob->signal);
1786 /* GIConstantInfo functions */
1788 g_constant_info_get_type (GIConstantInfo *info)
1790 GIBaseInfo *base = (GIBaseInfo *)info;
1792 return g_type_info_new (base, base->typelib, base->offset + 8);
1796 g_constant_info_get_value (GIConstantInfo *info,
1799 GIBaseInfo *base = (GIBaseInfo *)info;
1800 ConstantBlob *blob = (ConstantBlob *)&base->typelib->data[base->offset];
1802 /* FIXME non-basic types ? */
1803 if (blob->type.reserved == 0 && blob->type.reserved2 == 0)
1805 if (blob->type.pointer)
1806 value->v_pointer = g_memdup (&base->typelib->data[blob->offset], blob->size);
1809 switch (blob->type.tag)
1811 case GI_TYPE_TAG_BOOLEAN:
1812 value->v_boolean = *(gboolean*)&base->typelib->data[blob->offset];
1814 case GI_TYPE_TAG_INT8:
1815 value->v_int8 = *(gint8*)&base->typelib->data[blob->offset];
1817 case GI_TYPE_TAG_UINT8:
1818 value->v_uint8 = *(guint8*)&base->typelib->data[blob->offset];
1820 case GI_TYPE_TAG_INT16:
1821 value->v_int16 = *(gint16*)&base->typelib->data[blob->offset];
1823 case GI_TYPE_TAG_UINT16:
1824 value->v_uint16 = *(guint16*)&base->typelib->data[blob->offset];
1826 case GI_TYPE_TAG_INT32:
1827 value->v_int32 = *(gint32*)&base->typelib->data[blob->offset];
1829 case GI_TYPE_TAG_UINT32:
1830 value->v_uint32 = *(guint32*)&base->typelib->data[blob->offset];
1832 case GI_TYPE_TAG_INT64:
1833 value->v_int64 = *(gint64*)&base->typelib->data[blob->offset];
1835 case GI_TYPE_TAG_UINT64:
1836 value->v_uint64 = *(guint64*)&base->typelib->data[blob->offset];
1838 case GI_TYPE_TAG_FLOAT:
1839 value->v_float = *(gfloat*)&base->typelib->data[blob->offset];
1841 case GI_TYPE_TAG_DOUBLE:
1842 value->v_double = *(gdouble*)&base->typelib->data[blob->offset];
1844 case GI_TYPE_TAG_TIME_T:
1845 value->v_long = *(long*)&base->typelib->data[blob->offset];
1847 case GI_TYPE_TAG_INT:
1848 value->v_int = *(gint*)&base->typelib->data[blob->offset];
1850 case GI_TYPE_TAG_UINT:
1851 value->v_uint = *(guint*)&base->typelib->data[blob->offset];
1853 case GI_TYPE_TAG_LONG:
1854 value->v_long = *(glong*)&base->typelib->data[blob->offset];
1856 case GI_TYPE_TAG_ULONG:
1857 value->v_ulong = *(gulong*)&base->typelib->data[blob->offset];
1866 /* GIUnionInfo functions */
1868 g_union_info_get_n_fields (GIUnionInfo *info)
1870 GIBaseInfo *base = (GIBaseInfo *)info;
1871 UnionBlob *blob = (UnionBlob *)&base->typelib->data[base->offset];
1873 return blob->n_fields;
1877 g_union_info_get_field (GIUnionInfo *info,
1880 GIBaseInfo *base = (GIBaseInfo *)info;
1881 Header *header = (Header *)base->typelib->data;
1883 return (GIFieldInfo *) g_info_new (GI_INFO_TYPE_FIELD, base, base->typelib,
1884 base->offset + header->union_blob_size +
1885 n * header->field_blob_size);
1889 g_union_info_get_n_methods (GIUnionInfo *info)
1891 GIBaseInfo *base = (GIBaseInfo *)info;
1892 UnionBlob *blob = (UnionBlob *)&base->typelib->data[base->offset];
1894 return blob->n_functions;
1898 g_union_info_get_method (GIUnionInfo *info,
1901 GIBaseInfo *base = (GIBaseInfo *)info;
1902 UnionBlob *blob = (UnionBlob *)&base->typelib->data[base->offset];
1903 Header *header = (Header *)base->typelib->data;
1906 offset = base->offset + header->union_blob_size
1907 + blob->n_fields * header->field_blob_size
1908 + n * header->function_blob_size;
1909 return (GIFunctionInfo *) g_info_new (GI_INFO_TYPE_FUNCTION, base,
1910 base->typelib, offset);
1914 g_union_info_is_discriminated (GIUnionInfo *info)
1916 GIBaseInfo *base = (GIBaseInfo *)info;
1917 UnionBlob *blob = (UnionBlob *)&base->typelib->data[base->offset];
1919 return blob->discriminated;
1923 g_union_info_get_discriminator_offset (GIUnionInfo *info)
1925 GIBaseInfo *base = (GIBaseInfo *)info;
1926 UnionBlob *blob = (UnionBlob *)&base->typelib->data[base->offset];
1928 return blob->discriminator_offset;
1932 g_union_info_get_discriminator_type (GIUnionInfo *info)
1934 GIBaseInfo *base = (GIBaseInfo *)info;
1936 return g_type_info_new (base, base->typelib, base->offset + 24);
1940 g_union_info_get_discriminator (GIUnionInfo *info,
1943 GIBaseInfo *base = (GIBaseInfo *)info;
1944 UnionBlob *blob = (UnionBlob *)&base->typelib->data[base->offset];
1946 if (blob->discriminated)
1948 Header *header = (Header *)base->typelib->data;
1951 offset = base->offset + header->union_blob_size
1952 + blob->n_fields * header->field_blob_size
1953 + blob->n_functions * header->function_blob_size
1954 + n * header->constant_blob_size;
1956 return (GIConstantInfo *) g_info_new (GI_INFO_TYPE_CONSTANT, base,
1957 base->typelib, offset);
1964 g_union_info_find_method (GIUnionInfo *info,
1968 GIBaseInfo *base = (GIBaseInfo *)info;
1969 Header *header = (Header *)base->typelib->data;
1970 UnionBlob *blob = (UnionBlob *)&base->typelib->data[base->offset];
1972 offset = base->offset + header->union_blob_size
1973 + blob->n_fields * header->field_blob_size;
1975 return find_method (base, offset, blob->n_functions, name);
1979 g_union_info_get_size (GIUnionInfo *info)
1981 GIBaseInfo *base = (GIBaseInfo *)info;
1982 UnionBlob *blob = (UnionBlob *)&base->typelib->data[base->offset];
1988 g_union_info_get_alignment (GIUnionInfo *info)
1990 GIBaseInfo *base = (GIBaseInfo *)info;
1991 UnionBlob *blob = (UnionBlob *)&base->typelib->data[base->offset];
1993 return blob->alignment;