diff options
| author | Paul Pogonyshev <pogonyshev@gmx.net> | 2008-09-08 20:26:13 +0000 |
|---|---|---|
| committer | Paul Pogonyshev <paulp@src.gnome.org> | 2008-09-08 20:26:13 +0000 |
| commit | 5a5460578775d8e44e15ad4df3cbcad2f0c3a808 (patch) | |
| tree | ee37fba6b7279f51fa08c0e1b55e35c982582e6e /codegen | |
| parent | 3be00e793df41c81b5188f7b0b8fb8fcfb75ed56 (diff) | |
| download | pygobject-5a5460578775d8e44e15ad4df3cbcad2f0c3a808.tar.gz pygobject-5a5460578775d8e44e15ad4df3cbcad2f0c3a808.tar.xz pygobject-5a5460578775d8e44e15ad4df3cbcad2f0c3a808.zip | |
Bug 551056 – make codegen not import when corresponding argument types
2008-09-08 Paul Pogonyshev <pogonyshev@gmx.net>
Bug 551056 – make codegen not import when corresponding argument
types are not registered
* codegen/override.py (import_pat): Add support for optional 'for'
clause.
(Overrides.__parse_override): Handle it.
* codegen/codegen.py (SourceWriter.write_imports)
(SourceWriter.write_object_imports): Adapt for changes in
get_imports() return value.
(is_registered_object): New function.
svn path=/trunk/; revision=967
Diffstat (limited to 'codegen')
| -rw-r--r-- | codegen/codegen.py | 15 | ||||
| -rw-r--r-- | codegen/override.py | 8 |
2 files changed, 16 insertions, 7 deletions
diff --git a/codegen/codegen.py b/codegen/codegen.py index fa4417a..ab9153c 100644 --- a/codegen/codegen.py +++ b/codegen/codegen.py @@ -1374,9 +1374,10 @@ typedef intobjargproc ssizeobjargproc; def write_imports(self): self.fp.write('/* ---------- types from other modules ---------- */\n') - for module, pyname, cname in self.overrides.get_imports(): - self.fp.write('static PyTypeObject *_%s;\n' % cname) - self.fp.write('#define %s (*_%s)\n' % (cname, cname)) + for module, pyname, cname, importing_for in self.overrides.get_imports(): + if importing_for is None or is_registered_object(importing_for): + self.fp.write('static PyTypeObject *_%s;\n' % cname) + self.fp.write('#define %s (*_%s)\n' % (cname, cname)) self.fp.write('\n\n') def write_type_declarations(self): @@ -1485,8 +1486,9 @@ typedef intobjargproc ssizeobjargproc; return bymod = {} - for module, pyname, cname in imports: - bymod.setdefault(module, []).append((pyname, cname)) + for module, pyname, cname, importing_for in imports: + if importing_for is None or is_registered_object(importing_for): + bymod.setdefault(module, []).append((pyname, cname)) self.fp.write(' PyObject *module;\n\n') for module in bymod: self.fp.write( @@ -1625,6 +1627,9 @@ typedef intobjargproc ssizeobjargproc; _objects = {} +def is_registered_object(c_name): + return c_name in _objects + def get_object_by_name(c_name): global _objects return _objects[c_name] diff --git a/codegen/override.py b/codegen/override.py index c4d5ffa..bba5e42 100644 --- a/codegen/override.py +++ b/codegen/override.py @@ -19,7 +19,10 @@ def class2cname(klass, method): c_name += c return c_name[1:] + '_' + method -import_pat = re.compile(r'\s*import\s+(\S+)\.([^\s.]+)\s+as\s+(\S+)') +# import python_type as c_name [for arg_type] +# Last ('for') clause is optional. If present, the type will be +# imported only if given 'arg_type' is registered. +import_pat = re.compile(r'\s*import\s+(\S+)\.([^\s.]+)\s+as\s+(\S+)(\s+for\s+(\S+))?') class Overrides: def __init__(self, filename=None): @@ -166,7 +169,8 @@ class Overrides: for line in string.split(buffer, '\n'): match = import_pat.match(line) if match: - self.imports.append(match.groups()) + module, pyname, cname, conditional, importing_for = match.groups() + self.imports.append((module, pyname, cname, importing_for or None)) elif command == 'define': "define funcname [kwargs|noargs|onearg] [classmethod|staticmethod]" "define Class.method [kwargs|noargs|onearg] [classmethod|staticmethod]" |
