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>
27 #include "girepository.h"
34 GIBaseInfo *container;
40 struct _GIUnresolvedInfo
44 GIBaseInfo *container;
47 const gchar *namespace;
50 struct _GICallableInfo
55 struct _GIFunctionInfo
57 GICallableInfo callable;
60 struct _GICallbackInfo
62 GICallableInfo callable;
65 struct _GIRegisteredTypeInfo
72 GIRegisteredTypeInfo registered;
77 GIRegisteredTypeInfo registered;
82 GIRegisteredTypeInfo registered;
85 struct _GIInterfaceInfo
87 GIRegisteredTypeInfo registered;
90 struct _GIConstantInfo
102 GICallableInfo callable;
107 GICallableInfo callable;
110 struct _GIPropertyInfo
132 GIRegisteredTypeInfo registered;
138 g_info_new (GIInfoType type,
139 GIBaseInfo *container,
145 info = g_new0 (GIBaseInfo, 1);
150 info->typelib = typelib;
151 info->offset = offset;
154 info->container = g_base_info_ref (container);
160 g_info_from_entry (GTypelib *typelib,
164 DirEntry *entry = g_typelib_get_dir_entry (typelib, index);
167 result = g_info_new (entry->blob_type, NULL, typelib, entry->offset);
170 const gchar *namespace = g_typelib_get_string (typelib, entry->offset);
171 const gchar *name = g_typelib_get_string (typelib, entry->name);
173 GIRepository *repository = g_irepository_get_default ();
175 result = g_irepository_find_by_name (repository, namespace, name);
178 GIUnresolvedInfo *unresolved;
180 unresolved = g_new0 (GIUnresolvedInfo, 1);
182 unresolved->type = GI_INFO_TYPE_UNRESOLVED;
183 unresolved->ref_count = 1;
184 unresolved->container = NULL;
185 unresolved->name = name;
186 unresolved->namespace = namespace;
188 return (GIBaseInfo*)unresolved;
196 /* GIBaseInfo functions */
198 g_base_info_ref (GIBaseInfo *info)
206 g_base_info_unref (GIBaseInfo *info)
208 g_assert (info->ref_count > 0);
211 if (!info->ref_count)
214 g_base_info_unref (info->container);
221 g_base_info_get_type (GIBaseInfo *info)
228 g_base_info_get_name (GIBaseInfo *info)
230 g_assert (info->ref_count > 0);
233 case GI_INFO_TYPE_FUNCTION:
234 case GI_INFO_TYPE_CALLBACK:
235 case GI_INFO_TYPE_STRUCT:
236 case GI_INFO_TYPE_BOXED:
237 case GI_INFO_TYPE_ENUM:
238 case GI_INFO_TYPE_FLAGS:
239 case GI_INFO_TYPE_OBJECT:
240 case GI_INFO_TYPE_INTERFACE:
241 case GI_INFO_TYPE_CONSTANT:
242 case GI_INFO_TYPE_ERROR_DOMAIN:
243 case GI_INFO_TYPE_UNION:
245 CommonBlob *blob = (CommonBlob *)&info->typelib->data[info->offset];
247 return g_typelib_get_string (info->typelib, blob->name);
251 case GI_INFO_TYPE_VALUE:
253 ValueBlob *blob = (ValueBlob *)&info->typelib->data[info->offset];
255 return g_typelib_get_string (info->typelib, blob->name);
259 case GI_INFO_TYPE_SIGNAL:
261 SignalBlob *blob = (SignalBlob *)&info->typelib->data[info->offset];
263 return g_typelib_get_string (info->typelib, blob->name);
267 case GI_INFO_TYPE_PROPERTY:
269 PropertyBlob *blob = (PropertyBlob *)&info->typelib->data[info->offset];
271 return g_typelib_get_string (info->typelib, blob->name);
275 case GI_INFO_TYPE_VFUNC:
277 VFuncBlob *blob = (VFuncBlob *)&info->typelib->data[info->offset];
279 return g_typelib_get_string (info->typelib, blob->name);
283 case GI_INFO_TYPE_FIELD:
285 FieldBlob *blob = (FieldBlob *)&info->typelib->data[info->offset];
287 return g_typelib_get_string (info->typelib, blob->name);
291 case GI_INFO_TYPE_ARG:
293 ArgBlob *blob = (ArgBlob *)&info->typelib->data[info->offset];
295 return g_typelib_get_string (info->typelib, blob->name);
298 case GI_INFO_TYPE_UNRESOLVED:
300 GIUnresolvedInfo *unresolved = (GIUnresolvedInfo *)info;
302 return unresolved->name;
305 case GI_INFO_TYPE_TYPE:
307 g_assert_not_reached ();
315 g_base_info_get_namespace (GIBaseInfo *info)
317 Header *header = (Header *)info->typelib->data;
319 g_assert (info->ref_count > 0);
321 if (info->type == GI_INFO_TYPE_UNRESOLVED)
323 GIUnresolvedInfo *unresolved = (GIUnresolvedInfo *)info;
325 return unresolved->namespace;
328 return g_typelib_get_string (info->typelib, header->namespace);
332 g_base_info_is_deprecated (GIBaseInfo *info)
336 case GI_INFO_TYPE_FUNCTION:
337 case GI_INFO_TYPE_CALLBACK:
338 case GI_INFO_TYPE_STRUCT:
339 case GI_INFO_TYPE_BOXED:
340 case GI_INFO_TYPE_ENUM:
341 case GI_INFO_TYPE_FLAGS:
342 case GI_INFO_TYPE_OBJECT:
343 case GI_INFO_TYPE_INTERFACE:
344 case GI_INFO_TYPE_CONSTANT:
345 case GI_INFO_TYPE_ERROR_DOMAIN:
347 CommonBlob *blob = (CommonBlob *)&info->typelib->data[info->offset];
349 return blob->deprecated;
353 case GI_INFO_TYPE_VALUE:
355 ValueBlob *blob = (ValueBlob *)&info->typelib->data[info->offset];
357 return blob->deprecated;
361 case GI_INFO_TYPE_SIGNAL:
363 SignalBlob *blob = (SignalBlob *)&info->typelib->data[info->offset];
365 return blob->deprecated;
369 case GI_INFO_TYPE_PROPERTY:
371 PropertyBlob *blob = (PropertyBlob *)&info->typelib->data[info->offset];
373 return blob->deprecated;
377 case GI_INFO_TYPE_VFUNC:
378 case GI_INFO_TYPE_FIELD:
379 case GI_INFO_TYPE_ARG:
380 case GI_INFO_TYPE_TYPE:
382 /* no deprecation flag for these */
389 cmp_annotation (const void *av,
392 const AnnotationBlob *a = av;
393 const AnnotationBlob *b = bv;
395 if (b->offset < a->offset)
398 if (b->offset > a->offset)
405 g_base_info_get_annotation (GIBaseInfo *info,
408 GIBaseInfo *base = (GIBaseInfo *)info;
409 Header *header = (Header *)base->typelib->data;
410 AnnotationBlob blob, *first, *after, *res, *next;
413 blob.offset = base->offset;
415 first = (AnnotationBlob *) &base->typelib->data[header->annotations];
416 after = (AnnotationBlob *) &base->typelib->data[header->annotations +
417 header->n_annotations * header->annotation_blob_size];
419 res = bsearch (&blob, first, header->n_annotations,
420 header->annotation_blob_size, cmp_annotation);
429 next = res -= header->annotation_blob_size;
431 while (next >= first && next->offset == base->offset);
438 rname = g_typelib_get_string (base->typelib, res->name);
439 if (strcmp (name, rname) == 0)
440 return g_typelib_get_string (base->typelib, res->value);
442 next = res += header->annotation_blob_size;
444 while (next < after && next->offset == base->offset);
450 g_base_info_get_container (GIBaseInfo *info)
452 return info->container;
456 g_base_info_get_typelib (GIBaseInfo *info)
458 return info->typelib;
461 /* GIFunctionInfo functions */
463 g_function_info_get_symbol (GIFunctionInfo *info)
465 GIBaseInfo *base = (GIBaseInfo *)info;
466 FunctionBlob *blob = (FunctionBlob *)&base->typelib->data[base->offset];
468 return g_typelib_get_string (base->typelib, blob->symbol);
472 g_function_info_get_flags (GIFunctionInfo *info)
474 GIFunctionInfoFlags flags;
475 GIBaseInfo *base = (GIBaseInfo *)info;
476 FunctionBlob *blob = (FunctionBlob *)&base->typelib->data[base->offset];
480 /* Make sure we don't flag Constructors as methods */
481 if (base->container != NULL && !blob->constructor)
482 flags = flags | GI_FUNCTION_IS_METHOD;
484 if (blob->constructor)
485 flags = flags | GI_FUNCTION_IS_CONSTRUCTOR;
488 flags = flags | GI_FUNCTION_IS_GETTER;
491 flags = flags | GI_FUNCTION_IS_SETTER;
493 if (blob->wraps_vfunc)
494 flags = flags | GI_FUNCTION_WRAPS_VFUNC;
497 flags = flags | GI_FUNCTION_THROWS;
503 g_function_info_get_property (GIFunctionInfo *info)
505 GIBaseInfo *base = (GIBaseInfo *)info;
506 FunctionBlob *blob = (FunctionBlob *)&base->typelib->data[base->offset];
507 GIInterfaceInfo *container = (GIInterfaceInfo *)base->container;
509 return g_interface_info_get_property (container, blob->index);
513 g_function_info_get_vfunc (GIFunctionInfo *info)
515 GIBaseInfo *base = (GIBaseInfo *)info;
516 FunctionBlob *blob = (FunctionBlob *)&base->typelib->data[base->offset];
517 GIInterfaceInfo *container = (GIInterfaceInfo *)base->container;
519 return g_interface_info_get_vfunc (container, blob->index);
523 /* GICallableInfo functions */
525 signature_offset (GICallableInfo *info)
528 switch (info->base.type)
530 case GI_INFO_TYPE_FUNCTION:
531 sigoff = G_STRUCT_OFFSET (FunctionBlob, signature);
533 case GI_INFO_TYPE_VFUNC:
534 sigoff = G_STRUCT_OFFSET (VFuncBlob, signature);
536 case GI_INFO_TYPE_CALLBACK:
537 sigoff = G_STRUCT_OFFSET (CallbackBlob, signature);
539 case GI_INFO_TYPE_SIGNAL:
540 sigoff = G_STRUCT_OFFSET (SignalBlob, signature);
544 return *(guint32 *)&info->base.typelib->data[info->base.offset + sigoff];
549 g_type_info_new (GIBaseInfo *container,
553 SimpleTypeBlob *type = (SimpleTypeBlob *)&typelib->data[offset];
555 return (GITypeInfo *) g_info_new (GI_INFO_TYPE_TYPE, container, typelib,
556 (type->reserved == 0 && type->reserved2 == 0) ? offset : type->offset);
560 * g_callable_info_get_return_type:
561 * @info: a #GICallableInfo
563 * Get the return type of a callable item as
566 * Returns: a #GITypeInfo idexing the TypeBlob for the
567 * return type of #info
570 g_callable_info_get_return_type (GICallableInfo *info)
572 GIBaseInfo *base = (GIBaseInfo *)info;
575 offset = signature_offset (info);
577 return g_type_info_new (base, base->typelib, offset);
581 * g_callable_info_may_return_null:
582 * @info: a #GICallableInfo
584 * See if a callable could return NULL.
586 * Returns: TRUE if callable could return NULL
589 g_callable_info_may_return_null (GICallableInfo *info)
591 GIBaseInfo *base = (GIBaseInfo *)info;
592 SignatureBlob *blob = (SignatureBlob *)&base->typelib->data[signature_offset (info)];
594 return blob->may_return_null;
598 * g_callable_info_get_caller_owns:
599 * @info: a #GICallableInfo
601 * See whether the caller owns the return value
604 * Returns: TRUE if the caller owns the return value, FALSE otherwise.
607 g_callable_info_get_caller_owns (GICallableInfo *info)
609 GIBaseInfo *base = (GIBaseInfo *)info;
610 SignatureBlob *blob = (SignatureBlob *)&base->typelib->data[signature_offset (info)];
612 if (blob->caller_owns_return_value)
613 return GI_TRANSFER_EVERYTHING;
614 else if (blob->caller_owns_return_container)
615 return GI_TRANSFER_CONTAINER;
617 return GI_TRANSFER_NOTHING;
621 * g_callable_info_get_n_args:
622 * @info: a #GICallableInfo
624 * Get the number of arguments (both IN and OUT) for this callable.
626 * Returns: The number of arguments this callable expects.
629 g_callable_info_get_n_args (GICallableInfo *info)
631 GIBaseInfo *base = (GIBaseInfo *)info;
635 offset = signature_offset (info);
636 blob = (SignatureBlob *)&base->typelib->data[offset];
638 return blob->n_arguments;
642 * g_callable_info_get_arg:
643 * @info: a #GICallableInfo
645 * Get information about a particular argument of this callable.
647 * Returns: A #GIArgInfo indexing the typelib on the given argument.
650 g_callable_info_get_arg (GICallableInfo *info,
653 GIBaseInfo *base = (GIBaseInfo *)info;
654 Header *header = (Header *)base->typelib->data;
657 offset = signature_offset (info);
659 return (GIArgInfo *) g_info_new (GI_INFO_TYPE_ARG, base, base->typelib,
660 offset + header->signature_blob_size + n * header->arg_blob_size);
663 /* GIArgInfo function */
665 g_arg_info_get_direction (GIArgInfo *info)
667 GIBaseInfo *base = (GIBaseInfo *)info;
668 ArgBlob *blob = (ArgBlob *)&base->typelib->data[base->offset];
670 if (blob->in && blob->out)
671 return GI_DIRECTION_INOUT;
673 return GI_DIRECTION_OUT;
675 return GI_DIRECTION_IN;
679 g_arg_info_is_return_value (GIArgInfo *info)
681 GIBaseInfo *base = (GIBaseInfo *)info;
682 ArgBlob *blob = (ArgBlob *)&base->typelib->data[base->offset];
684 return blob->return_value;
688 g_arg_info_is_dipper (GIArgInfo *info)
690 GIBaseInfo *base = (GIBaseInfo *)info;
691 ArgBlob *blob = (ArgBlob *)&base->typelib->data[base->offset];
697 g_arg_info_is_optional (GIArgInfo *info)
699 GIBaseInfo *base = (GIBaseInfo *)info;
700 ArgBlob *blob = (ArgBlob *)&base->typelib->data[base->offset];
702 return blob->optional;
706 g_arg_info_may_be_null (GIArgInfo *info)
708 GIBaseInfo *base = (GIBaseInfo *)info;
709 ArgBlob *blob = (ArgBlob *)&base->typelib->data[base->offset];
711 return blob->allow_none;
715 g_arg_info_get_ownership_transfer (GIArgInfo *info)
717 GIBaseInfo *base = (GIBaseInfo *)info;
718 ArgBlob *blob = (ArgBlob *)&base->typelib->data[base->offset];
720 if (blob->transfer_ownership)
721 return GI_TRANSFER_EVERYTHING;
722 else if (blob->transfer_container_ownership)
723 return GI_TRANSFER_CONTAINER;
725 return GI_TRANSFER_NOTHING;
729 g_arg_info_get_type (GIArgInfo *info)
731 GIBaseInfo *base = (GIBaseInfo *)info;
733 return g_type_info_new (base, base->typelib, base->offset + 8);
736 /* GITypeInfo functions */
738 g_type_info_is_pointer (GITypeInfo *info)
740 GIBaseInfo *base = (GIBaseInfo *)info;
741 SimpleTypeBlob *type = (SimpleTypeBlob *)&base->typelib->data[base->offset];
743 if (type->reserved == 0 && type->reserved2 == 0)
744 return type->pointer;
747 InterfaceTypeBlob *iface = (InterfaceTypeBlob *)&base->typelib->data[base->offset];
749 return iface->pointer;
754 g_type_info_get_tag (GITypeInfo *info)
756 GIBaseInfo *base = (GIBaseInfo *)info;
757 SimpleTypeBlob *type = (SimpleTypeBlob *)&base->typelib->data[base->offset];
759 if (type->reserved == 0 && type->reserved2 == 0)
763 InterfaceTypeBlob *iface = (InterfaceTypeBlob *)&base->typelib->data[base->offset];
770 g_type_info_get_param_type (GITypeInfo *info,
773 GIBaseInfo *base = (GIBaseInfo *)info;
774 SimpleTypeBlob *type = (SimpleTypeBlob *)&base->typelib->data[base->offset];
776 if (!(type->reserved == 0 && type->reserved2 == 0))
778 ParamTypeBlob *param = (ParamTypeBlob *)&base->typelib->data[base->offset];
782 case GI_TYPE_TAG_ARRAY:
783 case GI_TYPE_TAG_GLIST:
784 case GI_TYPE_TAG_GSLIST:
785 case GI_TYPE_TAG_GHASH:
786 return g_type_info_new (base, base->typelib, base->offset + 4 + 4 * n);
797 g_type_info_get_interface (GITypeInfo *info)
799 GIBaseInfo *base = (GIBaseInfo *)info;
800 SimpleTypeBlob *type = (SimpleTypeBlob *)&base->typelib->data[base->offset];
802 if (!(type->reserved == 0 && type->reserved2 == 0))
804 InterfaceTypeBlob *blob = (InterfaceTypeBlob *)&base->typelib->data[base->offset];
806 if (blob->tag == GI_TYPE_TAG_INTERFACE)
807 return g_info_from_entry (base->typelib, blob->interface);
814 g_type_info_get_array_length (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 ArrayTypeBlob *blob = (ArrayTypeBlob *)&base->typelib->data[base->offset];
823 if (blob->tag == GI_TYPE_TAG_ARRAY)
825 if (blob->has_length)
834 g_type_info_is_zero_terminated (GITypeInfo *info)
836 GIBaseInfo *base = (GIBaseInfo *)info;
837 SimpleTypeBlob *type = (SimpleTypeBlob *)&base->typelib->data[base->offset];
839 if (!(type->reserved == 0 && type->reserved2 == 0))
841 ArrayTypeBlob *blob = (ArrayTypeBlob *)&base->typelib->data[base->offset];
843 if (blob->tag == GI_TYPE_TAG_ARRAY)
844 return blob->zero_terminated;
851 g_type_info_get_n_error_domains (GITypeInfo *info)
853 GIBaseInfo *base = (GIBaseInfo *)info;
854 SimpleTypeBlob *type = (SimpleTypeBlob *)&base->typelib->data[base->offset];
856 if (!(type->reserved == 0 && type->reserved2 == 0))
858 ErrorTypeBlob *blob = (ErrorTypeBlob *)&base->typelib->data[base->offset];
860 if (blob->tag == GI_TYPE_TAG_ERROR)
861 return blob->n_domains;
868 g_type_info_get_error_domain (GITypeInfo *info,
871 GIBaseInfo *base = (GIBaseInfo *)info;
872 SimpleTypeBlob *type = (SimpleTypeBlob *)&base->typelib->data[base->offset];
874 if (!(type->reserved == 0 && type->reserved2 == 0))
876 ErrorTypeBlob *blob = (ErrorTypeBlob *)&base->typelib->data[base->offset];
878 if (blob->tag == GI_TYPE_TAG_ERROR)
879 return (GIErrorDomainInfo *) g_info_from_entry (base->typelib,
887 /* GIErrorDomainInfo functions */
889 g_error_domain_info_get_quark (GIErrorDomainInfo *info)
891 GIBaseInfo *base = (GIBaseInfo *)info;
892 ErrorDomainBlob *blob = (ErrorDomainBlob *)&base->typelib->data[base->offset];
894 return g_typelib_get_string (base->typelib, blob->get_quark);
898 g_error_domain_info_get_codes (GIErrorDomainInfo *info)
900 GIBaseInfo *base = (GIBaseInfo *)info;
901 ErrorDomainBlob *blob = (ErrorDomainBlob *)&base->typelib->data[base->offset];
903 return (GIInterfaceInfo *) g_info_from_entry (base->typelib, blob->error_codes);
907 /* GIValueInfo functions */
909 g_value_info_get_value (GIValueInfo *info)
911 GIBaseInfo *base = (GIBaseInfo *)info;
912 ValueBlob *blob = (ValueBlob *)&base->typelib->data[base->offset];
914 return (glong)blob->value;
917 /* GIFieldInfo functions */
919 g_field_info_get_flags (GIFieldInfo *info)
921 GIFieldInfoFlags flags;
923 GIBaseInfo *base = (GIBaseInfo *)info;
924 FieldBlob *blob = (FieldBlob *)&base->typelib->data[base->offset];
929 flags = flags | GI_FIELD_IS_READABLE;
932 flags = flags | GI_FIELD_IS_WRITABLE;
938 g_field_info_get_size (GIFieldInfo *info)
940 GIBaseInfo *base = (GIBaseInfo *)info;
941 FieldBlob *blob = (FieldBlob *)&base->typelib->data[base->offset];
947 g_field_info_get_offset (GIFieldInfo *info)
949 GIBaseInfo *base = (GIBaseInfo *)info;
950 FieldBlob *blob = (FieldBlob *)&base->typelib->data[base->offset];
952 return blob->struct_offset;
956 g_field_info_get_type (GIFieldInfo *info)
958 GIBaseInfo *base = (GIBaseInfo *)info;
960 return g_type_info_new (base, base->typelib, base->offset + 8);
963 /* GIRegisteredTypeInfo functions */
965 g_registered_type_info_get_type_name (GIRegisteredTypeInfo *info)
967 GIBaseInfo *base = (GIBaseInfo *)info;
968 RegisteredTypeBlob *blob = (RegisteredTypeBlob *)&base->typelib->data[base->offset];
970 if (blob->gtype_name)
971 return g_typelib_get_string (base->typelib, blob->gtype_name);
977 g_registered_type_info_get_type_init (GIRegisteredTypeInfo *info)
979 GIBaseInfo *base = (GIBaseInfo *)info;
980 RegisteredTypeBlob *blob = (RegisteredTypeBlob *)&base->typelib->data[base->offset];
982 if (blob->gtype_init)
983 return g_typelib_get_string (base->typelib, blob->gtype_init);
989 g_registered_type_info_get_g_type (GIRegisteredTypeInfo *info)
991 const char *type_init;
992 GType (* get_type_func) (void);
994 type_init = g_registered_type_info_get_type_init (info);
996 if (type_init == NULL)
999 get_type_func = NULL;
1000 if (!g_typelib_symbol (((GIBaseInfo*)info)->typelib,
1002 (void**) &get_type_func))
1005 return (* get_type_func) ();
1008 /* GIStructInfo functions */
1010 g_struct_info_get_n_fields (GIStructInfo *info)
1012 GIBaseInfo *base = (GIBaseInfo *)info;
1013 StructBlob *blob = (StructBlob *)&base->typelib->data[base->offset];
1015 return blob->n_fields;
1019 g_struct_info_get_field (GIStructInfo *info,
1022 GIBaseInfo *base = (GIBaseInfo *)info;
1023 Header *header = (Header *)base->typelib->data;
1025 return (GIFieldInfo *) g_info_new (GI_INFO_TYPE_FIELD, base, base->typelib,
1026 base->offset + header->struct_blob_size +
1027 n * header->field_blob_size);
1031 g_struct_info_get_n_methods (GIStructInfo *info)
1033 GIBaseInfo *base = (GIBaseInfo *)info;
1034 StructBlob *blob = (StructBlob *)&base->typelib->data[base->offset];
1036 return blob->n_methods;
1040 g_struct_info_get_method (GIStructInfo *info,
1043 GIBaseInfo *base = (GIBaseInfo *)info;
1044 StructBlob *blob = (StructBlob *)&base->typelib->data[base->offset];
1045 Header *header = (Header *)base->typelib->data;
1048 offset = base->offset + header->struct_blob_size
1049 + blob->n_fields * header->field_blob_size
1050 + n * header->function_blob_size;
1051 return (GIFunctionInfo *) g_info_new (GI_INFO_TYPE_FUNCTION, base,
1052 base->typelib, offset);
1055 static GIFunctionInfo *
1056 find_method (GIBaseInfo *base,
1062 Header *header = (Header *)base->typelib->data;
1065 for (i = 0; i < n_methods; i++)
1067 FunctionBlob *fblob = (FunctionBlob *)&base->typelib->data[offset];
1068 const gchar *fname = (const gchar *)&base->typelib->data[fblob->name];
1070 if (strcmp (name, fname) == 0)
1071 return (GIFunctionInfo *) g_info_new (GI_INFO_TYPE_FUNCTION, base,
1072 base->typelib, offset);
1074 offset += header->function_blob_size;
1081 g_struct_info_find_method (GIStructInfo *info,
1085 GIBaseInfo *base = (GIBaseInfo *)info;
1086 Header *header = (Header *)base->typelib->data;
1087 StructBlob *blob = (StructBlob *)&base->typelib->data[base->offset];
1089 offset = base->offset + header->struct_blob_size
1090 + blob->n_fields * header->field_blob_size;
1092 return find_method (base, offset, blob->n_methods, name);
1096 g_enum_info_get_n_values (GIEnumInfo *info)
1098 GIBaseInfo *base = (GIBaseInfo *)info;
1099 EnumBlob *blob = (EnumBlob *)&base->typelib->data[base->offset];
1101 return blob->n_values;
1105 g_enum_info_get_value (GIEnumInfo *info,
1108 GIBaseInfo *base = (GIBaseInfo *)info;
1109 Header *header = (Header *)base->typelib->data;
1112 offset = base->offset + header->enum_blob_size
1113 + n * header->value_blob_size;
1114 return (GIValueInfo *) g_info_new (GI_INFO_TYPE_VALUE, base, base->typelib, offset);
1117 /* GIObjectInfo functions */
1119 g_object_info_get_parent (GIObjectInfo *info)
1121 GIBaseInfo *base = (GIBaseInfo *)info;
1122 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1125 return (GIObjectInfo *) g_info_from_entry (base->typelib, blob->parent);
1131 g_object_info_get_abstract (GIObjectInfo *info)
1133 GIBaseInfo *base = (GIBaseInfo *)info;
1134 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1135 return blob->abstract != 0;
1139 g_object_info_get_type_name (GIObjectInfo *info)
1141 GIBaseInfo *base = (GIBaseInfo *)info;
1142 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1144 return g_typelib_get_string (base->typelib, blob->gtype_name);
1148 g_object_info_get_type_init (GIObjectInfo *info)
1150 GIBaseInfo *base = (GIBaseInfo *)info;
1151 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1153 return g_typelib_get_string (base->typelib, blob->gtype_init);
1157 g_object_info_get_n_interfaces (GIObjectInfo *info)
1159 GIBaseInfo *base = (GIBaseInfo *)info;
1160 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1162 return blob->n_interfaces;
1166 g_object_info_get_interface (GIObjectInfo *info,
1169 GIBaseInfo *base = (GIBaseInfo *)info;
1170 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1172 return (GIInterfaceInfo *) g_info_from_entry (base->typelib, blob->interfaces[n]);
1176 g_object_info_get_n_fields (GIObjectInfo *info)
1178 GIBaseInfo *base = (GIBaseInfo *)info;
1179 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1181 return blob->n_fields;
1185 g_object_info_get_field (GIObjectInfo *info,
1189 GIBaseInfo *base = (GIBaseInfo *)info;
1190 Header *header = (Header *)base->typelib->data;
1191 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1193 offset = base->offset + header->object_blob_size
1194 + (blob->n_interfaces + blob->n_interfaces % 2) * 2
1195 + n * header->field_blob_size;
1197 return (GIFieldInfo *) g_info_new (GI_INFO_TYPE_FIELD, base, base->typelib, offset);
1201 g_object_info_get_n_properties (GIObjectInfo *info)
1203 GIBaseInfo *base = (GIBaseInfo *)info;
1204 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1206 return blob->n_properties;
1210 g_object_info_get_property (GIObjectInfo *info,
1214 GIBaseInfo *base = (GIBaseInfo *)info;
1215 Header *header = (Header *)base->typelib->data;
1216 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1218 offset = base->offset + header->object_blob_size
1219 + (blob->n_interfaces + blob->n_interfaces % 2) * 2
1220 + blob->n_fields * header->field_blob_size
1221 + n * header->property_blob_size;
1223 return (GIPropertyInfo *) g_info_new (GI_INFO_TYPE_PROPERTY, base,
1224 base->typelib, offset);
1228 g_object_info_get_n_methods (GIObjectInfo *info)
1230 GIBaseInfo *base = (GIBaseInfo *)info;
1231 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1233 return blob->n_methods;
1237 g_object_info_get_method (GIObjectInfo *info,
1241 GIBaseInfo *base = (GIBaseInfo *)info;
1242 Header *header = (Header *)base->typelib->data;
1243 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1245 offset = base->offset + header->object_blob_size
1246 + (blob->n_interfaces + blob->n_interfaces % 2) * 2
1247 + blob->n_fields * header->field_blob_size
1248 + blob->n_properties * header->property_blob_size
1249 + n * header->function_blob_size;
1251 return (GIFunctionInfo *) g_info_new (GI_INFO_TYPE_FUNCTION, base,
1252 base->typelib, offset);
1256 g_object_info_find_method (GIObjectInfo *info,
1260 GIBaseInfo *base = (GIBaseInfo *)info;
1261 Header *header = (Header *)base->typelib->data;
1262 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1264 offset = base->offset + header->object_blob_size
1265 + (blob->n_interfaces + blob->n_interfaces % 2) * 2
1266 + blob->n_fields * header->field_blob_size +
1267 + blob->n_properties * header->property_blob_size;
1269 return find_method (base, offset, blob->n_methods, name);
1273 g_object_info_get_n_signals (GIObjectInfo *info)
1275 GIBaseInfo *base = (GIBaseInfo *)info;
1276 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1278 return blob->n_signals;
1282 g_object_info_get_signal (GIObjectInfo *info,
1286 GIBaseInfo *base = (GIBaseInfo *)info;
1287 Header *header = (Header *)base->typelib->data;
1288 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1290 offset = base->offset + header->object_blob_size
1291 + (blob->n_interfaces + blob->n_interfaces % 2) * 2
1292 + blob->n_fields * header->field_blob_size
1293 + blob->n_properties * header->property_blob_size
1294 + blob->n_methods * header->function_blob_size
1295 + n * header->signal_blob_size;
1297 return (GISignalInfo *) g_info_new (GI_INFO_TYPE_SIGNAL, base,
1298 base->typelib, offset);
1302 g_object_info_get_n_vfuncs (GIObjectInfo *info)
1304 GIBaseInfo *base = (GIBaseInfo *)info;
1305 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1307 return blob->n_vfuncs;
1311 g_object_info_get_vfunc (GIObjectInfo *info,
1315 GIBaseInfo *base = (GIBaseInfo *)info;
1316 Header *header = (Header *)base->typelib->data;
1317 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1319 offset = base->offset + header->object_blob_size
1320 + (blob->n_interfaces + blob->n_interfaces % 2) * 2
1321 + blob->n_fields * header->field_blob_size
1322 + blob->n_properties * header->property_blob_size
1323 + blob->n_methods * header->function_blob_size
1324 + blob->n_signals * header->signal_blob_size
1325 + n * header->vfunc_blob_size;
1327 return (GIVFuncInfo *) g_info_new (GI_INFO_TYPE_VFUNC, base,
1328 base->typelib, offset);
1332 g_object_info_get_n_constants (GIObjectInfo *info)
1334 GIBaseInfo *base = (GIBaseInfo *)info;
1335 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1337 return blob->n_constants;
1341 g_object_info_get_constant (GIObjectInfo *info,
1345 GIBaseInfo *base = (GIBaseInfo *)info;
1346 Header *header = (Header *)base->typelib->data;
1347 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1349 offset = base->offset + header->object_blob_size
1350 + (blob->n_interfaces + blob->n_interfaces % 2) * 2
1351 + blob->n_fields * header->field_blob_size
1352 + blob->n_properties * header->property_blob_size
1353 + blob->n_methods * header->function_blob_size
1354 + blob->n_signals * header->signal_blob_size
1355 + blob->n_vfuncs * header->vfunc_blob_size
1356 + n * header->constant_blob_size;
1358 return (GIConstantInfo *) g_info_new (GI_INFO_TYPE_CONSTANT, base,
1359 base->typelib, offset);
1363 /* GIInterfaceInfo functions */
1365 g_interface_info_get_n_prerequisites (GIInterfaceInfo *info)
1367 GIBaseInfo *base = (GIBaseInfo *)info;
1368 InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset];
1370 return blob->n_prerequisites;
1374 g_interface_info_get_prerequisite (GIInterfaceInfo *info,
1377 GIBaseInfo *base = (GIBaseInfo *)info;
1378 InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset];
1380 return g_info_from_entry (base->typelib, blob->prerequisites[n]);
1385 g_interface_info_get_n_properties (GIInterfaceInfo *info)
1387 GIBaseInfo *base = (GIBaseInfo *)info;
1388 InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset];
1390 return blob->n_properties;
1394 g_interface_info_get_property (GIInterfaceInfo *info,
1398 GIBaseInfo *base = (GIBaseInfo *)info;
1399 Header *header = (Header *)base->typelib->data;
1400 InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset];
1402 offset = base->offset + header->interface_blob_size
1403 + (blob->n_prerequisites + (blob->n_prerequisites % 2)) * 2
1404 + n * header->property_blob_size;
1406 return (GIPropertyInfo *) g_info_new (GI_INFO_TYPE_PROPERTY, base,
1407 base->typelib, offset);
1411 g_interface_info_get_n_methods (GIInterfaceInfo *info)
1413 GIBaseInfo *base = (GIBaseInfo *)info;
1414 InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset];
1416 return blob->n_methods;
1420 g_interface_info_get_method (GIInterfaceInfo *info,
1424 GIBaseInfo *base = (GIBaseInfo *)info;
1425 Header *header = (Header *)base->typelib->data;
1426 InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset];
1428 offset = base->offset + header->interface_blob_size
1429 + (blob->n_prerequisites + (blob->n_prerequisites % 2)) * 2
1430 + blob->n_properties * header->property_blob_size
1431 + n * header->function_blob_size;
1433 return (GIFunctionInfo *) g_info_new (GI_INFO_TYPE_FUNCTION, base,
1434 base->typelib, offset);
1438 g_interface_info_find_method (GIInterfaceInfo *info,
1442 GIBaseInfo *base = (GIBaseInfo *)info;
1443 Header *header = (Header *)base->typelib->data;
1444 InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset];
1446 offset = base->offset + header->interface_blob_size
1447 + (blob->n_prerequisites + (blob->n_prerequisites % 2)) * 2
1448 + blob->n_properties * header->property_blob_size;
1450 return find_method (base, offset, blob->n_methods, name);
1454 g_interface_info_get_n_signals (GIInterfaceInfo *info)
1456 GIBaseInfo *base = (GIBaseInfo *)info;
1457 InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset];
1459 return blob->n_signals;
1463 g_interface_info_get_signal (GIInterfaceInfo *info,
1467 GIBaseInfo *base = (GIBaseInfo *)info;
1468 Header *header = (Header *)base->typelib->data;
1469 InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset];
1471 offset = base->offset + header->interface_blob_size
1472 + (blob->n_prerequisites + (blob->n_prerequisites % 2)) * 2
1473 + blob->n_properties * header->property_blob_size
1474 + blob->n_methods * header->function_blob_size
1475 + n * header->signal_blob_size;
1477 return (GISignalInfo *) g_info_new (GI_INFO_TYPE_SIGNAL, base,
1478 base->typelib, offset);
1482 g_interface_info_get_n_vfuncs (GIInterfaceInfo *info)
1484 GIBaseInfo *base = (GIBaseInfo *)info;
1485 InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset];
1487 return blob->n_vfuncs;
1491 g_interface_info_get_vfunc (GIInterfaceInfo *info,
1495 GIBaseInfo *base = (GIBaseInfo *)info;
1496 Header *header = (Header *)base->typelib->data;
1497 InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset];
1499 offset = base->offset + header->interface_blob_size
1500 + (blob->n_prerequisites + (blob->n_prerequisites % 2)) * 2
1501 + blob->n_properties * header->property_blob_size
1502 + blob->n_methods * header->function_blob_size
1503 + blob->n_signals * header->signal_blob_size
1504 + n * header->vfunc_blob_size;
1506 return (GIVFuncInfo *) g_info_new (GI_INFO_TYPE_VFUNC, base,
1507 base->typelib, offset);
1511 g_interface_info_get_n_constants (GIInterfaceInfo *info)
1513 GIBaseInfo *base = (GIBaseInfo *)info;
1514 InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset];
1516 return blob->n_constants;
1520 g_interface_info_get_constant (GIInterfaceInfo *info,
1524 GIBaseInfo *base = (GIBaseInfo *)info;
1525 Header *header = (Header *)base->typelib->data;
1526 InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset];
1528 offset = base->offset + header->interface_blob_size
1529 + (blob->n_prerequisites + (blob->n_prerequisites % 2)) * 2
1530 + blob->n_properties * header->property_blob_size
1531 + blob->n_methods * header->function_blob_size
1532 + blob->n_signals * header->signal_blob_size
1533 + blob->n_vfuncs * header->vfunc_blob_size
1534 + n * header->constant_blob_size;
1536 return (GIConstantInfo *) g_info_new (GI_INFO_TYPE_CONSTANT, base,
1537 base->typelib, offset);
1543 /* GIPropertyInfo functions */
1545 g_property_info_get_flags (GIPropertyInfo *info)
1548 GIBaseInfo *base = (GIBaseInfo *)info;
1549 PropertyBlob *blob = (PropertyBlob *)&base->typelib->data[base->offset];
1554 flags = flags | G_PARAM_READABLE;
1557 flags = flags | G_PARAM_WRITABLE;
1559 if (blob->construct)
1560 flags = flags | G_PARAM_CONSTRUCT;
1562 if (blob->construct_only)
1563 flags = flags | G_PARAM_CONSTRUCT_ONLY;
1569 g_property_info_get_type (GIPropertyInfo *info)
1571 GIBaseInfo *base = (GIBaseInfo *)info;
1573 return g_type_info_new (base, base->typelib, base->offset + 8);
1577 /* GISignalInfo functions */
1579 g_signal_info_get_flags (GISignalInfo *info)
1583 GIBaseInfo *base = (GIBaseInfo *)info;
1584 SignalBlob *blob = (SignalBlob *)&base->typelib->data[base->offset];
1588 if (blob->run_first)
1589 flags = flags | G_SIGNAL_RUN_FIRST;
1592 flags = flags | G_SIGNAL_RUN_LAST;
1594 if (blob->run_cleanup)
1595 flags = flags | G_SIGNAL_RUN_CLEANUP;
1597 if (blob->no_recurse)
1598 flags = flags | G_SIGNAL_NO_RECURSE;
1601 flags = flags | G_SIGNAL_DETAILED;
1604 flags = flags | G_SIGNAL_ACTION;
1607 flags = flags | G_SIGNAL_NO_HOOKS;
1613 g_signal_info_get_class_closure (GISignalInfo *info)
1615 GIBaseInfo *base = (GIBaseInfo *)info;
1616 SignalBlob *blob = (SignalBlob *)&base->typelib->data[base->offset];
1618 if (blob->has_class_closure)
1619 return g_interface_info_get_vfunc ((GIInterfaceInfo *)base->container, blob->class_closure);
1625 g_signal_info_true_stops_emit (GISignalInfo *info)
1627 GIBaseInfo *base = (GIBaseInfo *)info;
1628 SignalBlob *blob = (SignalBlob *)&base->typelib->data[base->offset];
1630 return blob->true_stops_emit;
1633 /* GIVFuncInfo functions */
1635 g_vfunc_info_get_flags (GIVFuncInfo *info)
1637 GIVFuncInfoFlags flags;
1639 GIBaseInfo *base = (GIBaseInfo *)info;
1640 VFuncBlob *blob = (VFuncBlob *)&base->typelib->data[base->offset];
1644 if (blob->must_chain_up)
1645 flags = flags | GI_VFUNC_MUST_CHAIN_UP;
1647 if (blob->must_be_implemented)
1648 flags = flags | GI_VFUNC_MUST_OVERRIDE;
1650 if (blob->must_not_be_implemented)
1651 flags = flags | GI_VFUNC_MUST_NOT_OVERRIDE;
1657 g_vfunc_info_get_offset (GIVFuncInfo *info)
1659 GIBaseInfo *base = (GIBaseInfo *)info;
1660 VFuncBlob *blob = (VFuncBlob *)&base->typelib->data[base->offset];
1662 return blob->struct_offset;
1666 g_vfunc_info_get_signal (GIVFuncInfo *info)
1668 GIBaseInfo *base = (GIBaseInfo *)info;
1669 VFuncBlob *blob = (VFuncBlob *)&base->typelib->data[base->offset];
1671 if (blob->class_closure)
1672 return g_interface_info_get_signal ((GIInterfaceInfo *)base->container, blob->signal);
1678 /* GIConstantInfo functions */
1680 g_constant_info_get_type (GIConstantInfo *info)
1682 GIBaseInfo *base = (GIBaseInfo *)info;
1684 return g_type_info_new (base, base->typelib, base->offset + 8);
1688 g_constant_info_get_value (GIConstantInfo *info,
1691 GIBaseInfo *base = (GIBaseInfo *)info;
1692 ConstantBlob *blob = (ConstantBlob *)&base->typelib->data[base->offset];
1694 /* FIXME non-basic types ? */
1695 if (blob->type.reserved == 0 && blob->type.reserved2 == 0)
1697 if (blob->type.pointer)
1698 value->v_pointer = g_memdup (&base->typelib->data[blob->offset], blob->size);
1701 switch (blob->type.tag)
1703 case GI_TYPE_TAG_BOOLEAN:
1704 value->v_boolean = *(gboolean*)&base->typelib->data[blob->offset];
1706 case GI_TYPE_TAG_INT8:
1707 value->v_int8 = *(gint8*)&base->typelib->data[blob->offset];
1709 case GI_TYPE_TAG_UINT8:
1710 value->v_uint8 = *(guint8*)&base->typelib->data[blob->offset];
1712 case GI_TYPE_TAG_INT16:
1713 value->v_int16 = *(gint16*)&base->typelib->data[blob->offset];
1715 case GI_TYPE_TAG_UINT16:
1716 value->v_uint16 = *(guint16*)&base->typelib->data[blob->offset];
1718 case GI_TYPE_TAG_INT32:
1719 value->v_int32 = *(gint32*)&base->typelib->data[blob->offset];
1721 case GI_TYPE_TAG_UINT32:
1722 value->v_uint32 = *(guint32*)&base->typelib->data[blob->offset];
1724 case GI_TYPE_TAG_INT64:
1725 value->v_int64 = *(gint64*)&base->typelib->data[blob->offset];
1727 case GI_TYPE_TAG_UINT64:
1728 value->v_uint64 = *(guint64*)&base->typelib->data[blob->offset];
1730 case GI_TYPE_TAG_FLOAT:
1731 value->v_float = *(gfloat*)&base->typelib->data[blob->offset];
1733 case GI_TYPE_TAG_DOUBLE:
1734 value->v_double = *(gdouble*)&base->typelib->data[blob->offset];
1736 case GI_TYPE_TAG_TIME_T:
1737 value->v_long = *(long*)&base->typelib->data[blob->offset];
1739 case GI_TYPE_TAG_INT:
1740 value->v_int = *(gint*)&base->typelib->data[blob->offset];
1742 case GI_TYPE_TAG_UINT:
1743 value->v_uint = *(guint*)&base->typelib->data[blob->offset];
1745 case GI_TYPE_TAG_LONG:
1746 value->v_long = *(glong*)&base->typelib->data[blob->offset];
1748 case GI_TYPE_TAG_ULONG:
1749 value->v_ulong = *(gulong*)&base->typelib->data[blob->offset];
1758 /* GIUnionInfo functions */
1760 g_union_info_get_n_fields (GIUnionInfo *info)
1762 GIBaseInfo *base = (GIBaseInfo *)info;
1763 UnionBlob *blob = (UnionBlob *)&base->typelib->data[base->offset];
1765 return blob->n_fields;
1769 g_union_info_get_field (GIUnionInfo *info,
1772 GIBaseInfo *base = (GIBaseInfo *)info;
1773 Header *header = (Header *)base->typelib->data;
1775 return (GIFieldInfo *) g_info_new (GI_INFO_TYPE_FIELD, base, base->typelib,
1776 base->offset + header->union_blob_size +
1777 n * header->field_blob_size);
1781 g_union_info_get_n_methods (GIUnionInfo *info)
1783 GIBaseInfo *base = (GIBaseInfo *)info;
1784 UnionBlob *blob = (UnionBlob *)&base->typelib->data[base->offset];
1786 return blob->n_functions;
1790 g_union_info_get_method (GIUnionInfo *info,
1793 GIBaseInfo *base = (GIBaseInfo *)info;
1794 UnionBlob *blob = (UnionBlob *)&base->typelib->data[base->offset];
1795 Header *header = (Header *)base->typelib->data;
1798 offset = base->offset + header->union_blob_size
1799 + blob->n_fields * header->field_blob_size
1800 + n * header->function_blob_size;
1801 return (GIFunctionInfo *) g_info_new (GI_INFO_TYPE_FUNCTION, base,
1802 base->typelib, offset);
1806 g_union_info_is_discriminated (GIUnionInfo *info)
1808 GIBaseInfo *base = (GIBaseInfo *)info;
1809 UnionBlob *blob = (UnionBlob *)&base->typelib->data[base->offset];
1811 return blob->discriminated;
1815 g_union_info_get_discriminator_offset (GIUnionInfo *info)
1817 GIBaseInfo *base = (GIBaseInfo *)info;
1818 UnionBlob *blob = (UnionBlob *)&base->typelib->data[base->offset];
1820 return blob->discriminator_offset;
1824 g_union_info_get_discriminator_type (GIUnionInfo *info)
1826 GIBaseInfo *base = (GIBaseInfo *)info;
1828 return g_type_info_new (base, base->typelib, base->offset + 24);
1832 g_union_info_get_discriminator (GIUnionInfo *info,
1835 GIBaseInfo *base = (GIBaseInfo *)info;
1836 UnionBlob *blob = (UnionBlob *)&base->typelib->data[base->offset];
1838 if (blob->discriminated)
1840 Header *header = (Header *)base->typelib->data;
1843 offset = base->offset + header->union_blob_size
1844 + blob->n_fields * header->field_blob_size
1845 + blob->n_functions * header->function_blob_size
1846 + n * header->constant_blob_size;
1848 return (GIConstantInfo *) g_info_new (GI_INFO_TYPE_CONSTANT, base,
1849 base->typelib, offset);
1856 g_union_info_find_method (GIUnionInfo *info,
1860 GIBaseInfo *base = (GIBaseInfo *)info;
1861 Header *header = (Header *)base->typelib->data;
1862 UnionBlob *blob = (UnionBlob *)&base->typelib->data[base->offset];
1864 offset = base->offset + header->union_blob_size
1865 + blob->n_fields * header->field_blob_size;
1867 return find_method (base, offset, blob->n_functions, name);