Bug 560308 – g-ir-compiler goes in infinite loop on Gdk-2.0.gir
authorTommi Komulainen <tommi.komulainen@iki.fi>
Tue, 11 Nov 2008 17:26:59 +0000 (17:26 +0000)
committerTommi Komulainen <tko@src.gnome.org>
Tue, 11 Nov 2008 17:26:59 +0000 (17:26 +0000)
2008-11-11  Tommi Komulainen  <tommi.komulainen@iki.fi>

Based on patch by Johan Bilien.

* giscanner/transformer.py (_create_member, _create_parameter):
Resolve types here as well.
(_resolve_type_name_1): Try resolving using 'ctype' first since
it's least ambiguous. Fixes struct member type resolution with
similarly named types, e.g. Gdk.PangoRendererClass and
Pango.RendererClass
* tests/scanner/foo*: Add test.

svn path=/trunk/; revision=887

ChangeLog
giscanner/transformer.py
tests/scanner/foo-1.0-expected.gir
tests/scanner/foo-1.0-expected.tgir
tests/scanner/foo.h

index a12e011..25fbd1a 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,17 @@
+2008-11-11  Tommi Komulainen  <tommi.komulainen@iki.fi>
+
+       Bug 560308 – g-ir-compiler goes in infinite loop on Gdk-2.0.gir
+
+       Based on patch by Johan Bilien.
+
+       * giscanner/transformer.py (_create_member, _create_parameter):
+       Resolve types here as well.
+       (_resolve_type_name_1): Try resolving using 'ctype' first since
+       it's least ambiguous. Fixes struct member type resolution with
+       similarly named types, e.g. Gdk.PangoRendererClass and
+       Pango.RendererClass
+       * tests/scanner/foo*: Add test.
+
 2008-11-11  Owen Taylor  <otaylor@redhat.com>
 
        * girepository/girparser.c: Search provided include dirs before
index c52b108..c512f7a 100644 (file)
@@ -332,6 +332,7 @@ class Transformer(object):
                     size_opt = 'fixed-size=%d' % (child_list[0].const_int, )
                     opts['array'].append(size_opt)
             ftype = self._create_type(symbol.base_type, opts, True)
+            ftype = self.resolve_param_type(ftype)
             # Fields are assumed to be read-write
             # (except for Objects, see also glibtransformer.py)
             node = Field(symbol.ident, ftype, symbol.ident,
@@ -517,6 +518,7 @@ class Transformer(object):
                 options['transfer'] = ['none']
         else:
             ptype = self._create_type(symbol.base_type, options, True)
+            ptype = self.resolve_param_type(ptype)
         param = Parameter(symbol.ident, ptype)
         for option, data in options.iteritems():
             if option in ['in-out', 'inout']:
@@ -653,6 +655,12 @@ class Transformer(object):
             return type_names[type_name]
         except KeyError, e:
             pass
+
+        if ctype:
+            ctype = ctype.replace('*', '')
+            resolved = names.ctypes.get(ctype)
+            if resolved:
+                return self._typepair_to_str(resolved)
         type_name = self.remove_prefix(type_name)
         resolved = names.aliases.get(type_name)
         if resolved:
@@ -660,11 +668,6 @@ class Transformer(object):
         resolved = names.names.get(type_name)
         if resolved:
             return self._typepair_to_str(resolved)
-        if ctype:
-            ctype = ctype.replace('*', '')
-            resolved = names.ctypes.get(ctype)
-            if resolved:
-                return self._typepair_to_str(resolved)
         resolved = names.type_names.get(type_name)
         if resolved:
             return self._typepair_to_str(resolved)
index 762c648..d55bc8d 100644 (file)
         <type name="int" c:type="int"/>
       </field>
     </union>
+    <record name="UtilityStruct" c:type="FooUtilityStruct">
+      <field name="bar" writable="1">
+        <type name="utility.Struct" c:type="UtilityStruct"/>
+      </field>
+    </record>
     <function name="test_unsigned_qualifier"
               c:identifier="foo_test_unsigned_qualifier">
       <return-value transfer-ownership="none">
index 9eb154d..d3e82e1 100644 (file)
         <type name="int"/>
       </field>
     </union>
+    <record name="UtilityStruct">
+      <field name="bar" writable="1">
+        <type name="utility.Struct"/>
+      </field>
+    </record>
     <function name="test_unsigned_qualifier" c:identifier="foo_test_unsigned_qualifier">
       <return-value transfer-ownership="none">
         <type name="none"/>
index f69b00f..17a22d2 100644 (file)
@@ -232,6 +232,12 @@ typedef union _FooUnion
   int foo;
 } FooUnion;
 
+typedef struct _FooUtilityStruct FooUtilityStruct;
+struct _FooUtilityStruct
+{
+  UtilityStruct bar;
+};
+
 FooBUnion *foo_bunion_new (void);
 
 GType foo_bunion_get_type (void);