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