diff options
author | Joe Marcus Clarke <marcus@FreeBSD.org> | 2010-02-11 07:19:22 +0000 |
---|---|---|
committer | Joe Marcus Clarke <marcus@FreeBSD.org> | 2010-02-11 07:19:22 +0000 |
commit | fae17ad28774810f36d48a1ccd001a3c9729d69a (patch) | |
tree | 6bc3d4a15086715685d5523afe8179f732182434 /devel/gobject-introspection | |
parent | 236a7514fa01a4e68ed920e87becaab2a80728d0 (diff) | |
download | ports-fae17ad28774810f36d48a1ccd001a3c9729d69a.tar.gz ports-fae17ad28774810f36d48a1ccd001a3c9729d69a.zip |
Notes
Diffstat (limited to 'devel/gobject-introspection')
-rw-r--r-- | devel/gobject-introspection/files/patch-20091207 | 2632 | ||||
-rw-r--r-- | devel/gobject-introspection/files/patch-20100107 | 66 | ||||
-rw-r--r-- | devel/gobject-introspection/files/patch-girepository_girnode.c | 12 |
3 files changed, 2710 insertions, 0 deletions
diff --git a/devel/gobject-introspection/files/patch-20091207 b/devel/gobject-introspection/files/patch-20091207 new file mode 100644 index 000000000000..fa0b93cf3086 --- /dev/null +++ b/devel/gobject-introspection/files/patch-20091207 @@ -0,0 +1,2632 @@ +From 804f59f40c027cf1fb2944764adea564dff07678 Mon Sep 17 00:00:00 2001 +From: Colin Walters <walters@verbum.org> +Date: Mon, 07 Dec 2009 23:35:06 +0000 +Subject: Allow stack allocating GIBaseInfo, add stack retrieval variants + +We don't want to malloc each GIBaseInfo when they can be used in +function invocation; instead, allow stack allocation. + +There were a lot of structure typedefs which were actually just +exactly the same as GIBaseInfo, with the one exception of GITypeInfo. + +Instead, just put the single GITypeInfo boolean inside GIBaseInfo +as a bit in a bitfield. + +GIBaseInfo is still opaque publicly; GIRealInfo is the new +internal structure. + +Using this, add new functions to retrieve arguments and argument types +on the stack. + +https://bugzilla.gnome.org/show_bug.cgi?id=604074 +--- +diff --git a/girepository/ginfo.c b/girepository/ginfo.c +index 2aacb76..b11cc8f 100644 +--- girepository/ginfo.c ++++ girepository/ginfo.c +@@ -28,11 +28,19 @@ + #include "gtypelib.h" + #include "ginfo.h" + +-struct _GIBaseInfo ++typedef struct _GIRealInfo GIRealInfo; ++ ++/** ++ * We just use one structure for all of the info object ++ * types; in general, we should be reading data directly ++ * from the typelib, and not having computed data in ++ * per-type structures. ++ */ ++struct _GIRealInfo + { + /* Keep this part in sync with GIUnresolvedInfo below */ +- gint type; +- gint ref_count; ++ gint32 type; ++ gint32 ref_count; + GIRepository *repository; + GIBaseInfo *container; + +@@ -40,13 +48,18 @@ struct _GIBaseInfo + + GTypelib *typelib; + guint32 offset; ++ ++ guint32 type_is_embedded : 1; /* Used by GITypeInfo */ ++ guint32 reserved : 31; ++ ++ gpointer reserved2[4]; + }; + + struct _GIUnresolvedInfo + { + /* Keep this part in sync with GIBaseInfo above */ +- gint type; +- gint ref_count; ++ gint32 type; ++ gint32 ref_count; + GIRepository *repository; + GIBaseInfo *container; + +@@ -56,137 +69,68 @@ struct _GIUnresolvedInfo + const gchar *namespace; + }; + +-struct _GICallableInfo +-{ +- GIBaseInfo base; +-}; +- +-struct _GIFunctionInfo +-{ +- GICallableInfo callable; +-}; +- +-struct _GICallbackInfo +-{ +- GICallableInfo callable; +-}; +- +-struct _GIRegisteredTypeInfo +-{ +- GIBaseInfo base; +-}; +- +-struct _GIStructInfo +-{ +- GIRegisteredTypeInfo registered; +-}; +- +-struct _GIEnumInfo +-{ +- GIRegisteredTypeInfo registered; +-}; +- +-struct _GIObjectInfo +-{ +- GIRegisteredTypeInfo registered; +-}; +- +-struct _GIInterfaceInfo +-{ +- GIRegisteredTypeInfo registered; +-}; +- +-struct _GIConstantInfo +-{ +- GIBaseInfo base; +-}; +- +-struct _GIValueInfo +-{ +- GIBaseInfo base; +-}; +- +-struct _GISignalInfo +-{ +- GICallableInfo callable; +-}; +- +-struct _GIVFuncInfo +-{ +- GICallableInfo callable; +-}; +- +-struct _GIPropertyInfo +-{ +- GIBaseInfo base; +-}; +- +-struct _GIFieldInfo ++static void ++g_info_init (GIRealInfo *info, ++ GIInfoType type, ++ GIRepository *repository, ++ GIBaseInfo *container, ++ GTypelib *typelib, ++ guint32 offset) + { +- GIBaseInfo base; +-}; ++ memset (info, 0, sizeof (GIRealInfo)); + +-struct _GIArgInfo +-{ +- GIBaseInfo base; +-}; ++ /* Invalid refcount used to flag stack-allocated infos */ ++ info->ref_count = 0xFFFF; ++ info->type = type; + +-struct _GITypeInfo +-{ +- GIBaseInfo base; +- gboolean is_embedded; +-}; ++ info->typelib = typelib; ++ info->offset = offset; + +-struct _GIUnionInfo +-{ +- GIRegisteredTypeInfo registered; +-}; ++ if (container) ++ info->container = container; + ++ g_assert (G_IS_IREPOSITORY (repository)); ++ info->repository = repository; ++} + + /* info creation */ + GIBaseInfo * + g_info_new_full (GIInfoType type, +- GIRepository *repository, +- GIBaseInfo *container, +- GTypelib *typelib, +- guint32 offset) ++ GIRepository *repository, ++ GIBaseInfo *container, ++ GTypelib *typelib, ++ guint32 offset) + { +- GIBaseInfo *info; ++ GIRealInfo *info; + + g_return_val_if_fail (container != NULL || repository != NULL, NULL); + +- if (type == GI_INFO_TYPE_TYPE) +- info = (GIBaseInfo *)g_new0 (GITypeInfo, 1); +- else +- info = g_new0 (GIBaseInfo, 1); +- ++ info = g_new (GIRealInfo, 1); ++ ++ g_info_init (info, type, repository, container, typelib, offset); + info->ref_count = 1; +- info->type = type; +- +- info->typelib = typelib; +- info->offset = offset; + +- if (container) +- info->container = g_base_info_ref (container); ++ if (container && ((GIRealInfo *) container)->ref_count != 0xFFFF) ++ g_base_info_ref (info->container); + +- info->repository = g_object_ref (repository); ++ g_object_ref (info->repository); + +- return info; ++ return (GIBaseInfo*)info; + } + + GIBaseInfo * + g_info_new (GIInfoType type, +- GIBaseInfo *container, +- GTypelib *typelib, +- guint32 offset) ++ GIBaseInfo *container, ++ GTypelib *typelib, ++ guint32 offset) + { +- return g_info_new_full (type, container->repository, container, typelib, offset); ++ return g_info_new_full (type, ((GIRealInfo*)container)->repository, container, typelib, offset); + } + + static GIBaseInfo * + g_info_from_entry (GIRepository *repository, +- GTypelib *typelib, +- guint16 index) ++ GTypelib *typelib, ++ guint16 index) + { + GIBaseInfo *result; + DirEntry *entry = g_typelib_get_dir_entry (typelib, index); +@@ -200,31 +144,34 @@ g_info_from_entry (GIRepository *repository, + + result = g_irepository_find_by_name (repository, namespace, name); + if (result == NULL) +- { +- GIUnresolvedInfo *unresolved; ++ { ++ GIUnresolvedInfo *unresolved; + +- unresolved = g_new0 (GIUnresolvedInfo, 1); ++ unresolved = g_new0 (GIUnresolvedInfo, 1); + +- unresolved->type = GI_INFO_TYPE_UNRESOLVED; +- unresolved->ref_count = 1; +- unresolved->repository = g_object_ref (repository); +- unresolved->container = NULL; +- unresolved->name = name; +- unresolved->namespace = namespace; ++ unresolved->type = GI_INFO_TYPE_UNRESOLVED; ++ unresolved->ref_count = 1; ++ unresolved->repository = g_object_ref (repository); ++ unresolved->container = NULL; ++ unresolved->name = name; ++ unresolved->namespace = namespace; + +- return (GIBaseInfo*)unresolved; +- } +- return result; ++ return (GIBaseInfo *)unresolved; ++ } ++ return (GIBaseInfo *)result; + } + +- return result; ++ return (GIBaseInfo *)result; + } + + /* GIBaseInfo functions */ + GIBaseInfo * + g_base_info_ref (GIBaseInfo *info) + { +- info->ref_count++; ++ GIRealInfo *rinfo = (GIRealInfo*)info; ++ ++ g_assert (rinfo->ref_count != 0xFFFF); ++ ((GIRealInfo*)info)->ref_count++; + + return info; + } +@@ -232,18 +179,20 @@ g_base_info_ref (GIBaseInfo *info) + void + g_base_info_unref (GIBaseInfo *info) + { +- g_assert (info->ref_count > 0); +- info->ref_count--; ++ GIRealInfo *rinfo = (GIRealInfo*)info; ++ ++ g_assert (rinfo->ref_count > 0 && rinfo->ref_count != 0xFFFF); ++ rinfo->ref_count--; + +- if (!info->ref_count) ++ if (!rinfo->ref_count) + { +- if (info->container) +- g_base_info_unref (info->container); ++ if (rinfo->container && ((GIRealInfo *) rinfo->container)->ref_count != 0xFFFF) ++ g_base_info_unref (rinfo->container); + +- if (info->repository) +- g_object_unref (info->repository); ++ if (rinfo->repository) ++ g_object_unref (rinfo->repository); + +- g_free (info); ++ g_free (rinfo); + } + } + +@@ -251,14 +200,15 @@ GIInfoType + g_base_info_get_type (GIBaseInfo *info) + { + +- return info->type; ++ return ((GIRealInfo*)info)->type; + } + + const gchar * + g_base_info_get_name (GIBaseInfo *info) + { +- g_assert (info->ref_count > 0); +- switch (info->type) ++ GIRealInfo *rinfo = (GIRealInfo*)info; ++ g_assert (rinfo->ref_count > 0); ++ switch (rinfo->type) + { + case GI_INFO_TYPE_FUNCTION: + case GI_INFO_TYPE_CALLBACK: +@@ -272,64 +222,64 @@ g_base_info_get_name (GIBaseInfo *info) + case GI_INFO_TYPE_ERROR_DOMAIN: + case GI_INFO_TYPE_UNION: + { +- CommonBlob *blob = (CommonBlob *)&info->typelib->data[info->offset]; ++ CommonBlob *blob = (CommonBlob *)&rinfo->typelib->data[rinfo->offset]; + +- return g_typelib_get_string (info->typelib, blob->name); ++ return g_typelib_get_string (rinfo->typelib, blob->name); + } + break; + + case GI_INFO_TYPE_VALUE: + { +- ValueBlob *blob = (ValueBlob *)&info->typelib->data[info->offset]; ++ ValueBlob *blob = (ValueBlob *)&rinfo->typelib->data[rinfo->offset]; + +- return g_typelib_get_string (info->typelib, blob->name); ++ return g_typelib_get_string (rinfo->typelib, blob->name); + } + break; + + case GI_INFO_TYPE_SIGNAL: + { +- SignalBlob *blob = (SignalBlob *)&info->typelib->data[info->offset]; ++ SignalBlob *blob = (SignalBlob *)&rinfo->typelib->data[rinfo->offset]; + +- return g_typelib_get_string (info->typelib, blob->name); ++ return g_typelib_get_string (rinfo->typelib, blob->name); + } + break; + + case GI_INFO_TYPE_PROPERTY: + { +- PropertyBlob *blob = (PropertyBlob *)&info->typelib->data[info->offset]; ++ PropertyBlob *blob = (PropertyBlob *)&rinfo->typelib->data[rinfo->offset]; + +- return g_typelib_get_string (info->typelib, blob->name); ++ return g_typelib_get_string (rinfo->typelib, blob->name); + } + break; + + case GI_INFO_TYPE_VFUNC: + { +- VFuncBlob *blob = (VFuncBlob *)&info->typelib->data[info->offset]; ++ VFuncBlob *blob = (VFuncBlob *)&rinfo->typelib->data[rinfo->offset]; + +- return g_typelib_get_string (info->typelib, blob->name); ++ return g_typelib_get_string (rinfo->typelib, blob->name); + } + break; + + case GI_INFO_TYPE_FIELD: + { +- FieldBlob *blob = (FieldBlob *)&info->typelib->data[info->offset]; ++ FieldBlob *blob = (FieldBlob *)&rinfo->typelib->data[rinfo->offset]; + +- return g_typelib_get_string (info->typelib, blob->name); ++ return g_typelib_get_string (rinfo->typelib, blob->name); + } + break; + + case GI_INFO_TYPE_ARG: + { +- ArgBlob *blob = (ArgBlob *)&info->typelib->data[info->offset]; ++ ArgBlob *blob = (ArgBlob *)&rinfo->typelib->data[rinfo->offset]; + +- return g_typelib_get_string (info->typelib, blob->name); ++ return g_typelib_get_string (rinfo->typelib, blob->name); + } + break; + case GI_INFO_TYPE_UNRESOLVED: + { +- GIUnresolvedInfo *unresolved = (GIUnresolvedInfo *)info; ++ GIUnresolvedInfo *unresolved = (GIUnresolvedInfo *)info; + +- return unresolved->name; ++ return unresolved->name; + } + break; + case GI_INFO_TYPE_TYPE: +@@ -344,24 +294,26 @@ g_base_info_get_name (GIBaseInfo *info) + const gchar * + g_base_info_get_namespace (GIBaseInfo *info) + { +- Header *header = (Header *)info->typelib->data; ++ GIRealInfo *rinfo = (GIRealInfo*) info; ++ Header *header = (Header *)rinfo->typelib->data; + +- g_assert (info->ref_count > 0); ++ g_assert (rinfo->ref_count > 0); + +- if (info->type == GI_INFO_TYPE_UNRESOLVED) ++ if (rinfo->type == GI_INFO_TYPE_UNRESOLVED) + { + GIUnresolvedInfo *unresolved = (GIUnresolvedInfo *)info; + + return unresolved->namespace; + } + +- return g_typelib_get_string (info->typelib, header->namespace); ++ return g_typelib_get_string (rinfo->typelib, header->namespace); + } + + gboolean + g_base_info_is_deprecated (GIBaseInfo *info) + { +- switch (info->type) ++ GIRealInfo *rinfo = (GIRealInfo*) info; ++ switch (rinfo->type) + { + case GI_INFO_TYPE_FUNCTION: + case GI_INFO_TYPE_CALLBACK: +@@ -374,33 +326,33 @@ g_base_info_is_deprecated (GIBaseInfo *info) + case GI_INFO_TYPE_CONSTANT: + case GI_INFO_TYPE_ERROR_DOMAIN: + { +- CommonBlob *blob = (CommonBlob *)&info->typelib->data[info->offset]; ++ CommonBlob *blob = (CommonBlob *)&rinfo->typelib->data[rinfo->offset]; + +- return blob->deprecated; ++ return blob->deprecated; + } + break; + + case GI_INFO_TYPE_VALUE: + { +- ValueBlob *blob = (ValueBlob *)&info->typelib->data[info->offset]; ++ ValueBlob *blob = (ValueBlob *)&rinfo->typelib->data[rinfo->offset]; + +- return blob->deprecated; ++ return blob->deprecated; + } + break; + + case GI_INFO_TYPE_SIGNAL: + { +- SignalBlob *blob = (SignalBlob *)&info->typelib->data[info->offset]; ++ SignalBlob *blob = (SignalBlob *)&rinfo->typelib->data[rinfo->offset]; + +- return blob->deprecated; ++ return blob->deprecated; + } + break; + + case GI_INFO_TYPE_PROPERTY: + { +- PropertyBlob *blob = (PropertyBlob *)&info->typelib->data[info->offset]; ++ PropertyBlob *blob = (PropertyBlob *)&rinfo->typelib->data[rinfo->offset]; + +- return blob->deprecated; ++ return blob->deprecated; + } + break; + +@@ -426,7 +378,7 @@ g_base_info_is_deprecated (GIBaseInfo *info) + */ + const gchar * + g_base_info_get_attribute (GIBaseInfo *info, +- const gchar *name) ++ const gchar *name) + { + GIAttributeIter iter = { 0, }; + gchar *curname, *curvalue; +@@ -455,15 +407,14 @@ cmp_attribute (const void *av, + } + + static AttributeBlob * +-find_first_attribute (GIBaseInfo *info) ++find_first_attribute (GIRealInfo *rinfo) + { +- GIBaseInfo *base = (GIBaseInfo *)info; +- Header *header = (Header *)base->typelib->data; ++ Header *header = (Header *)rinfo->typelib->data; + AttributeBlob blob, *first, *res, *previous; + +- blob.offset = base->offset; ++ blob.offset = rinfo->offset; + +- first = (AttributeBlob *) &base->typelib->data[header->attributes]; ++ first = (AttributeBlob *) &rinfo->typelib->data[header->attributes]; + + res = bsearch (&blob, first, header->n_attributes, + header->attribute_blob_size, cmp_attribute); +@@ -472,7 +423,7 @@ find_first_attribute (GIBaseInfo *info) + return NULL; + + previous = res - 1; +- while (previous >= first && previous->offset == base->offset) ++ while (previous >= first && previous->offset == rinfo->offset) + { + res = previous; + previous = res - 1; +@@ -520,23 +471,23 @@ g_base_info_iterate_attributes (GIBaseInfo *info, + gchar **name, + gchar **value) + { +- GIBaseInfo *base = (GIBaseInfo *)info; +- Header *header = (Header *)base->typelib->data; ++ GIRealInfo *rinfo = (GIRealInfo *)info; ++ Header *header = (Header *)rinfo->typelib->data; + AttributeBlob *next, *after; + +- after = (AttributeBlob *) &base->typelib->data[header->attributes + ++ after = (AttributeBlob *) &rinfo->typelib->data[header->attributes + + header->n_attributes * header->attribute_blob_size]; + + if (iter->data != NULL) + next = (AttributeBlob *) iter->data; + else +- next = find_first_attribute (info); ++ next = find_first_attribute (rinfo); + +- if (next == NULL || next->offset != base->offset || next >= after) ++ if (next == NULL || next->offset != rinfo->offset || next >= after) + return FALSE; + +- *name = (gchar*) g_typelib_get_string (base->typelib, next->name); +- *value = (gchar*) g_typelib_get_string (base->typelib, next->value); ++ *name = (gchar*) g_typelib_get_string (rinfo->typelib, next->name); ++ *value = (gchar*) g_typelib_get_string (rinfo->typelib, next->value); + iter->data = next + 1; + + return TRUE; +@@ -545,13 +496,13 @@ g_base_info_iterate_attributes (GIBaseInfo *info, + GIBaseInfo * + g_base_info_get_container (GIBaseInfo *info) + { +- return info->container; ++ return ((GIRealInfo*)info)->container; + } + + GTypelib * + g_base_info_get_typelib (GIBaseInfo *info) + { +- return info->typelib; ++ return ((GIRealInfo*)info)->typelib; + } + + /* +@@ -571,25 +522,27 @@ gboolean + g_base_info_equal (GIBaseInfo *info1, GIBaseInfo *info2) + { + /* Compare the TypeLib pointers, which are mmapped. */ +- return info1->typelib->data + info1->offset == info2->typelib->data + info2->offset; ++ GIRealInfo *rinfo1 = (GIRealInfo*)info1; ++ GIRealInfo *rinfo2 = (GIRealInfo*)info2; ++ return rinfo1->typelib->data + rinfo1->offset == rinfo2->typelib->data + rinfo2->offset; + } + + /* GIFunctionInfo functions */ + const gchar * + g_function_info_get_symbol (GIFunctionInfo *info) + { +- GIBaseInfo *base = (GIBaseInfo *)info; +- FunctionBlob *blob = (FunctionBlob *)&base->typelib->data[base->offset]; ++ GIRealInfo *rinfo = (GIRealInfo *)info; ++ FunctionBlob *blob = (FunctionBlob *)&rinfo->typelib->data[rinfo->offset]; + +- return g_typelib_get_string (base->typelib, blob->symbol); ++ return g_typelib_get_string (rinfo->typelib, blob->symbol); + } + + GIFunctionInfoFlags + g_function_info_get_flags (GIFunctionInfo *info) + { + GIFunctionInfoFlags flags; +- GIBaseInfo *base = (GIBaseInfo *)info; +- FunctionBlob *blob = (FunctionBlob *)&base->typelib->data[base->offset]; ++ GIRealInfo *rinfo = (GIRealInfo *)info; ++ FunctionBlob *blob = (FunctionBlob *)&rinfo->typelib->data[rinfo->offset]; + + flags = 0; + +@@ -618,9 +571,9 @@ g_function_info_get_flags (GIFunctionInfo *info) + GIPropertyInfo * + g_function_info_get_property (GIFunctionInfo *info) + { +- GIBaseInfo *base = (GIBaseInfo *)info; +- FunctionBlob *blob = (FunctionBlob *)&base->typelib->data[base->offset]; +- GIInterfaceInfo *container = (GIInterfaceInfo *)base->container; ++ GIRealInfo *rinfo = (GIRealInfo *)info; ++ FunctionBlob *blob = (FunctionBlob *)&rinfo->typelib->data[rinfo->offset]; ++ GIInterfaceInfo *container = (GIInterfaceInfo *)rinfo->container; + + return g_interface_info_get_property (container, blob->index); + } +@@ -628,20 +581,21 @@ g_function_info_get_property (GIFunctionInfo *info) + GIVFuncInfo * + g_function_info_get_vfunc (GIFunctionInfo *info) + { +- GIBaseInfo *base = (GIBaseInfo *)info; +- FunctionBlob *blob = (FunctionBlob *)&base->typelib->data[base->offset]; +- GIInterfaceInfo *container = (GIInterfaceInfo *)base->container; ++ GIRealInfo *rinfo = (GIRealInfo*)info; ++ FunctionBlob *blob = (FunctionBlob *)&rinfo->typelib->data[rinfo->offset]; ++ GIInterfaceInfo *container = (GIInterfaceInfo *)rinfo->container; + + return g_interface_info_get_vfunc (container, blob->index); + } + +- + /* GICallableInfo functions */ + static guint32 + signature_offset (GICallableInfo *info) + { ++ GIRealInfo *rinfo = (GIRealInfo*)info; + int sigoff = -1; +- switch (info->base.type) ++ ++ switch (rinfo->type) + { + case GI_INFO_TYPE_FUNCTION: + sigoff = G_STRUCT_OFFSET (FunctionBlob, signature); +@@ -657,23 +611,32 @@ signature_offset (GICallableInfo *info) + break; + } + if (sigoff >= 0) +- return *(guint32 *)&info->base.typelib->data[info->base.offset + sigoff]; ++ return *(guint32 *)&rinfo->typelib->data[rinfo->offset + sigoff]; + return 0; + } + + GITypeInfo * + g_type_info_new (GIBaseInfo *container, +- GTypelib *typelib, +- guint32 offset) ++ GTypelib *typelib, ++ guint32 offset) + { + SimpleTypeBlob *type = (SimpleTypeBlob *)&typelib->data[offset]; +- GITypeInfo *type_info; + +- type_info = (GITypeInfo *) g_info_new (GI_INFO_TYPE_TYPE, container, typelib, +- (type->flags.reserved == 0 && type->flags.reserved2 == 0) ? offset : type->offset); +- type_info->is_embedded = FALSE; ++ return (GITypeInfo *) g_info_new (GI_INFO_TYPE_TYPE, container, typelib, ++ (type->flags.reserved == 0 && type->flags.reserved2 == 0) ? offset : type->offset); ++} + +- return type_info; ++static void ++g_type_info_init (GIBaseInfo *info, ++ GIBaseInfo *container, ++ GTypelib *typelib, ++ guint32 offset) ++{ ++ GIRealInfo *rinfo = (GIRealInfo*)container; ++ SimpleTypeBlob *type = (SimpleTypeBlob *)&typelib->data[offset]; ++ ++ g_info_init ((GIRealInfo*)info, GI_INFO_TYPE_TYPE, rinfo->repository, container, typelib, ++ (type->flags.reserved == 0 && type->flags.reserved2 == 0) ? offset : type->offset); + } + + /** +@@ -689,12 +652,36 @@ g_type_info_new (GIBaseInfo *container, + GITypeInfo * + g_callable_info_get_return_type (GICallableInfo *info) + { +- GIBaseInfo *base = (GIBaseInfo *)info; ++ GIRealInfo *rinfo = (GIRealInfo *)info; + guint32 offset; + + offset = signature_offset (info); + +- return g_type_info_new (base, base->typelib, offset); ++ return g_type_info_new ((GIBaseInfo*)info, rinfo->typelib, offset); ++} ++ ++ ++/** ++ * g_callable_info_load_return_type: ++ * @info: a #GICallableInfo ++ * @type: (out caller-allocates): Initialized with return type of @info ++ * ++ * Get information about a return value of callable; this ++ * function is a variant of g_callable_info_get_return_type() designed for stack ++ * allocation. ++ * ++ * The initialized @type must not be referenced after @info is deallocated. ++ */ ++void ++g_callable_info_load_return_type (GICallableInfo *info, ++ GITypeInfo *type) ++{ ++ GIRealInfo *rinfo = (GIRealInfo *)info; ++ guint32 offset; ++ ++ offset = signature_offset (info); ++ ++ g_type_info_init (type, (GIBaseInfo*)info, rinfo->typelib, offset); + } + + /** +@@ -708,8 +695,8 @@ g_callable_info_get_return_type (GICallableInfo *info) + gboolean + g_callable_info_may_return_null (GICallableInfo *info) + { +- GIBaseInfo *base = (GIBaseInfo *)info; +- SignatureBlob *blob = (SignatureBlob *)&base->typelib->data[signature_offset (info)]; ++ GIRealInfo *rinfo = (GIRealInfo *)info; ++ SignatureBlob *blob = (SignatureBlob *)&rinfo->typelib->data[signature_offset (info)]; + + return blob->may_return_null; + } +@@ -726,8 +713,8 @@ g_callable_info_may_return_null (GICallableInfo *info) + GITransfer + g_callable_info_get_caller_owns (GICallableInfo *info) + { +- GIBaseInfo *base = (GIBaseInfo *)info; +- SignatureBlob *blob = (SignatureBlob *)&base->typelib->data[signature_offset (info)]; ++ GIRealInfo *rinfo = (GIRealInfo*) info; ++ SignatureBlob *blob = (SignatureBlob *)&rinfo->typelib->data[signature_offset (info)]; + + if (blob->caller_owns_return_value) + return GI_TRANSFER_EVERYTHING; +@@ -748,12 +735,12 @@ g_callable_info_get_caller_owns (GICallableInfo *info) + gint + g_callable_info_get_n_args (GICallableInfo *info) + { +- GIBaseInfo *base = (GIBaseInfo *)info; ++ GIRealInfo *rinfo = (GIRealInfo *)info; + gint offset; + SignatureBlob *blob; + + offset = signature_offset (info); +- blob = (SignatureBlob *)&base->typelib->data[offset]; ++ blob = (SignatureBlob *)&rinfo->typelib->data[offset]; + + return blob->n_arguments; + } +@@ -769,24 +756,51 @@ g_callable_info_get_n_args (GICallableInfo *info) + */ + GIArgInfo * + g_callable_info_get_arg (GICallableInfo *info, +- gint n) ++ gint n) ++{ ++ GIRealInfo *rinfo = (GIRealInfo *)info; ++ Header *header = (Header *)rinfo->typelib->data; ++ gint offset; ++ ++ offset = signature_offset (info); ++ ++ return (GIArgInfo *) g_info_new (GI_INFO_TYPE_ARG, (GIBaseInfo*)info, rinfo->typelib, ++ offset + header->signature_blob_size + n * header->arg_blob_size); ++} ++ ++/** ++ * g_callable_info_load_arg: ++ * @info: a #GICallableInfo ++ * @n: the argument index to fetch ++ * @arg: (out caller-allocates): Initialize with argument number @n ++ * ++ * Get information about a particular argument of this callable; this ++ * function is a variant of g_callable_info_get_arg() designed for stack ++ * allocation. ++ * ++ * The initialized @arg must not be referenced after @info is deallocated. ++ */ ++void ++g_callable_info_load_arg (GICallableInfo *info, ++ gint n, ++ GIArgInfo *arg) + { +- GIBaseInfo *base = (GIBaseInfo *)info; +- Header *header = (Header *)base->typelib->data; ++ GIRealInfo *rinfo = (GIRealInfo *)info; ++ Header *header = (Header *)rinfo->typelib->data; + gint offset; + + offset = signature_offset (info); + +- return (GIArgInfo *) g_info_new (GI_INFO_TYPE_ARG, base, base->typelib, +- offset + header->signature_blob_size + n * header->arg_blob_size); ++ g_info_init ((GIRealInfo*)arg, GI_INFO_TYPE_ARG, rinfo->repository, (GIBaseInfo*)info, rinfo->typelib, ++ offset + header->signature_blob_size + n * header->arg_blob_size); + } + + /* GIArgInfo function */ + GIDirection + g_arg_info_get_direction (GIArgInfo *info) + { +- GIBaseInfo *base = (GIBaseInfo *)info; +- ArgBlob *blob = (ArgBlob *)&base->typelib->data[base->offset]; ++ GIRealInfo *rinfo = (GIRealInfo *)info; ++ ArgBlob *blob = (ArgBlob *)&rinfo->typelib->data[rinfo->offset]; + + if (blob->in && blob->out) + return GI_DIRECTION_INOUT; +@@ -799,8 +813,8 @@ g_arg_info_get_direction (GIArgInfo *info) + gboolean + g_arg_info_is_return_value (GIArgInfo *info) + { +- GIBaseInfo *base = (GIBaseInfo *)info; +- ArgBlob *blob = (ArgBlob *)&base->typelib->data[base->offset]; ++ GIRealInfo *rinfo = (GIRealInfo *)info; ++ ArgBlob *blob = (ArgBlob *)&rinfo->typelib->data[rinfo->offset]; + + return blob->return_value; + } +@@ -808,8 +822,8 @@ g_arg_info_is_return_value (GIArgInfo *info) + gboolean + g_arg_info_is_dipper (GIArgInfo *info) + { +- GIBaseInfo *base = (GIBaseInfo *)info; +- ArgBlob *blob = (ArgBlob *)&base->typelib->data[base->offset]; ++ GIRealInfo *rinfo = (GIRealInfo *)info; ++ ArgBlob *blob = (ArgBlob *)&rinfo->typelib->data[rinfo->offset]; + + return blob->dipper; + } +@@ -817,8 +831,8 @@ g_arg_info_is_dipper (GIArgInfo *info) + gboolean + g_arg_info_is_optional (GIArgInfo *info) + { +- GIBaseInfo *base = (GIBaseInfo *)info; +- ArgBlob *blob = (ArgBlob *)&base->typelib->data[base->offset]; ++ GIRealInfo *rinfo = (GIRealInfo *)info; ++ ArgBlob *blob = (ArgBlob *)&rinfo->typelib->data[rinfo->offset]; + + return blob->optional; + } +@@ -826,8 +840,8 @@ g_arg_info_is_optional (GIArgInfo *info) + gboolean + g_arg_info_may_be_null (GIArgInfo *info) + { +- GIBaseInfo *base = (GIBaseInfo *)info; +- ArgBlob *blob = (ArgBlob *)&base->typelib->data[base->offset]; ++ GIRealInfo *rinfo = (GIRealInfo *)info; ++ ArgBlob *blob = (ArgBlob *)&rinfo->typelib->data[rinfo->offset]; + + return blob->allow_none; + } +@@ -835,8 +849,8 @@ g_arg_info_may_be_null (GIArgInfo *info) + GITransfer + g_arg_info_get_ownership_transfer (GIArgInfo *info) + { +- GIBaseInfo *base = (GIBaseInfo *)info; +- ArgBlob *blob = (ArgBlob *)&base->typelib->data[base->offset]; ++ GIRealInfo *rinfo = (GIRealInfo *)info; ++ ArgBlob *blob = (ArgBlob *)&rinfo->typelib->data[rinfo->offset]; + + if (blob->transfer_ownership) + return GI_TRANSFER_EVERYTHING; +@@ -849,8 +863,8 @@ g_arg_info_get_ownership_transfer (GIArgInfo *info) + GIScopeType + g_arg_info_get_scope (GIArgInfo *info) + { +- GIBaseInfo *base = (GIBaseInfo *)info; +- ArgBlob *blob = (ArgBlob *)&base->typelib->data[base->offset]; ++ GIRealInfo *rinfo = (GIRealInfo *)info; ++ ArgBlob *blob = (ArgBlob *)&rinfo->typelib->data[rinfo->offset]; + + return blob->scope; + } +@@ -858,8 +872,8 @@ g_arg_info_get_scope (GIArgInfo *info) + gint + g_arg_info_get_closure (GIArgInfo *info) + { +- GIBaseInfo *base = (GIBaseInfo *)info; +- ArgBlob *blob = (ArgBlob *)&base->typelib->data[base->offset]; ++ GIRealInfo *rinfo = (GIRealInfo *)info; ++ ArgBlob *blob = (ArgBlob *)&rinfo->typelib->data[rinfo->offset]; + + return blob->closure; + } +@@ -867,32 +881,57 @@ g_arg_info_get_closure (GIArgInfo *info) + gint + g_arg_info_get_destroy (GIArgInfo *info) + { +- GIBaseInfo *base = (GIBaseInfo *)info; +- ArgBlob *blob = (ArgBlob *)&base->typelib->data[base->offset]; ++ GIRealInfo *rinfo = (GIRealInfo *)info; ++ ArgBlob *blob = (ArgBlob *)&rinfo->typelib->data[rinfo->offset]; + + return blob->destroy; + } + ++/** ++ * g_arg_info_get_type: ++ * @info: A #GIArgInfo ++ * ++ * Returns: (transfer full): Information about the type of argument @info ++ */ + GITypeInfo * + g_arg_info_get_type (GIArgInfo *info) + { +- GIBaseInfo *base = (GIBaseInfo *)info; ++ GIRealInfo *rinfo = (GIRealInfo *)info; + +- return g_type_info_new (base, base->typelib, base->offset + G_STRUCT_OFFSET (ArgBlob, arg_type)); ++ return g_type_info_new ((GIBaseInfo*)info, rinfo->typelib, rinfo->offset + G_STRUCT_OFFSET (ArgBlob, arg_type)); ++} ++ ++/** ++ * g_arg_info_load_type: ++ * @info: A #GIArgInfo ++ * @type: (out caller-allocates): Initialized with information about type of @info ++ * ++ * Get information about a the type of given argument @info; this ++ * function is a variant of g_arg_info_get_type() designed for stack ++ * allocation. ++ * ++ * The initialized @type must not be referenced after @info is deallocated. ++ */ ++void ++g_arg_info_load_type (GIArgInfo *info, ++ GITypeInfo *type) ++{ ++ GIRealInfo *rinfo = (GIRealInfo*) info; ++ g_type_info_init (type, (GIBaseInfo*)info, rinfo->typelib, rinfo->offset + G_STRUCT_OFFSET (ArgBlob, arg_type)); + } + + /* GITypeInfo functions */ + gboolean + g_type_info_is_pointer (GITypeInfo *info) + { +- GIBaseInfo *base = (GIBaseInfo *)info; +- SimpleTypeBlob *type = (SimpleTypeBlob *)&base->typelib->data[base->offset]; ++ GIRealInfo *rinfo = (GIRealInfo *)info; ++ SimpleTypeBlob *type = (SimpleTypeBlob *)&rinfo->typelib->data[rinfo->offset]; + + if (type->flags.reserved == 0 && type->flags.reserved2 == 0) + return type->flags.pointer; + else + { +- InterfaceTypeBlob *iface = (InterfaceTypeBlob *)&base->typelib->data[base->offset]; ++ InterfaceTypeBlob *iface = (InterfaceTypeBlob *)&rinfo->typelib->data[rinfo->offset]; + + return iface->pointer; + } +@@ -901,16 +940,16 @@ g_type_info_is_pointer (GITypeInfo *info) + GITypeTag + g_type_info_get_tag (GITypeInfo *info) + { +- GIBaseInfo *base = (GIBaseInfo *)info; +- SimpleTypeBlob *type = (SimpleTypeBlob *)&base->typelib->data[base->offset]; ++ GIRealInfo *rinfo = (GIRealInfo *)info; ++ SimpleTypeBlob *type = (SimpleTypeBlob *)&rinfo->typelib->data[rinfo->offset]; + +- if (info->is_embedded) ++ if (rinfo->type_is_embedded) + return GI_TYPE_TAG_INTERFACE; + else if (type->flags.reserved == 0 && type->flags.reserved2 == 0) + return type->flags.tag; + else + { +- InterfaceTypeBlob *iface = (InterfaceTypeBlob *)&base->typelib->data[base->offset]; ++ InterfaceTypeBlob *iface = (InterfaceTypeBlob *)&rinfo->typelib->data[rinfo->offset]; + + return iface->tag; + } +@@ -918,49 +957,58 @@ g_type_info_get_tag (GITypeInfo *info) + + GITypeInfo * + g_type_info_get_param_type (GITypeInfo *info, +- gint n) ++ gint n) + { +- GIBaseInfo *base = (GIBaseInfo *)info; +- SimpleTypeBlob *type = (SimpleTypeBlob *)&base->typelib->data[base->offset]; ++ GIRealInfo *rinfo = (GIRealInfo *)info; ++ SimpleTypeBlob *type = (SimpleTypeBlob *)&rinfo->typelib->data[rinfo->offset]; + + if (!(type->flags.reserved == 0 && type->flags.reserved2 == 0)) + { +- ParamTypeBlob *param = (ParamTypeBlob *)&base->typelib->data[base->offset]; ++ ParamTypeBlob *param = (ParamTypeBlob *)&rinfo->typelib->data[rinfo->offset]; + + switch (param->tag) +- { +- case GI_TYPE_TAG_ARRAY: +- case GI_TYPE_TAG_GLIST: +- case GI_TYPE_TAG_GSLIST: +- case GI_TYPE_TAG_GHASH: +- return g_type_info_new (base, base->typelib, +- base->offset + sizeof (ParamTypeBlob) +- + sizeof (SimpleTypeBlob) * n); +- break; +- +- default: ; +- } ++ { ++ case GI_TYPE_TAG_ARRAY: ++ case GI_TYPE_TAG_GLIST: ++ case GI_TYPE_TAG_GSLIST: ++ case GI_TYPE_TAG_GHASH: ++ return g_type_info_new ((GIBaseInfo*)info, rinfo->typelib, ++ rinfo->offset + sizeof (ParamTypeBlob) ++ + sizeof (SimpleTypeBlob) * n); ++ break; ++ default: ++ break; ++ } + } +- ++ + return NULL; + } + ++/** ++ * g_type_info_get_interface: ++ * @info: A #GITypeInfo ++ * ++ * For types which have #GI_TYPE_TAG_INTERFACE such as GObjects and boxed values, ++ * this function returns full information about the referenced type. You can then ++ * inspect the type of the returned #GIBaseInfo to further query whether it is ++ * a concrete GObject, a GInterface, a structure, etc. using g_base_info_get_type(). ++ */ + GIBaseInfo * + g_type_info_get_interface (GITypeInfo *info) + { +- GIBaseInfo *base = (GIBaseInfo *)info; +- SimpleTypeBlob *type = (SimpleTypeBlob *)&base->typelib->data[base->offset]; ++ GIRealInfo *rinfo = (GIRealInfo *)info; ++ SimpleTypeBlob *type = (SimpleTypeBlob *)&rinfo->typelib->data[rinfo->offset]; + +- if (info->is_embedded) +- return (GIBaseInfo *) g_info_new (type->offset, base, base->typelib, +- base->offset); ++ if (rinfo->type_is_embedded) ++ return (GIBaseInfo *) g_info_new (type->offset, (GIBaseInfo*)info, rinfo->typelib, ++ rinfo->offset); + + if (!(type->flags.reserved == 0 && type->flags.reserved2 == 0)) + { +- InterfaceTypeBlob *blob = (InterfaceTypeBlob *)&base->typelib->data[base->offset]; ++ InterfaceTypeBlob *blob = (InterfaceTypeBlob *)&rinfo->typelib->data[rinfo->offset]; + + if (blob->tag == GI_TYPE_TAG_INTERFACE) +- return g_info_from_entry (base->repository, base->typelib, blob->interface); ++ return g_info_from_entry (rinfo->repository, rinfo->typelib, blob->interface); + } + + return NULL; +@@ -969,12 +1017,12 @@ g_type_info_get_interface (GITypeInfo *info) + gint + g_type_info_get_array_length (GITypeInfo *info) + { +- GIBaseInfo *base = (GIBaseInfo *)info; +- SimpleTypeBlob *type = (SimpleTypeBlob *)&base->typelib->data[base->offset]; ++ GIRealInfo *rinfo = (GIRealInfo *)info; ++ SimpleTypeBlob *type = (SimpleTypeBlob *)&rinfo->typelib->data[rinfo->offset]; + + if (!(type->flags.reserved == 0 && type->flags.reserved2 == 0)) + { +- ArrayTypeBlob *blob = (ArrayTypeBlob *)&base->typelib->data[base->offset]; ++ ArrayTypeBlob *blob = (ArrayTypeBlob *)&rinfo->typelib->data[rinfo->offset]; + + if (blob->tag == GI_TYPE_TAG_ARRAY) + { +@@ -989,12 +1037,12 @@ g_type_info_get_array_length (GITypeInfo *info) + gint + g_type_info_get_array_fixed_size (GITypeInfo *info) + { +- GIBaseInfo *base = (GIBaseInfo *)info; +- SimpleTypeBlob *type = (SimpleTypeBlob *)&base->typelib->data[base->offset]; ++ GIRealInfo *rinfo = (GIRealInfo *)info; ++ SimpleTypeBlob *type = (SimpleTypeBlob *)&rinfo->typelib->data[rinfo->offset]; + + if (!(type->flags.reserved == 0 && type->flags.reserved2 == 0)) + { +- ArrayTypeBlob *blob = (ArrayTypeBlob *)&base->typelib->data[base->offset]; ++ ArrayTypeBlob *blob = (ArrayTypeBlob *)&rinfo->typelib->data[rinfo->offset]; + + if (blob->tag == GI_TYPE_TAG_ARRAY) + { +@@ -1009,12 +1057,12 @@ g_type_info_get_array_fixed_size (GITypeInfo *info) + gboolean + g_type_info_is_zero_terminated (GITypeInfo *info) + { +- GIBaseInfo *base = (GIBaseInfo *)info; +- SimpleTypeBlob *type = (SimpleTypeBlob *)&base->typelib->data[base->offset]; ++ GIRealInfo *rinfo = (GIRealInfo *)info; ++ SimpleTypeBlob *type = (SimpleTypeBlob *)&rinfo->typelib->data[rinfo->offset]; + + if (!(type->flags.reserved == 0 && type->flags.reserved2 == 0)) + { +- ArrayTypeBlob *blob = (ArrayTypeBlob *)&base->typelib->data[base->offset]; ++ ArrayTypeBlob *blob = (ArrayTypeBlob *)&rinfo->typelib->data[rinfo->offset]; + + if (blob->tag == GI_TYPE_TAG_ARRAY) + return blob->zero_terminated; +@@ -1026,12 +1074,12 @@ g_type_info_is_zero_terminated (GITypeInfo *info) + gint + g_type_info_get_n_error_domains (GITypeInfo *info) + { +- GIBaseInfo *base = (GIBaseInfo *)info; +- SimpleTypeBlob *type = (SimpleTypeBlob *)&base->typelib->data[base->offset]; ++ GIRealInfo *rinfo = (GIRealInfo *)info; ++ SimpleTypeBlob *type = (SimpleTypeBlob *)&rinfo->typelib->data[rinfo->offset]; + + if (!(type->flags.reserved == 0 && type->flags.reserved2 == 0)) + { +- ErrorTypeBlob *blob = (ErrorTypeBlob *)&base->typelib->data[base->offset]; ++ ErrorTypeBlob *blob = (ErrorTypeBlob *)&rinfo->typelib->data[rinfo->offset]; + + if (blob->tag == GI_TYPE_TAG_ERROR) + return blob->n_domains; +@@ -1042,19 +1090,19 @@ g_type_info_get_n_error_domains (GITypeInfo *info) + + GIErrorDomainInfo * + g_type_info_get_error_domain (GITypeInfo *info, +- gint n) ++ gint n) + { +- GIBaseInfo *base = (GIBaseInfo *)info; +- SimpleTypeBlob *type = (SimpleTypeBlob *)&base->typelib->data[base->offset]; ++ GIRealInfo *rinfo = (GIRealInfo *)info; ++ SimpleTypeBlob *type = (SimpleTypeBlob *)&rinfo->typelib->data[rinfo->offset]; + + if (!(type->flags.reserved == 0 && type->flags.reserved2 == 0)) + { +- ErrorTypeBlob *blob = (ErrorTypeBlob *)&base->typelib->data[base->offset]; ++ ErrorTypeBlob *blob = (ErrorTypeBlob *)&rinfo->typelib->data[rinfo->offset]; + + if (blob->tag == GI_TYPE_TAG_ERROR) +- return (GIErrorDomainInfo *) g_info_from_entry (base->repository, +- base->typelib, +- blob->domains[n]); ++ return (GIErrorDomainInfo *) g_info_from_entry (rinfo->repository, ++ rinfo->typelib, ++ blob->domains[n]); + } + + return NULL; +@@ -1065,20 +1113,20 @@ g_type_info_get_error_domain (GITypeInfo *info, + const gchar * + g_error_domain_info_get_quark (GIErrorDomainInfo *info) + { +- GIBaseInfo *base = (GIBaseInfo *)info; +- ErrorDomainBlob *blob = (ErrorDomainBlob *)&base->typelib->data[base->offset]; ++ GIRealInfo *rinfo = (GIRealInfo *)info; ++ ErrorDomainBlob *blob = (ErrorDomainBlob *)&rinfo->typelib->data[rinfo->offset]; + +- return g_typelib_get_string (base->typelib, blob->get_quark); ++ return g_typelib_get_string (rinfo->typelib, blob->get_quark); + } + + GIInterfaceInfo * + g_error_domain_info_get_codes (GIErrorDomainInfo *info) + { +- GIBaseInfo *base = (GIBaseInfo *)info; +- ErrorDomainBlob *blob = (ErrorDomainBlob *)&base->typelib->data[base->offset]; ++ GIRealInfo *rinfo = (GIRealInfo *)info; ++ ErrorDomainBlob *blob = (ErrorDomainBlob *)&rinfo->typelib->data[rinfo->offset]; + +- return (GIInterfaceInfo *) g_info_from_entry (base->repository, +- base->typelib, blob->error_codes); ++ return (GIInterfaceInfo *) g_info_from_entry (rinfo->repository, ++ rinfo->typelib, blob->error_codes); + } + + +@@ -1086,8 +1134,8 @@ g_error_domain_info_get_codes (GIErrorDomainInfo *info) + glong + g_value_info_get_value (GIValueInfo *info) + { +- GIBaseInfo *base = (GIBaseInfo *)info; +- ValueBlob *blob = (ValueBlob *)&base->typelib->data[base->offset]; ++ GIRealInfo *rinfo = (GIRealInfo *)info; ++ ValueBlob *blob = (ValueBlob *)&rinfo->typelib->data[rinfo->offset]; + + return (glong)blob->value; + } +@@ -1098,8 +1146,8 @@ g_field_info_get_flags (GIFieldInfo *info) + { + GIFieldInfoFlags flags; + +- GIBaseInfo *base = (GIBaseInfo *)info; +- FieldBlob *blob = (FieldBlob *)&base->typelib->data[base->offset]; ++ GIRealInfo *rinfo = (GIRealInfo *)info; ++ FieldBlob *blob = (FieldBlob *)&rinfo->typelib->data[rinfo->offset]; + + flags = 0; + +@@ -1115,8 +1163,8 @@ g_field_info_get_flags (GIFieldInfo *info) + gint + g_field_info_get_size (GIFieldInfo *info) + { +- GIBaseInfo *base = (GIBaseInfo *)info; +- FieldBlob *blob = (FieldBlob *)&base->typelib->data[base->offset]; ++ GIRealInfo *rinfo = (GIRealInfo *)info; ++ FieldBlob *blob = (FieldBlob *)&rinfo->typelib->data[rinfo->offset]; + + return blob->bits; + } +@@ -1124,8 +1172,8 @@ g_field_info_get_size (GIFieldInfo *info) + gint + g_field_info_get_offset (GIFieldInfo *info) + { +- GIBaseInfo *base = (GIBaseInfo *)info; +- FieldBlob *blob = (FieldBlob *)&base->typelib->data[base->offset]; ++ GIRealInfo *rinfo = (GIRealInfo *)info; ++ FieldBlob *blob = (FieldBlob *)&rinfo->typelib->data[rinfo->offset]; + + return blob->struct_offset; + } +@@ -1133,33 +1181,33 @@ g_field_info_get_offset (GIFieldInfo *info) + GITypeInfo * + g_field_info_get_type (GIFieldInfo *info) + { +- GIBaseInfo *base = (GIBaseInfo *)info; +- Header *header = (Header *)base->typelib->data; +- FieldBlob *blob = (FieldBlob *)&base->typelib->data[base->offset]; +- GITypeInfo *type_info; ++ GIRealInfo *rinfo = (GIRealInfo *)info; ++ Header *header = (Header *)rinfo->typelib->data; ++ FieldBlob *blob = (FieldBlob *)&rinfo->typelib->data[rinfo->offset]; ++ GIRealInfo *type_info; + + if (blob->has_embedded_type) + { +- type_info = (GITypeInfo *) g_info_new (GI_INFO_TYPE_TYPE, +- (GIBaseInfo*)info, base->typelib, +- base->offset + header->field_blob_size); +- type_info->is_embedded = TRUE; ++ type_info = (GIRealInfo *) g_info_new (GI_INFO_TYPE_TYPE, ++ (GIBaseInfo*)info, rinfo->typelib, ++ rinfo->offset + header->field_blob_size); ++ type_info->type_is_embedded = TRUE; + } + else +- return g_type_info_new (base, base->typelib, base->offset + G_STRUCT_OFFSET (FieldBlob, type)); ++ return g_type_info_new ((GIBaseInfo*)info, rinfo->typelib, rinfo->offset + G_STRUCT_OFFSET (FieldBlob, type)); + +- return type_info; ++ return (GIBaseInfo*)type_info; + } + + /* GIRegisteredTypeInfo functions */ + const gchar * + g_registered_type_info_get_type_name (GIRegisteredTypeInfo *info) + { +- GIBaseInfo *base = (GIBaseInfo *)info; +- RegisteredTypeBlob *blob = (RegisteredTypeBlob *)&base->typelib->data[base->offset]; ++ GIRealInfo *rinfo = (GIRealInfo *)info; ++ RegisteredTypeBlob *blob = (RegisteredTypeBlob *)&rinfo->typelib->data[rinfo->offset]; + + if (blob->gtype_name) +- return g_typelib_get_string (base->typelib, blob->gtype_name); ++ return g_typelib_get_string (rinfo->typelib, blob->gtype_name); + + return NULL; + } +@@ -1167,11 +1215,11 @@ g_registered_type_info_get_type_name (GIRegisteredTypeInfo *info) + const gchar * + g_registered_type_info_get_type_init (GIRegisteredTypeInfo *info) + { +- GIBaseInfo *base = (GIBaseInfo *)info; +- RegisteredTypeBlob *blob = (RegisteredTypeBlob *)&base->typelib->data[base->offset]; ++ GIRealInfo *rinfo = (GIRealInfo *)info; ++ RegisteredTypeBlob *blob = (RegisteredTypeBlob *)&rinfo->typelib->data[rinfo->offset]; + + if (blob->gtype_init) +- return g_typelib_get_string (base->typelib, blob->gtype_init); ++ return g_typelib_get_string (rinfo->typelib, blob->gtype_init); + + return NULL; + } +@@ -1181,6 +1229,7 @@ g_registered_type_info_get_g_type (GIRegisteredTypeInfo *info) + { + const char *type_init; + GType (* get_type_func) (void); ++ GIRealInfo *rinfo = (GIRealInfo*)info; + + type_init = g_registered_type_info_get_type_init (info); + +@@ -1190,7 +1239,7 @@ g_registered_type_info_get_g_type (GIRegisteredTypeInfo *info) + return G_TYPE_OBJECT; + + get_type_func = NULL; +- if (!g_typelib_symbol (((GIBaseInfo*)info)->typelib, ++ if (!g_typelib_symbol (rinfo->typelib, + type_init, + (void**) &get_type_func)) + return G_TYPE_NONE; +@@ -1202,8 +1251,8 @@ g_registered_type_info_get_g_type (GIRegisteredTypeInfo *info) + gint + g_struct_info_get_n_fields (GIStructInfo *info) + { +- GIBaseInfo *base = (GIBaseInfo *)info; +- StructBlob *blob = (StructBlob *)&base->typelib->data[base->offset]; ++ GIRealInfo *rinfo = (GIRealInfo *)info; ++ StructBlob *blob = (StructBlob *)&rinfo->typelib->data[rinfo->offset]; + + return blob->n_fields; + } +@@ -1212,15 +1261,15 @@ static gint32 + g_struct_get_field_offset (GIStructInfo *info, + gint n) + { +- GIBaseInfo *base = (GIBaseInfo *)info; +- Header *header = (Header *)base->typelib->data; +- guint32 offset = base->offset + header->struct_blob_size; ++ GIRealInfo *rinfo = (GIRealInfo *)info; ++ Header *header = (Header *)rinfo->typelib->data; ++ guint32 offset = rinfo->offset + header->struct_blob_size; + gint i; + FieldBlob *field_blob; + + for (i = 0; i < n; i++) + { +- field_blob = (FieldBlob *)&base->typelib->data[offset]; ++ field_blob = (FieldBlob *)&rinfo->typelib->data[offset]; + offset += header->field_blob_size; + if (field_blob->has_embedded_type) + offset += header->callback_blob_size; +@@ -1231,19 +1280,19 @@ g_struct_get_field_offset (GIStructInfo *info, + + GIFieldInfo * + g_struct_info_get_field (GIStructInfo *info, +- gint n) ++ gint n) + { +- GIBaseInfo *base = (GIBaseInfo *)info; ++ GIRealInfo *rinfo = (GIRealInfo *)info; + +- return (GIFieldInfo *) g_info_new (GI_INFO_TYPE_FIELD, base, base->typelib, +- g_struct_get_field_offset (info, n)); ++ return (GIFieldInfo *) g_info_new (GI_INFO_TYPE_FIELD, (GIBaseInfo*)info, rinfo->typelib, ++ g_struct_get_field_offset (info, n)); + } + + gint + g_struct_info_get_n_methods (GIStructInfo *info) + { +- GIBaseInfo *base = (GIBaseInfo *)info; +- StructBlob *blob = (StructBlob *)&base->typelib->data[base->offset]; ++ GIRealInfo *rinfo = (GIRealInfo *)info; ++ StructBlob *blob = (StructBlob *)&rinfo->typelib->data[rinfo->offset]; + + return blob->n_methods; + } +@@ -1252,35 +1301,35 @@ GIFunctionInfo * + g_struct_info_get_method (GIStructInfo *info, + gint n) + { +- GIBaseInfo *base = (GIBaseInfo *)info; +- StructBlob *blob = (StructBlob *)&base->typelib->data[base->offset]; +- Header *header = (Header *)base->typelib->data; ++ GIRealInfo *rinfo = (GIRealInfo *)info; ++ StructBlob *blob = (StructBlob *)&rinfo->typelib->data[rinfo->offset]; ++ Header *header = (Header *)rinfo->typelib->data; + gint offset; + +- offset = g_struct_get_field_offset (info, blob->n_fields) +- + n * header->function_blob_size; +- return (GIFunctionInfo *) g_info_new (GI_INFO_TYPE_FUNCTION, base, +- base->typelib, offset); ++ offset = g_struct_get_field_offset (info, blob->n_fields) + n * header->function_blob_size; ++ return (GIFunctionInfo *) g_info_new (GI_INFO_TYPE_FUNCTION, (GIBaseInfo*)info, ++ rinfo->typelib, offset); + } + + static GIFunctionInfo * + find_method (GIBaseInfo *base, +- guint32 offset, +- gint n_methods, +- const gchar *name) ++ guint32 offset, ++ gint n_methods, ++ const gchar *name) + { + /* FIXME hash */ +- Header *header = (Header *)base->typelib->data; ++ GIRealInfo *rinfo = (GIRealInfo*)base; ++ Header *header = (Header *)rinfo->typelib->data; + gint i; + + for (i = 0; i < n_methods; i++) + { +- FunctionBlob *fblob = (FunctionBlob *)&base->typelib->data[offset]; +- const gchar *fname = (const gchar *)&base->typelib->data[fblob->name]; ++ FunctionBlob *fblob = (FunctionBlob *)&rinfo->typelib->data[offset]; ++ const gchar *fname = (const gchar *)&rinfo->typelib->data[fblob->name]; + + if (strcmp (name, fname) == 0) +- return (GIFunctionInfo *) g_info_new (GI_INFO_TYPE_FUNCTION, base, +- base->typelib, offset); ++ return (GIFunctionInfo *) g_info_new (GI_INFO_TYPE_FUNCTION, base, ++ rinfo->typelib, offset); + + offset += header->function_blob_size; + } +@@ -1293,21 +1342,21 @@ g_struct_info_find_method (GIStructInfo *info, + const gchar *name) + { + gint offset; +- GIBaseInfo *base = (GIBaseInfo *)info; +- Header *header = (Header *)base->typelib->data; +- StructBlob *blob = (StructBlob *)&base->typelib->data[base->offset]; ++ GIRealInfo *rinfo = (GIRealInfo *)info; ++ Header *header = (Header *)rinfo->typelib->data; ++ StructBlob *blob = (StructBlob *)&rinfo->typelib->data[rinfo->offset]; + +- offset = base->offset + header->struct_blob_size ++ offset = rinfo->offset + header->struct_blob_size + + blob->n_fields * header->field_blob_size; + +- return find_method (base, offset, blob->n_methods, name); ++ return find_method ((GIBaseInfo*)info, offset, blob->n_methods, name); + } + + gsize + g_struct_info_get_size (GIStructInfo *info) + { +- GIBaseInfo *base = (GIBaseInfo *)info; +- StructBlob *blob = (StructBlob *)&base->typelib->data[base->offset]; ++ GIRealInfo *rinfo = (GIRealInfo *)info; ++ StructBlob *blob = (StructBlob *)&rinfo->typelib->data[rinfo->offset]; + + return blob->size; + } +@@ -1315,8 +1364,8 @@ g_struct_info_get_size (GIStructInfo *info) + gsize + g_struct_info_get_alignment (GIStructInfo *info) + { +- GIBaseInfo *base = (GIBaseInfo *)info; +- StructBlob *blob = (StructBlob *)&base->typelib->data[base->offset]; ++ GIRealInfo *rinfo = (GIRealInfo *)info; ++ StructBlob *blob = (StructBlob *)&rinfo->typelib->data[rinfo->offset]; + + return blob->alignment; + } +@@ -1334,8 +1383,8 @@ g_struct_info_get_alignment (GIStructInfo *info) + gboolean + g_struct_info_is_gtype_struct (GIStructInfo *info) + { +- GIBaseInfo *base = (GIBaseInfo *)info; +- StructBlob *blob = (StructBlob *)&base->typelib->data[base->offset]; ++ GIRealInfo *rinfo = (GIRealInfo *)info; ++ StructBlob *blob = (StructBlob *)&rinfo->typelib->data[rinfo->offset]; + + return blob->is_gtype_struct; + } +@@ -1343,8 +1392,8 @@ g_struct_info_is_gtype_struct (GIStructInfo *info) + gint + g_enum_info_get_n_values (GIEnumInfo *info) + { +- GIBaseInfo *base = (GIBaseInfo *)info; +- EnumBlob *blob = (EnumBlob *)&base->typelib->data[base->offset]; ++ GIRealInfo *rinfo = (GIRealInfo *)info; ++ EnumBlob *blob = (EnumBlob *)&rinfo->typelib->data[rinfo->offset]; + + return blob->n_values; + } +@@ -1353,13 +1402,13 @@ GIValueInfo * + g_enum_info_get_value (GIEnumInfo *info, + gint n) + { +- GIBaseInfo *base = (GIBaseInfo *)info; +- Header *header = (Header *)base->typelib->data; ++ GIRealInfo *rinfo = (GIRealInfo *)info; ++ Header *header = (Header *)rinfo->typelib->data; + gint offset; + +- offset = base->offset + header->enum_blob_size ++ offset = rinfo->offset + header->enum_blob_size + + n * header->value_blob_size; +- return (GIValueInfo *) g_info_new (GI_INFO_TYPE_VALUE, base, base->typelib, offset); ++ return (GIValueInfo *) g_info_new (GI_INFO_TYPE_VALUE, (GIBaseInfo*)info, rinfo->typelib, offset); + } + + /** +@@ -1378,8 +1427,8 @@ g_enum_info_get_value (GIEnumInfo *info, + GITypeTag + g_enum_info_get_storage_type (GIEnumInfo *info) + { +- GIBaseInfo *base = (GIBaseInfo *)info; +- EnumBlob *blob = (EnumBlob *)&base->typelib->data[base->offset]; ++ GIRealInfo *rinfo = (GIRealInfo *)info; ++ EnumBlob *blob = (EnumBlob *)&rinfo->typelib->data[rinfo->offset]; + + return blob->storage_type; + } +@@ -1388,12 +1437,12 @@ g_enum_info_get_storage_type (GIEnumInfo *info) + GIObjectInfo * + g_object_info_get_parent (GIObjectInfo *info) + { +- GIBaseInfo *base = (GIBaseInfo *)info; +- ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset]; ++ GIRealInfo *rinfo = (GIRealInfo *)info; ++ ObjectBlob *blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset]; + + if (blob->parent) +- return (GIObjectInfo *) g_info_from_entry (base->repository, +- base->typelib, blob->parent); ++ return (GIObjectInfo *) g_info_from_entry (rinfo->repository, ++ rinfo->typelib, blob->parent); + else + return NULL; + } +@@ -1401,34 +1450,34 @@ g_object_info_get_parent (GIObjectInfo *info) + gboolean + g_object_info_get_abstract (GIObjectInfo *info) + { +- GIBaseInfo *base = (GIBaseInfo *)info; +- ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset]; ++ GIRealInfo *rinfo = (GIRealInfo *)info; ++ ObjectBlob *blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset]; + return blob->abstract != 0; + } + + const gchar * + g_object_info_get_type_name (GIObjectInfo *info) + { +- GIBaseInfo *base = (GIBaseInfo *)info; +- ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset]; ++ GIRealInfo *rinfo = (GIRealInfo *)info; ++ ObjectBlob *blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset]; + +- return g_typelib_get_string (base->typelib, blob->gtype_name); ++ return g_typelib_get_string (rinfo->typelib, blob->gtype_name); + } + + const gchar * + g_object_info_get_type_init (GIObjectInfo *info) + { +- GIBaseInfo *base = (GIBaseInfo *)info; +- ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset]; ++ GIRealInfo *rinfo = (GIRealInfo *)info; ++ ObjectBlob *blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset]; + +- return g_typelib_get_string (base->typelib, blob->gtype_init); ++ return g_typelib_get_string (rinfo->typelib, blob->gtype_init); + } + + gint + g_object_info_get_n_interfaces (GIObjectInfo *info) + { +- GIBaseInfo *base = (GIBaseInfo *)info; +- ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset]; ++ GIRealInfo *rinfo = (GIRealInfo *)info; ++ ObjectBlob *blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset]; + + return blob->n_interfaces; + } +@@ -1437,18 +1486,18 @@ GIInterfaceInfo * + g_object_info_get_interface (GIObjectInfo *info, + gint n) + { +- GIBaseInfo *base = (GIBaseInfo *)info; +- ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset]; ++ GIRealInfo *rinfo = (GIRealInfo *)info; ++ ObjectBlob *blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset]; + +- return (GIInterfaceInfo *) g_info_from_entry (base->repository, +- base->typelib, blob->interfaces[n]); ++ return (GIInterfaceInfo *) g_info_from_entry (rinfo->repository, ++ rinfo->typelib, blob->interfaces[n]); + } + + gint + g_object_info_get_n_fields (GIObjectInfo *info) + { +- GIBaseInfo *base = (GIBaseInfo *)info; +- ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset]; ++ GIRealInfo *rinfo = (GIRealInfo *)info; ++ ObjectBlob *blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset]; + + return blob->n_fields; + } +@@ -1458,22 +1507,22 @@ g_object_info_get_field (GIObjectInfo *info, + gint n) + { + gint offset; +- GIBaseInfo *base = (GIBaseInfo *)info; +- Header *header = (Header *)base->typelib->data; +- ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset]; ++ GIRealInfo *rinfo = (GIRealInfo *)info; ++ Header *header = (Header *)rinfo->typelib->data; ++ ObjectBlob *blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset]; + +- offset = base->offset + header->object_blob_size ++ offset = rinfo->offset + header->object_blob_size + + (blob->n_interfaces + blob->n_interfaces % 2) * 2 + + n * header->field_blob_size; + +- return (GIFieldInfo *) g_info_new (GI_INFO_TYPE_FIELD, base, base->typelib, offset); ++ return (GIFieldInfo *) g_info_new (GI_INFO_TYPE_FIELD, (GIBaseInfo*)info, rinfo->typelib, offset); + } + + gint + g_object_info_get_n_properties (GIObjectInfo *info) + { +- GIBaseInfo *base = (GIBaseInfo *)info; +- ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset]; ++ GIRealInfo *rinfo = (GIRealInfo *)info; ++ ObjectBlob *blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset]; + + return blob->n_properties; + } +@@ -1483,24 +1532,24 @@ g_object_info_get_property (GIObjectInfo *info, + gint n) + { + gint offset; +- GIBaseInfo *base = (GIBaseInfo *)info; +- Header *header = (Header *)base->typelib->data; +- ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset]; ++ GIRealInfo *rinfo = (GIRealInfo *)info; ++ Header *header = (Header *)rinfo->typelib->data; ++ ObjectBlob *blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset]; + +- offset = base->offset + header->object_blob_size ++ offset = rinfo->offset + header->object_blob_size + + (blob->n_interfaces + blob->n_interfaces % 2) * 2 + + blob->n_fields * header->field_blob_size + + n * header->property_blob_size; + +- return (GIPropertyInfo *) g_info_new (GI_INFO_TYPE_PROPERTY, base, +- base->typelib, offset); ++ return (GIPropertyInfo *) g_info_new (GI_INFO_TYPE_PROPERTY, (GIBaseInfo*)info, ++ rinfo->typelib, offset); + } + + gint + g_object_info_get_n_methods (GIObjectInfo *info) + { +- GIBaseInfo *base = (GIBaseInfo *)info; +- ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset]; ++ GIRealInfo *rinfo = (GIRealInfo *)info; ++ ObjectBlob *blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset]; + + return blob->n_methods; + } +@@ -1510,18 +1559,18 @@ g_object_info_get_method (GIObjectInfo *info, + gint n) + { + gint offset; +- GIBaseInfo *base = (GIBaseInfo *)info; +- Header *header = (Header *)base->typelib->data; +- ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset]; ++ GIRealInfo *rinfo = (GIRealInfo *)info; ++ Header *header = (Header *)rinfo->typelib->data; ++ ObjectBlob *blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset]; + +- offset = base->offset + header->object_blob_size ++ offset = rinfo->offset + header->object_blob_size + + (blob->n_interfaces + blob->n_interfaces % 2) * 2 + + blob->n_fields * header->field_blob_size + + blob->n_properties * header->property_blob_size + + n * header->function_blob_size; + +- return (GIFunctionInfo *) g_info_new (GI_INFO_TYPE_FUNCTION, base, +- base->typelib, offset); ++ return (GIFunctionInfo *) g_info_new (GI_INFO_TYPE_FUNCTION, (GIBaseInfo*)info, ++ rinfo->typelib, offset); + } + + GIFunctionInfo * +@@ -1529,23 +1578,23 @@ g_object_info_find_method (GIObjectInfo *info, + const gchar *name) + { + gint offset; +- GIBaseInfo *base = (GIBaseInfo *)info; +- Header *header = (Header *)base->typelib->data; +- ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset]; ++ GIRealInfo *rinfo = (GIRealInfo *)info; ++ Header *header = (Header *)rinfo->typelib->data; ++ ObjectBlob *blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset]; + +- offset = base->offset + header->object_blob_size ++ offset = rinfo->offset + header->object_blob_size + + (blob->n_interfaces + blob->n_interfaces % 2) * 2 + + blob->n_fields * header->field_blob_size + + + blob->n_properties * header->property_blob_size; + +- return find_method (base, offset, blob->n_methods, name); ++ return find_method ((GIBaseInfo*)info, offset, blob->n_methods, name); + } + + gint + g_object_info_get_n_signals (GIObjectInfo *info) + { +- GIBaseInfo *base = (GIBaseInfo *)info; +- ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset]; ++ GIRealInfo *rinfo = (GIRealInfo *)info; ++ ObjectBlob *blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset]; + + return blob->n_signals; + } +@@ -1555,26 +1604,26 @@ g_object_info_get_signal (GIObjectInfo *info, + gint n) + { + gint offset; +- GIBaseInfo *base = (GIBaseInfo *)info; +- Header *header = (Header *)base->typelib->data; +- ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset]; ++ GIRealInfo *rinfo = (GIRealInfo *)info; ++ Header *header = (Header *)rinfo->typelib->data; ++ ObjectBlob *blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset]; + +- offset = base->offset + header->object_blob_size ++ offset = rinfo->offset + header->object_blob_size + + (blob->n_interfaces + blob->n_interfaces % 2) * 2 + + blob->n_fields * header->field_blob_size + + blob->n_properties * header->property_blob_size + + blob->n_methods * header->function_blob_size + + n * header->signal_blob_size; + +- return (GISignalInfo *) g_info_new (GI_INFO_TYPE_SIGNAL, base, +- base->typelib, offset); ++ return (GISignalInfo *) g_info_new (GI_INFO_TYPE_SIGNAL, (GIBaseInfo*)info, ++ rinfo->typelib, offset); + } + + gint + g_object_info_get_n_vfuncs (GIObjectInfo *info) + { +- GIBaseInfo *base = (GIBaseInfo *)info; +- ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset]; ++ GIRealInfo *rinfo = (GIRealInfo *)info; ++ ObjectBlob *blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset]; + + return blob->n_vfuncs; + } +@@ -1584,11 +1633,11 @@ g_object_info_get_vfunc (GIObjectInfo *info, + gint n) + { + gint offset; +- GIBaseInfo *base = (GIBaseInfo *)info; +- Header *header = (Header *)base->typelib->data; +- ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset]; ++ GIRealInfo *rinfo = (GIRealInfo *)info; ++ Header *header = (Header *)rinfo->typelib->data; ++ ObjectBlob *blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset]; + +- offset = base->offset + header->object_blob_size ++ offset = rinfo->offset + header->object_blob_size + + (blob->n_interfaces + blob->n_interfaces % 2) * 2 + + blob->n_fields * header->field_blob_size + + blob->n_properties * header->property_blob_size +@@ -1596,28 +1645,28 @@ g_object_info_get_vfunc (GIObjectInfo *info, + + blob->n_signals * header->signal_blob_size + + n * header->vfunc_blob_size; + +- return (GIVFuncInfo *) g_info_new (GI_INFO_TYPE_VFUNC, base, +- base->typelib, offset); ++ return (GIVFuncInfo *) g_info_new (GI_INFO_TYPE_VFUNC, (GIBaseInfo*)info, ++ rinfo->typelib, offset); + } + + static GIVFuncInfo * +-find_vfunc (GIBaseInfo *base, ++find_vfunc (GIRealInfo *rinfo, + guint32 offset, + gint n_vfuncs, + const gchar *name) + { + /* FIXME hash */ +- Header *header = (Header *)base->typelib->data; ++ Header *header = (Header *)rinfo->typelib->data; + gint i; + + for (i = 0; i < n_vfuncs; i++) + { +- VFuncBlob *fblob = (VFuncBlob *)&base->typelib->data[offset]; +- const gchar *fname = (const gchar *)&base->typelib->data[fblob->name]; ++ VFuncBlob *fblob = (VFuncBlob *)&rinfo->typelib->data[offset]; ++ const gchar *fname = (const gchar *)&rinfo->typelib->data[fblob->name]; + + if (strcmp (name, fname) == 0) +- return (GIVFuncInfo *) g_info_new (GI_INFO_TYPE_VFUNC, base, +- base->typelib, offset); ++ return (GIVFuncInfo *) g_info_new (GI_INFO_TYPE_VFUNC, (GIBaseInfo*) rinfo, ++ rinfo->typelib, offset); + + offset += header->vfunc_blob_size; + } +@@ -1643,25 +1692,25 @@ g_object_info_find_vfunc (GIObjectInfo *info, + const gchar *name) + { + gint offset; +- GIBaseInfo *base = (GIBaseInfo *)info; +- Header *header = (Header *)base->typelib->data; +- ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset]; ++ GIRealInfo *rinfo = (GIRealInfo *)info; ++ Header *header = (Header *)rinfo->typelib->data; ++ ObjectBlob *blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset]; + +- offset = base->offset + header->object_blob_size ++ offset = rinfo->offset + header->object_blob_size + + (blob->n_interfaces + blob->n_interfaces % 2) * 2 + + blob->n_fields * header->field_blob_size + + blob->n_properties * header->property_blob_size + + blob->n_methods * header->function_blob_size + + blob->n_signals * header->signal_blob_size; + +- return find_vfunc (base, offset, blob->n_vfuncs, name); ++ return find_vfunc (rinfo, offset, blob->n_vfuncs, name); + } + + gint + g_object_info_get_n_constants (GIObjectInfo *info) + { +- GIBaseInfo *base = (GIBaseInfo *)info; +- ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset]; ++ GIRealInfo *rinfo = (GIRealInfo *)info; ++ ObjectBlob *blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset]; + + return blob->n_constants; + } +@@ -1671,11 +1720,11 @@ g_object_info_get_constant (GIObjectInfo *info, + gint n) + { + gint offset; +- GIBaseInfo *base = (GIBaseInfo *)info; +- Header *header = (Header *)base->typelib->data; +- ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset]; ++ GIRealInfo *rinfo = (GIRealInfo *)info; ++ Header *header = (Header *)rinfo->typelib->data; ++ ObjectBlob *blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset]; + +- offset = base->offset + header->object_blob_size ++ offset = rinfo->offset + header->object_blob_size + + (blob->n_interfaces + blob->n_interfaces % 2) * 2 + + blob->n_fields * header->field_blob_size + + blob->n_properties * header->property_blob_size +@@ -1684,8 +1733,8 @@ g_object_info_get_constant (GIObjectInfo *info, + + blob->n_vfuncs * header->vfunc_blob_size + + n * header->constant_blob_size; + +- return (GIConstantInfo *) g_info_new (GI_INFO_TYPE_CONSTANT, base, +- base->typelib, offset); ++ return (GIConstantInfo *) g_info_new (GI_INFO_TYPE_CONSTANT, (GIBaseInfo*)info, ++ rinfo->typelib, offset); + } + + /** +@@ -1700,12 +1749,12 @@ g_object_info_get_constant (GIObjectInfo *info, + GIStructInfo * + g_object_info_get_class_struct (GIObjectInfo *info) + { +- GIBaseInfo *base = (GIBaseInfo *)info; +- ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset]; ++ GIRealInfo *rinfo = (GIRealInfo *)info; ++ ObjectBlob *blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset]; + + if (blob->gtype_struct) +- return (GIStructInfo *) g_info_from_entry (base->repository, +- base->typelib, blob->gtype_struct); ++ return (GIStructInfo *) g_info_from_entry (rinfo->repository, ++ rinfo->typelib, blob->gtype_struct); + else + return NULL; + } +@@ -1714,8 +1763,8 @@ g_object_info_get_class_struct (GIObjectInfo *info) + gint + g_interface_info_get_n_prerequisites (GIInterfaceInfo *info) + { +- GIBaseInfo *base = (GIBaseInfo *)info; +- InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset]; ++ GIRealInfo *rinfo = (GIRealInfo *)info; ++ InterfaceBlob *blob = (InterfaceBlob *)&rinfo->typelib->data[rinfo->offset]; + + return blob->n_prerequisites; + } +@@ -1724,19 +1773,19 @@ GIBaseInfo * + g_interface_info_get_prerequisite (GIInterfaceInfo *info, + gint n) + { +- GIBaseInfo *base = (GIBaseInfo *)info; +- InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset]; ++ GIRealInfo *rinfo = (GIRealInfo *)info; ++ InterfaceBlob *blob = (InterfaceBlob *)&rinfo->typelib->data[rinfo->offset]; + +- return g_info_from_entry (base->repository, +- base->typelib, blob->prerequisites[n]); ++ return g_info_from_entry (rinfo->repository, ++ rinfo->typelib, blob->prerequisites[n]); + } + + + gint + g_interface_info_get_n_properties (GIInterfaceInfo *info) + { +- GIBaseInfo *base = (GIBaseInfo *)info; +- InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset]; ++ GIRealInfo *rinfo = (GIRealInfo *)info; ++ InterfaceBlob *blob = (InterfaceBlob *)&rinfo->typelib->data[rinfo->offset]; + + return blob->n_properties; + } +@@ -1746,23 +1795,23 @@ g_interface_info_get_property (GIInterfaceInfo *info, + gint n) + { + gint offset; +- GIBaseInfo *base = (GIBaseInfo *)info; +- Header *header = (Header *)base->typelib->data; +- InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset]; ++ GIRealInfo *rinfo = (GIRealInfo *)info; ++ Header *header = (Header *)rinfo->typelib->data; ++ InterfaceBlob *blob = (InterfaceBlob *)&rinfo->typelib->data[rinfo->offset]; + +- offset = base->offset + header->interface_blob_size ++ offset = rinfo->offset + header->interface_blob_size + + (blob->n_prerequisites + (blob->n_prerequisites % 2)) * 2 + + n * header->property_blob_size; + +- return (GIPropertyInfo *) g_info_new (GI_INFO_TYPE_PROPERTY, base, +- base->typelib, offset); ++ return (GIPropertyInfo *) g_info_new (GI_INFO_TYPE_PROPERTY, (GIBaseInfo*)info, ++ rinfo->typelib, offset); + } + + gint + g_interface_info_get_n_methods (GIInterfaceInfo *info) + { +- GIBaseInfo *base = (GIBaseInfo *)info; +- InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset]; ++ GIRealInfo *rinfo = (GIRealInfo *)info; ++ InterfaceBlob *blob = (InterfaceBlob *)&rinfo->typelib->data[rinfo->offset]; + + return blob->n_methods; + } +@@ -1772,17 +1821,17 @@ g_interface_info_get_method (GIInterfaceInfo *info, + gint n) + { + gint offset; +- GIBaseInfo *base = (GIBaseInfo *)info; +- Header *header = (Header *)base->typelib->data; +- InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset]; ++ GIRealInfo *rinfo = (GIRealInfo *)info; ++ Header *header = (Header *)rinfo->typelib->data; ++ InterfaceBlob *blob = (InterfaceBlob *)&rinfo->typelib->data[rinfo->offset]; + +- offset = base->offset + header->interface_blob_size ++ offset = rinfo->offset + header->interface_blob_size + + (blob->n_prerequisites + (blob->n_prerequisites % 2)) * 2 + + blob->n_properties * header->property_blob_size + + n * header->function_blob_size; + +- return (GIFunctionInfo *) g_info_new (GI_INFO_TYPE_FUNCTION, base, +- base->typelib, offset); ++ return (GIFunctionInfo *) g_info_new (GI_INFO_TYPE_FUNCTION, (GIBaseInfo*)info, ++ rinfo->typelib, offset); + } + + GIFunctionInfo * +@@ -1790,22 +1839,22 @@ g_interface_info_find_method (GIInterfaceInfo *info, + const gchar *name) + { + gint offset; +- GIBaseInfo *base = (GIBaseInfo *)info; +- Header *header = (Header *)base->typelib->data; +- InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset]; ++ GIRealInfo *rinfo = (GIRealInfo *)info; ++ Header *header = (Header *)rinfo->typelib->data; ++ InterfaceBlob *blob = (InterfaceBlob *)&rinfo->typelib->data[rinfo->offset]; + +- offset = base->offset + header->interface_blob_size ++ offset = rinfo->offset + header->interface_blob_size + + (blob->n_prerequisites + (blob->n_prerequisites % 2)) * 2 + + blob->n_properties * header->property_blob_size; + +- return find_method (base, offset, blob->n_methods, name); ++ return find_method ((GIBaseInfo*)info, offset, blob->n_methods, name); + } + + gint + g_interface_info_get_n_signals (GIInterfaceInfo *info) + { +- GIBaseInfo *base = (GIBaseInfo *)info; +- InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset]; ++ GIRealInfo *rinfo = (GIRealInfo *)info; ++ InterfaceBlob *blob = (InterfaceBlob *)&rinfo->typelib->data[rinfo->offset]; + + return blob->n_signals; + } +@@ -1815,25 +1864,25 @@ g_interface_info_get_signal (GIInterfaceInfo *info, + gint n) + { + gint offset; +- GIBaseInfo *base = (GIBaseInfo *)info; +- Header *header = (Header *)base->typelib->data; +- InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset]; ++ GIRealInfo *rinfo = (GIRealInfo *)info; ++ Header *header = (Header *)rinfo->typelib->data; ++ InterfaceBlob *blob = (InterfaceBlob *)&rinfo->typelib->data[rinfo->offset]; + +- offset = base->offset + header->interface_blob_size ++ offset = rinfo->offset + header->interface_blob_size + + (blob->n_prerequisites + (blob->n_prerequisites % 2)) * 2 + + blob->n_properties * header->property_blob_size + + blob->n_methods * header->function_blob_size + + n * header->signal_blob_size; + +- return (GISignalInfo *) g_info_new (GI_INFO_TYPE_SIGNAL, base, +- base->typelib, offset); ++ return (GISignalInfo *) g_info_new (GI_INFO_TYPE_SIGNAL, (GIBaseInfo*)info, ++ rinfo->typelib, offset); + } + + gint + g_interface_info_get_n_vfuncs (GIInterfaceInfo *info) + { +- GIBaseInfo *base = (GIBaseInfo *)info; +- InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset]; ++ GIRealInfo *rinfo = (GIRealInfo *)info; ++ InterfaceBlob *blob = (InterfaceBlob *)&rinfo->typelib->data[rinfo->offset]; + + return blob->n_vfuncs; + } +@@ -1843,19 +1892,19 @@ g_interface_info_get_vfunc (GIInterfaceInfo *info, + gint n) + { + gint offset; +- GIBaseInfo *base = (GIBaseInfo *)info; +- Header *header = (Header *)base->typelib->data; +- InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset]; ++ GIRealInfo *rinfo = (GIRealInfo *)info; ++ Header *header = (Header *)rinfo->typelib->data; ++ InterfaceBlob *blob = (InterfaceBlob *)&rinfo->typelib->data[rinfo->offset]; + +- offset = base->offset + header->interface_blob_size ++ offset = rinfo->offset + header->interface_blob_size + + (blob->n_prerequisites + (blob->n_prerequisites % 2)) * 2 + + blob->n_properties * header->property_blob_size + + blob->n_methods * header->function_blob_size + + blob->n_signals * header->signal_blob_size + + n * header->vfunc_blob_size; + +- return (GIVFuncInfo *) g_info_new (GI_INFO_TYPE_VFUNC, base, +- base->typelib, offset); ++ return (GIVFuncInfo *) g_info_new (GI_INFO_TYPE_VFUNC, (GIBaseInfo*)info, ++ rinfo->typelib, offset); + } + + /** +@@ -1873,24 +1922,24 @@ g_interface_info_find_vfunc (GIInterfaceInfo *info, + const gchar *name) + { + gint offset; +- GIBaseInfo *base = (GIBaseInfo *)info; +- Header *header = (Header *)base->typelib->data; +- InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset]; ++ GIRealInfo *rinfo = (GIRealInfo *)info; ++ Header *header = (Header *)rinfo->typelib->data; ++ InterfaceBlob *blob = (InterfaceBlob *)&rinfo->typelib->data[rinfo->offset]; + +- offset = base->offset + header->interface_blob_size ++ offset = rinfo->offset + header->interface_blob_size + + (blob->n_prerequisites + blob->n_prerequisites % 2) * 2 + + blob->n_properties * header->property_blob_size + + blob->n_methods * header->function_blob_size + + blob->n_signals * header->signal_blob_size; + +- return find_vfunc (base, offset, blob->n_vfuncs, name); ++ return find_vfunc (rinfo, offset, blob->n_vfuncs, name); + } + + gint + g_interface_info_get_n_constants (GIInterfaceInfo *info) + { +- GIBaseInfo *base = (GIBaseInfo *)info; +- InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset]; ++ GIRealInfo *rinfo = (GIRealInfo *)info; ++ InterfaceBlob *blob = (InterfaceBlob *)&rinfo->typelib->data[rinfo->offset]; + + return blob->n_constants; + } +@@ -1900,11 +1949,11 @@ g_interface_info_get_constant (GIInterfaceInfo *info, + gint n) + { + gint offset; +- GIBaseInfo *base = (GIBaseInfo *)info; +- Header *header = (Header *)base->typelib->data; +- InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset]; ++ GIRealInfo *rinfo = (GIRealInfo *)info; ++ Header *header = (Header *)rinfo->typelib->data; ++ InterfaceBlob *blob = (InterfaceBlob *)&rinfo->typelib->data[rinfo->offset]; + +- offset = base->offset + header->interface_blob_size ++ offset = rinfo->offset + header->interface_blob_size + + (blob->n_prerequisites + (blob->n_prerequisites % 2)) * 2 + + blob->n_properties * header->property_blob_size + + blob->n_methods * header->function_blob_size +@@ -1912,8 +1961,8 @@ g_interface_info_get_constant (GIInterfaceInfo *info, + + blob->n_vfuncs * header->vfunc_blob_size + + n * header->constant_blob_size; + +- return (GIConstantInfo *) g_info_new (GI_INFO_TYPE_CONSTANT, base, +- base->typelib, offset); ++ return (GIConstantInfo *) g_info_new (GI_INFO_TYPE_CONSTANT, (GIBaseInfo*)info, ++ rinfo->typelib, offset); + } + + /** +@@ -1927,12 +1976,12 @@ g_interface_info_get_constant (GIInterfaceInfo *info, + GIStructInfo * + g_interface_info_get_iface_struct (GIInterfaceInfo *info) + { +- GIBaseInfo *base = (GIBaseInfo *)info; +- InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset]; ++ GIRealInfo *rinfo = (GIRealInfo *)info; ++ InterfaceBlob *blob = (InterfaceBlob *)&rinfo->typelib->data[rinfo->offset]; + + if (blob->gtype_struct) +- return (GIStructInfo *) g_info_from_entry (base->repository, +- base->typelib, blob->gtype_struct); ++ return (GIStructInfo *) g_info_from_entry (rinfo->repository, ++ rinfo->typelib, blob->gtype_struct); + else + return NULL; + } +@@ -1942,8 +1991,8 @@ GParamFlags + g_property_info_get_flags (GIPropertyInfo *info) + { + GParamFlags flags; +- GIBaseInfo *base = (GIBaseInfo *)info; +- PropertyBlob *blob = (PropertyBlob *)&base->typelib->data[base->offset]; ++ GIRealInfo *rinfo = (GIRealInfo *)info; ++ PropertyBlob *blob = (PropertyBlob *)&rinfo->typelib->data[rinfo->offset]; + + flags = 0; + +@@ -1965,9 +2014,9 @@ g_property_info_get_flags (GIPropertyInfo *info) + GITypeInfo * + g_property_info_get_type (GIPropertyInfo *info) + { +- GIBaseInfo *base = (GIBaseInfo *)info; ++ GIRealInfo *rinfo = (GIRealInfo *)info; + +- return g_type_info_new (base, base->typelib, base->offset + G_STRUCT_OFFSET (PropertyBlob, type)); ++ return g_type_info_new ((GIBaseInfo*)info, rinfo->typelib, rinfo->offset + G_STRUCT_OFFSET (PropertyBlob, type)); + } + + +@@ -1977,8 +2026,8 @@ g_signal_info_get_flags (GISignalInfo *info) + { + GSignalFlags flags; + +- GIBaseInfo *base = (GIBaseInfo *)info; +- SignalBlob *blob = (SignalBlob *)&base->typelib->data[base->offset]; ++ GIRealInfo *rinfo = (GIRealInfo *)info; ++ SignalBlob *blob = (SignalBlob *)&rinfo->typelib->data[rinfo->offset]; + + flags = 0; + +@@ -2009,11 +2058,11 @@ g_signal_info_get_flags (GISignalInfo *info) + GIVFuncInfo * + g_signal_info_get_class_closure (GISignalInfo *info) + { +- GIBaseInfo *base = (GIBaseInfo *)info; +- SignalBlob *blob = (SignalBlob *)&base->typelib->data[base->offset]; ++ GIRealInfo *rinfo = (GIRealInfo *)info; ++ SignalBlob *blob = (SignalBlob *)&rinfo->typelib->data[rinfo->offset]; + + if (blob->has_class_closure) +- return g_interface_info_get_vfunc ((GIInterfaceInfo *)base->container, blob->class_closure); ++ return g_interface_info_get_vfunc ((GIInterfaceInfo *)rinfo->container, blob->class_closure); + + return NULL; + } +@@ -2021,8 +2070,8 @@ g_signal_info_get_class_closure (GISignalInfo *info) + gboolean + g_signal_info_true_stops_emit (GISignalInfo *info) + { +- GIBaseInfo *base = (GIBaseInfo *)info; +- SignalBlob *blob = (SignalBlob *)&base->typelib->data[base->offset]; ++ GIRealInfo *rinfo = (GIRealInfo *)info; ++ SignalBlob *blob = (SignalBlob *)&rinfo->typelib->data[rinfo->offset]; + + return blob->true_stops_emit; + } +@@ -2033,8 +2082,8 @@ g_vfunc_info_get_flags (GIVFuncInfo *info) + { + GIVFuncInfoFlags flags; + +- GIBaseInfo *base = (GIBaseInfo *)info; +- VFuncBlob *blob = (VFuncBlob *)&base->typelib->data[base->offset]; ++ GIRealInfo *rinfo = (GIRealInfo *)info; ++ VFuncBlob *blob = (VFuncBlob *)&rinfo->typelib->data[rinfo->offset]; + + flags = 0; + +@@ -2053,8 +2102,8 @@ g_vfunc_info_get_flags (GIVFuncInfo *info) + gint + g_vfunc_info_get_offset (GIVFuncInfo *info) + { +- GIBaseInfo *base = (GIBaseInfo *)info; +- VFuncBlob *blob = (VFuncBlob *)&base->typelib->data[base->offset]; ++ GIRealInfo *rinfo = (GIRealInfo *)info; ++ VFuncBlob *blob = (VFuncBlob *)&rinfo->typelib->data[rinfo->offset]; + + return blob->struct_offset; + } +@@ -2062,11 +2111,11 @@ g_vfunc_info_get_offset (GIVFuncInfo *info) + GISignalInfo * + g_vfunc_info_get_signal (GIVFuncInfo *info) + { +- GIBaseInfo *base = (GIBaseInfo *)info; +- VFuncBlob *blob = (VFuncBlob *)&base->typelib->data[base->offset]; ++ GIRealInfo *rinfo = (GIRealInfo *)info; ++ VFuncBlob *blob = (VFuncBlob *)&rinfo->typelib->data[rinfo->offset]; + + if (blob->class_closure) +- return g_interface_info_get_signal ((GIInterfaceInfo *)base->container, blob->signal); ++ return g_interface_info_get_signal ((GIInterfaceInfo *)rinfo->container, blob->signal); + + return NULL; + } +@@ -2085,9 +2134,9 @@ g_vfunc_info_get_signal (GIVFuncInfo *info) + GIFunctionInfo * + g_vfunc_info_get_invoker (GIVFuncInfo *info) + { +- GIBaseInfo *base = (GIBaseInfo *)info; +- VFuncBlob *blob = (VFuncBlob *)&base->typelib->data[base->offset]; +- GIBaseInfo *container = base->container; ++ GIRealInfo *rinfo = (GIRealInfo *)info; ++ VFuncBlob *blob = (VFuncBlob *)&rinfo->typelib->data[rinfo->offset]; ++ GIBaseInfo *container = rinfo->container; + GIInfoType parent_type; + + /* 1023 = 0x3ff is the maximum of the 10 bits for invoker index */ +@@ -2107,80 +2156,80 @@ g_vfunc_info_get_invoker (GIVFuncInfo *info) + GITypeInfo * + g_constant_info_get_type (GIConstantInfo *info) + { +- GIBaseInfo *base = (GIBaseInfo *)info; ++ GIRealInfo *rinfo = (GIRealInfo *)info; + +- return g_type_info_new (base, base->typelib, base->offset + 8); ++ return g_type_info_new ((GIBaseInfo*)info, rinfo->typelib, rinfo->offset + 8); + } + + gint + g_constant_info_get_value (GIConstantInfo *info, + GArgument *value) + { +- GIBaseInfo *base = (GIBaseInfo *)info; +- ConstantBlob *blob = (ConstantBlob *)&base->typelib->data[base->offset]; ++ GIRealInfo *rinfo = (GIRealInfo *)info; ++ ConstantBlob *blob = (ConstantBlob *)&rinfo->typelib->data[rinfo->offset]; + + /* FIXME non-basic types ? */ + if (blob->type.flags.reserved == 0 && blob->type.flags.reserved2 == 0) + { + if (blob->type.flags.pointer) +- value->v_pointer = g_memdup (&base->typelib->data[blob->offset], blob->size); ++ value->v_pointer = g_memdup (&rinfo->typelib->data[blob->offset], blob->size); + else + { + switch (blob->type.flags.tag) + { + case GI_TYPE_TAG_BOOLEAN: +- value->v_boolean = *(gboolean*)&base->typelib->data[blob->offset]; ++ value->v_boolean = *(gboolean*)&rinfo->typelib->data[blob->offset]; + break; + case GI_TYPE_TAG_INT8: +- value->v_int8 = *(gint8*)&base->typelib->data[blob->offset]; ++ value->v_int8 = *(gint8*)&rinfo->typelib->data[blob->offset]; + break; + case GI_TYPE_TAG_UINT8: +- value->v_uint8 = *(guint8*)&base->typelib->data[blob->offset]; ++ value->v_uint8 = *(guint8*)&rinfo->typelib->data[blob->offset]; + break; + case GI_TYPE_TAG_INT16: +- value->v_int16 = *(gint16*)&base->typelib->data[blob->offset]; ++ value->v_int16 = *(gint16*)&rinfo->typelib->data[blob->offset]; + break; + case GI_TYPE_TAG_UINT16: +- value->v_uint16 = *(guint16*)&base->typelib->data[blob->offset]; ++ value->v_uint16 = *(guint16*)&rinfo->typelib->data[blob->offset]; + break; + case GI_TYPE_TAG_INT32: +- value->v_int32 = *(gint32*)&base->typelib->data[blob->offset]; ++ value->v_int32 = *(gint32*)&rinfo->typelib->data[blob->offset]; + break; + case GI_TYPE_TAG_UINT32: +- value->v_uint32 = *(guint32*)&base->typelib->data[blob->offset]; ++ value->v_uint32 = *(guint32*)&rinfo->typelib->data[blob->offset]; + break; + case GI_TYPE_TAG_INT64: +- value->v_int64 = *(gint64*)&base->typelib->data[blob->offset]; ++ value->v_int64 = *(gint64*)&rinfo->typelib->data[blob->offset]; + break; + case GI_TYPE_TAG_UINT64: +- value->v_uint64 = *(guint64*)&base->typelib->data[blob->offset]; ++ value->v_uint64 = *(guint64*)&rinfo->typelib->data[blob->offset]; + break; + case GI_TYPE_TAG_FLOAT: +- value->v_float = *(gfloat*)&base->typelib->data[blob->offset]; ++ value->v_float = *(gfloat*)&rinfo->typelib->data[blob->offset]; + break; + case GI_TYPE_TAG_DOUBLE: +- value->v_double = *(gdouble*)&base->typelib->data[blob->offset]; ++ value->v_double = *(gdouble*)&rinfo->typelib->data[blob->offset]; + break; + case GI_TYPE_TAG_TIME_T: +- value->v_long = *(long*)&base->typelib->data[blob->offset]; ++ value->v_long = *(long*)&rinfo->typelib->data[blob->offset]; + break; + case GI_TYPE_TAG_SHORT: +- value->v_short = *(gshort*)&base->typelib->data[blob->offset]; ++ value->v_short = *(gshort*)&rinfo->typelib->data[blob->offset]; + break; + case GI_TYPE_TAG_USHORT: +- value->v_ushort = *(gushort*)&base->typelib->data[blob->offset]; ++ value->v_ushort = *(gushort*)&rinfo->typelib->data[blob->offset]; + break; + case GI_TYPE_TAG_INT: +- value->v_int = *(gint*)&base->typelib->data[blob->offset]; ++ value->v_int = *(gint*)&rinfo->typelib->data[blob->offset]; + break; + case GI_TYPE_TAG_UINT: +- value->v_uint = *(guint*)&base->typelib->data[blob->offset]; ++ value->v_uint = *(guint*)&rinfo->typelib->data[blob->offset]; + break; + case GI_TYPE_TAG_LONG: +- value->v_long = *(glong*)&base->typelib->data[blob->offset]; ++ value->v_long = *(glong*)&rinfo->typelib->data[blob->offset]; + break; + case GI_TYPE_TAG_ULONG: +- value->v_ulong = *(gulong*)&base->typelib->data[blob->offset]; ++ value->v_ulong = *(gulong*)&rinfo->typelib->data[blob->offset]; + break; + } + } +@@ -2193,8 +2242,8 @@ g_constant_info_get_value (GIConstantInfo *info, + gint + g_union_info_get_n_fields (GIUnionInfo *info) + { +- GIBaseInfo *base = (GIBaseInfo *)info; +- UnionBlob *blob = (UnionBlob *)&base->typelib->data[base->offset]; ++ GIRealInfo *rinfo = (GIRealInfo *)info; ++ UnionBlob *blob = (UnionBlob *)&rinfo->typelib->data[rinfo->offset]; + + return blob->n_fields; + } +@@ -2203,19 +2252,19 @@ GIFieldInfo * + g_union_info_get_field (GIUnionInfo *info, + gint n) + { +- GIBaseInfo *base = (GIBaseInfo *)info; +- Header *header = (Header *)base->typelib->data; ++ GIRealInfo *rinfo = (GIRealInfo *)info; ++ Header *header = (Header *)rinfo->typelib->data; + +- return (GIFieldInfo *) g_info_new (GI_INFO_TYPE_FIELD, base, base->typelib, +- base->offset + header->union_blob_size + ++ return (GIFieldInfo *) g_info_new (GI_INFO_TYPE_FIELD, (GIBaseInfo*)info, rinfo->typelib, ++ rinfo->offset + header->union_blob_size + + n * header->field_blob_size); + } + + gint + g_union_info_get_n_methods (GIUnionInfo *info) + { +- GIBaseInfo *base = (GIBaseInfo *)info; +- UnionBlob *blob = (UnionBlob *)&base->typelib->data[base->offset]; ++ GIRealInfo *rinfo = (GIRealInfo *)info; ++ UnionBlob *blob = (UnionBlob *)&rinfo->typelib->data[rinfo->offset]; + + return blob->n_functions; + } +@@ -2224,23 +2273,23 @@ GIFunctionInfo * + g_union_info_get_method (GIUnionInfo *info, + gint n) + { +- GIBaseInfo *base = (GIBaseInfo *)info; +- UnionBlob *blob = (UnionBlob *)&base->typelib->data[base->offset]; +- Header *header = (Header *)base->typelib->data; ++ GIRealInfo *rinfo = (GIRealInfo *)info; ++ UnionBlob *blob = (UnionBlob *)&rinfo->typelib->data[rinfo->offset]; ++ Header *header = (Header *)rinfo->typelib->data; + gint offset; + +- offset = base->offset + header->union_blob_size ++ offset = rinfo->offset + header->union_blob_size + + blob->n_fields * header->field_blob_size + + n * header->function_blob_size; +- return (GIFunctionInfo *) g_info_new (GI_INFO_TYPE_FUNCTION, base, +- base->typelib, offset); ++ return (GIFunctionInfo *) g_info_new (GI_INFO_TYPE_FUNCTION, (GIBaseInfo*)info, ++ rinfo->typelib, offset); + } + + gboolean + g_union_info_is_discriminated (GIUnionInfo *info) + { +- GIBaseInfo *base = (GIBaseInfo *)info; +- UnionBlob *blob = (UnionBlob *)&base->typelib->data[base->offset]; ++ GIRealInfo *rinfo = (GIRealInfo *)info; ++ UnionBlob *blob = (UnionBlob *)&rinfo->typelib->data[rinfo->offset]; + + return blob->discriminated; + } +@@ -2248,8 +2297,8 @@ g_union_info_is_discriminated (GIUnionInfo *info) + gint + g_union_info_get_discriminator_offset (GIUnionInfo *info) + { +- GIBaseInfo *base = (GIBaseInfo *)info; +- UnionBlob *blob = (UnionBlob *)&base->typelib->data[base->offset]; ++ GIRealInfo *rinfo = (GIRealInfo *)info; ++ UnionBlob *blob = (UnionBlob *)&rinfo->typelib->data[rinfo->offset]; + + return blob->discriminator_offset; + } +@@ -2257,30 +2306,30 @@ g_union_info_get_discriminator_offset (GIUnionInfo *info) + GITypeInfo * + g_union_info_get_discriminator_type (GIUnionInfo *info) + { +- GIBaseInfo *base = (GIBaseInfo *)info; ++ GIRealInfo *rinfo = (GIRealInfo *)info; + +- return g_type_info_new (base, base->typelib, base->offset + 24); ++ return g_type_info_new ((GIBaseInfo*)info, rinfo->typelib, rinfo->offset + 24); + } + + GIConstantInfo * + g_union_info_get_discriminator (GIUnionInfo *info, + gint n) + { +- GIBaseInfo *base = (GIBaseInfo *)info; +- UnionBlob *blob = (UnionBlob *)&base->typelib->data[base->offset]; ++ GIRealInfo *rinfo = (GIRealInfo *)info; ++ UnionBlob *blob = (UnionBlob *)&rinfo->typelib->data[rinfo->offset]; + + if (blob->discriminated) + { +- Header *header = (Header *)base->typelib->data; ++ Header *header = (Header *)rinfo->typelib->data; + gint offset; + +- offset = base->offset + header->union_blob_size ++ offset = rinfo->offset + header->union_blob_size + + blob->n_fields * header->field_blob_size + + blob->n_functions * header->function_blob_size + + n * header->constant_blob_size; + +- return (GIConstantInfo *) g_info_new (GI_INFO_TYPE_CONSTANT, base, +- base->typelib, offset); ++ return (GIConstantInfo *) g_info_new (GI_INFO_TYPE_CONSTANT, (GIBaseInfo*)info, ++ rinfo->typelib, offset); + } + + return NULL; +@@ -2291,21 +2340,21 @@ g_union_info_find_method (GIUnionInfo *info, + const gchar *name) + { + gint offset; +- GIBaseInfo *base = (GIBaseInfo *)info; +- Header *header = (Header *)base->typelib->data; +- UnionBlob *blob = (UnionBlob *)&base->typelib->data[base->offset]; ++ GIRealInfo *rinfo = (GIRealInfo *)info; ++ Header *header = (Header *)rinfo->typelib->data; ++ UnionBlob *blob = (UnionBlob *)&rinfo->typelib->data[rinfo->offset]; + +- offset = base->offset + header->union_blob_size ++ offset = rinfo->offset + header->union_blob_size + + blob->n_fields * header->field_blob_size; + +- return find_method (base, offset, blob->n_functions, name); ++ return find_method ((GIBaseInfo*)info, offset, blob->n_functions, name); + } + + gsize + g_union_info_get_size (GIUnionInfo *info) + { +- GIBaseInfo *base = (GIBaseInfo *)info; +- UnionBlob *blob = (UnionBlob *)&base->typelib->data[base->offset]; ++ GIRealInfo *rinfo = (GIRealInfo *)info; ++ UnionBlob *blob = (UnionBlob *)&rinfo->typelib->data[rinfo->offset]; + + return blob->size; + } +@@ -2313,8 +2362,8 @@ g_union_info_get_size (GIUnionInfo *info) + gsize + g_union_info_get_alignment (GIUnionInfo *info) + { +- GIBaseInfo *base = (GIBaseInfo *)info; +- UnionBlob *blob = (UnionBlob *)&base->typelib->data[base->offset]; ++ GIRealInfo *rinfo = (GIRealInfo *)info; ++ UnionBlob *blob = (UnionBlob *)&rinfo->typelib->data[rinfo->offset]; + + return blob->alignment; + } +diff --git a/girepository/girepository.h b/girepository/girepository.h +index c30418a..93cf126 100644 +--- girepository/girepository.h ++++ girepository/girepository.h +@@ -27,37 +27,55 @@ + + G_BEGIN_DECLS + +-#define G_TYPE_IREPOSITORY (g_irepository_get_type ()) +-#define G_IREPOSITORY(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), G_TYPE_IREPOSITORY, GIRepository)) ++#define G_TYPE_IREPOSITORY (g_irepository_get_type ()) ++#define G_IREPOSITORY(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), G_TYPE_IREPOSITORY, GIRepository)) ++#define G_IREPOSITORY_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), G_TYPE_IREPOSITORY, GIRepositoryClass)) ++#define G_IS_IREPOSITORY(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), G_TYPE_IREPOSITORY)) ++#define G_IS_IREPOSITORY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), G_TYPE_IREPOSITORY)) ++#define G_IREPOSITORY_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), G_TYPE_IREPOSITORY, GIRepositoryClass)) + + typedef struct _GIRepository GIRepository; + typedef struct _GIRepositoryClass GIRepositoryClass; + typedef struct _GIRepositoryPrivate GIRepositoryPrivate; +-typedef struct _GIBaseInfo GIBaseInfo; +-typedef struct _GICallableInfo GICallableInfo; +-typedef struct _GIFunctionInfo GIFunctionInfo; +-typedef struct _GICallbackInfo GICallbackInfo; +-typedef struct _GIRegisteredTypeInfo GIRegisteredTypeInfo; +-typedef struct _GIStructInfo GIStructInfo; +-typedef struct _GIUnionInfo GIUnionInfo; +-typedef struct _GIEnumInfo GIEnumInfo; +-typedef struct _GIObjectInfo GIObjectInfo; +-typedef struct _GIInterfaceInfo GIInterfaceInfo; +-typedef struct _GIConstantInfo GIConstantInfo; +-typedef struct _GIValueInfo GIValueInfo; +-typedef struct _GISignalInfo GISignalInfo; +-typedef struct _GIVFuncInfo GIVFuncInfo; +-typedef struct _GIPropertyInfo GIPropertyInfo; +-typedef struct _GIFieldInfo GIFieldInfo; +-typedef struct _GIArgInfo GIArgInfo; +-typedef struct _GITypeInfo GITypeInfo; +-typedef struct _GIErrorDomainInfo GIErrorDomainInfo; ++ ++typedef struct _GIBaseInfoStub GIBaseInfo; ++ ++struct _GIBaseInfoStub { ++ gint32 dummy1; ++ gint32 dummy2; ++ gpointer dummy3; ++ gpointer dummy4; ++ gpointer dummy5; ++ guint32 dummy6; ++ guint32 dummy7; ++ gpointer padding[4]; ++}; ++ ++typedef GIBaseInfo GICallableInfo; ++typedef GIBaseInfo GIFunctionInfo; ++typedef GIBaseInfo GICallbackInfo; ++typedef GIBaseInfo GIRegisteredTypeInfo; ++typedef GIBaseInfo GIStructInfo; ++typedef GIBaseInfo GIUnionInfo; ++typedef GIBaseInfo GIEnumInfo; ++typedef GIBaseInfo GIObjectInfo; ++typedef GIBaseInfo GIInterfaceInfo; ++typedef GIBaseInfo GIConstantInfo; ++typedef GIBaseInfo GIValueInfo; ++typedef GIBaseInfo GISignalInfo; ++typedef GIBaseInfo GIVFuncInfo; ++typedef GIBaseInfo GIPropertyInfo; ++typedef GIBaseInfo GIFieldInfo; ++typedef GIBaseInfo GIArgInfo; ++typedef GIBaseInfo GITypeInfo; ++typedef GIBaseInfo GIErrorDomainInfo; ++ + typedef struct _GIUnresolvedInfo GIUnresolvedInfo; + typedef struct _GTypelib GTypelib; + + struct _GIRepository + { +- GObject parent; ++ GObject parent; + + /*< private >*/ + GIRepositoryPrivate *priv; +@@ -282,11 +300,16 @@ typedef enum { + } GITransfer; + + GITypeInfo * g_callable_info_get_return_type (GICallableInfo *info); ++void g_callable_info_load_return_type (GICallableInfo *info, ++ GITypeInfo *type); + GITransfer g_callable_info_get_caller_owns (GICallableInfo *info); + gboolean g_callable_info_may_return_null (GICallableInfo *info); + gint g_callable_info_get_n_args (GICallableInfo *info); + GIArgInfo * g_callable_info_get_arg (GICallableInfo *info, +- gint n); ++ gint n); ++void g_callable_info_load_arg (GICallableInfo *info, ++ gint n, ++ GIArgInfo *arg); + + /* GIArgInfo */ + +@@ -317,6 +340,8 @@ GIScopeType g_arg_info_get_scope (GIArgInfo *info); + gint g_arg_info_get_closure (GIArgInfo *info); + gint g_arg_info_get_destroy (GIArgInfo *info); + GITypeInfo * g_arg_info_get_type (GIArgInfo *info); ++void g_arg_info_load_type (GIArgInfo *info, ++ GITypeInfo *type); + + + /* GITypeInfo */ +-- +cgit v0.8.3.1 diff --git a/devel/gobject-introspection/files/patch-20100107 b/devel/gobject-introspection/files/patch-20100107 new file mode 100644 index 000000000000..570d2c7c7591 --- /dev/null +++ b/devel/gobject-introspection/files/patch-20100107 @@ -0,0 +1,66 @@ +From e7b9f873f0152136af60753598077156e7ae1545 Mon Sep 17 00:00:00 2001 +From: Colin Walters <walters@verbum.org> +Date: Thu, 07 Jan 2010 21:12:15 +0000 +Subject: Correctly cast to a CommonBlob when looking up embedded types + +When looking at an embedded type (e.g. a Callback after a Field), the +offset we put in the info structure was to the CallbackBlob itself. + +However the code in g_type_info_get_interface assumed that the offset +was to a SimpleTypeBlob, which it wasn't. + +https://bugzilla.gnome.org/show_bug.cgi?id=606180 +--- +diff --git a/girepository/ginfo.c b/girepository/ginfo.c +index b11cc8f..ed2fc93 100644 +--- girepository/ginfo.c ++++ girepository/ginfo.c +@@ -997,18 +997,38 @@ GIBaseInfo * + g_type_info_get_interface (GITypeInfo *info) + { + GIRealInfo *rinfo = (GIRealInfo *)info; +- SimpleTypeBlob *type = (SimpleTypeBlob *)&rinfo->typelib->data[rinfo->offset]; + ++ /* For embedded types, the given offset is a pointer to the actual blob, ++ * after the end of the field. In that case we know it's a "subclass" of ++ * CommonBlob, so use that to determine the info type. ++ */ + if (rinfo->type_is_embedded) +- return (GIBaseInfo *) g_info_new (type->offset, (GIBaseInfo*)info, rinfo->typelib, +- rinfo->offset); ++ { ++ CommonBlob *common = (CommonBlob *)&rinfo->typelib->data[rinfo->offset]; ++ GIInfoType info_type; + +- if (!(type->flags.reserved == 0 && type->flags.reserved2 == 0)) ++ switch (common->blob_type) ++ { ++ case BLOB_TYPE_CALLBACK: ++ info_type = GI_INFO_TYPE_CALLBACK; ++ break; ++ default: ++ g_assert_not_reached (); ++ return NULL; ++ } ++ return (GIBaseInfo *) g_info_new (info_type, (GIBaseInfo*)info, rinfo->typelib, ++ rinfo->offset); ++ } ++ else + { +- InterfaceTypeBlob *blob = (InterfaceTypeBlob *)&rinfo->typelib->data[rinfo->offset]; +- +- if (blob->tag == GI_TYPE_TAG_INTERFACE) +- return g_info_from_entry (rinfo->repository, rinfo->typelib, blob->interface); ++ SimpleTypeBlob *type = (SimpleTypeBlob *)&rinfo->typelib->data[rinfo->offset]; ++ if (!(type->flags.reserved == 0 && type->flags.reserved2 == 0)) ++ { ++ InterfaceTypeBlob *blob = (InterfaceTypeBlob *)&rinfo->typelib->data[rinfo->offset]; ++ ++ if (blob->tag == GI_TYPE_TAG_INTERFACE) ++ return g_info_from_entry (rinfo->repository, rinfo->typelib, blob->interface); ++ } + } + + return NULL; +-- +cgit v0.8.3.1 diff --git a/devel/gobject-introspection/files/patch-girepository_girnode.c b/devel/gobject-introspection/files/patch-girepository_girnode.c new file mode 100644 index 000000000000..f566de3d6208 --- /dev/null +++ b/devel/gobject-introspection/files/patch-girepository_girnode.c @@ -0,0 +1,12 @@ +--- girepository/girnode.c.orig 2009-07-09 21:20:46.000000000 +0400 ++++ girepository/girnode.c 2009-12-09 16:12:24.000000000 +0300 +@@ -2288,7 +2288,8 @@ + break; + case GI_TYPE_TAG_DOUBLE: + blob->size = sizeof (gdouble); +- *(gdouble*)&data[blob->offset] = (gdouble) parse_float_value (constant->value); ++ gdouble tmp = parse_float_value (constant->value); ++ memcpy (&data[blob->offset], &tmp, blob->size); + break; + case GI_TYPE_TAG_UTF8: + case GI_TYPE_TAG_FILENAME: |