diff -up gobject-introspection-1.30.0/girepository/girffi.c.enum-fixes gobject-introspection-1.30.0/girepository/girffi.c --- gobject-introspection-1.30.0/girepository/girffi.c.enum-fixes 2011-11-29 12:30:04.759106057 -0600 +++ gobject-introspection-1.30.0/girepository/girffi.c 2011-11-29 11:06:26.540248521 -0600 @@ -30,16 +30,10 @@ #include "girepository.h" #include "girepository-private.h" -/** - * gi_type_tag_get_ffi_type: - * @tag: A #GITypeTag - * @is_pointer: Whether or not this is a pointer type - * - * Returns: A #ffi_type corresponding to the platform default C ABI for @tag and @is_pointer. - */ -ffi_type * -gi_type_tag_get_ffi_type (GITypeTag tag, - gboolean is_pointer) +static ffi_type * +gi_type_tag_get_ffi_type_internal (GITypeInfo *info, + GITypeTag tag, + gboolean is_pointer) { switch (tag) { @@ -77,12 +71,27 @@ gi_type_tag_get_ffi_type (GITypeTag ta case GI_TYPE_TAG_UTF8: case GI_TYPE_TAG_FILENAME: case GI_TYPE_TAG_ARRAY: - case GI_TYPE_TAG_INTERFACE: case GI_TYPE_TAG_GLIST: case GI_TYPE_TAG_GSLIST: case GI_TYPE_TAG_GHASH: case GI_TYPE_TAG_ERROR: return &ffi_type_pointer; + case GI_TYPE_TAG_INTERFACE: + { + /* This is for compat, but is broken! */ + if (info == NULL) + return &ffi_type_pointer; + + GIBaseInfo *interface = g_type_info_get_interface (info); + switch (g_base_info_get_type (interface)) + { + case GI_INFO_TYPE_ENUM: + case GI_INFO_TYPE_FLAGS: + return &ffi_type_sint32; + default: + return &ffi_type_pointer; + } + } case GI_TYPE_TAG_VOID: if (is_pointer) return &ffi_type_pointer; @@ -96,6 +105,20 @@ gi_type_tag_get_ffi_type (GITypeTag ta } /** + * gi_type_tag_get_ffi_type: + * @tag: A #GITypeTag + * @is_pointer: Whether or not this is a pointer type + * + * Returns: A #ffi_type corresponding to the platform default C ABI for @tag and @is_pointer. + */ +ffi_type * +gi_type_tag_get_ffi_type (GITypeTag tag, + gboolean is_pointer) +{ + return gi_type_tag_get_ffi_type_internal (NULL, tag, is_pointer); +} + +/** * g_type_info_get_ffi_type: * @info: A #GITypeInfo * @@ -104,7 +127,7 @@ gi_type_tag_get_ffi_type (GITypeTag ta ffi_type * g_type_info_get_ffi_type (GITypeInfo *info) { - return gi_type_tag_get_ffi_type (g_type_info_get_tag (info), g_type_info_is_pointer (info)); + return gi_type_tag_get_ffi_type_internal (info, g_type_info_get_tag (info), g_type_info_is_pointer (info)); } /**