From 98527474d7b018cf30fc046830488c35abd67eab Mon Sep 17 00:00:00 2001 From: Tommi Komulainen Date: Tue, 11 Nov 2008 17:26:59 +0000 Subject: [PATCH] =?utf8?q?Bug=20560308=20=E2=80=93=20g-ir-compiler=20goes?= =?utf8?q?=20in=20infinite=20loop=20on=20Gdk-2.0.gir?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit 2008-11-11 Tommi Komulainen 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 | 14 ++++++++++++++ giscanner/transformer.py | 13 ++++++++----- tests/scanner/foo-1.0-expected.gir | 5 +++++ tests/scanner/foo-1.0-expected.tgir | 5 +++++ tests/scanner/foo.h | 6 ++++++ 5 files changed, 38 insertions(+), 5 deletions(-) diff --git a/ChangeLog b/ChangeLog index a12e011..25fbd1a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,17 @@ +2008-11-11 Tommi Komulainen + + 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 * girepository/girparser.c: Search provided include dirs before diff --git a/giscanner/transformer.py b/giscanner/transformer.py index c52b108..c512f7a 100644 --- a/giscanner/transformer.py +++ b/giscanner/transformer.py @@ -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) diff --git a/tests/scanner/foo-1.0-expected.gir b/tests/scanner/foo-1.0-expected.gir index 762c648..d55bc8d 100644 --- a/tests/scanner/foo-1.0-expected.gir +++ b/tests/scanner/foo-1.0-expected.gir @@ -480,6 +480,11 @@ + + + + + diff --git a/tests/scanner/foo-1.0-expected.tgir b/tests/scanner/foo-1.0-expected.tgir index 9eb154d..d3e82e1 100644 --- a/tests/scanner/foo-1.0-expected.tgir +++ b/tests/scanner/foo-1.0-expected.tgir @@ -367,6 +367,11 @@ + + + + + diff --git a/tests/scanner/foo.h b/tests/scanner/foo.h index f69b00f..17a22d2 100644 --- a/tests/scanner/foo.h +++ b/tests/scanner/foo.h @@ -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); -- 2.7.4