summaryrefslogtreecommitdiff
path: root/codegen
diff options
context:
space:
mode:
authorJohan Dahlin <johan@src.gnome.org>2006-07-05 16:03:24 +0000
committerJohan Dahlin <johan@src.gnome.org>2006-07-05 16:03:24 +0000
commit218218580d24095c6ae2fce611f3d1dd61fe4a0a (patch)
tree6d85503a9d86cb7bdbcfd3dde7e4b528ec0da2db /codegen
parente1286b8b08e35081d300c640ccbbe13e51ce02a4 (diff)
downloadpygtk-218218580d24095c6ae2fce611f3d1dd61fe4a0a.tar.gz
Add a dynamicnamespace option, refactor class registration
Diffstat (limited to 'codegen')
-rw-r--r--codegen/codegen.py103
-rw-r--r--codegen/override.py5
2 files changed, 64 insertions, 44 deletions
diff --git a/codegen/codegen.py b/codegen/codegen.py
index 347a8847..36790618 100644
--- a/codegen/codegen.py
+++ b/codegen/codegen.py
@@ -1210,8 +1210,9 @@ class SourceWriter:
wrapper.write_functions(self.prefix)
self.write_enums()
- self.write_extension_init()
- self.write_registers()
+ if not self.overrides.dynamicnamespace:
+ self.write_extension_init()
+ self.write_registers()
def write_headers(self):
self.fp.write('/* -- THIS FILE IS GENERATED - DO NOT EDIT */')
@@ -1346,24 +1347,8 @@ class SourceWriter:
self.fp.write(self.overrides.get_init() + '\n')
self.fp.resetline()
- def write_registers(self):
- for boxed in self.parser.boxes:
- self.fp.write(' pyg_register_boxed(d, "' + boxed.name +
- '", ' + boxed.typecode +
- ', &Py' + boxed.c_name +
- '_Type);\n')
- for pointer in self.parser.pointers:
- self.fp.write(' pyg_register_pointer(d, "' + pointer.name +
- '", ' + pointer.typecode +
- ', &Py' + pointer.c_name + '_Type);\n')
- for interface in self.parser.interfaces:
- self.fp.write(' pyg_register_interface(d, "' + interface.name +
- '", '+ interface.typecode + ', &Py' + interface.c_name +
- '_Type);\n')
- if interface.interface_info is not None:
- self.fp.write(' pyg_register_interface_info(%s, &%s);\n' %
- (interface.typecode, interface.interface_info))
+ def _get_classes(self):
objects = self.parser.objects[:]
pos = 0
while pos < len(objects):
@@ -1375,6 +1360,8 @@ class SourceWriter:
break
else:
pos = pos + 1
+
+ retval = []
for obj in objects:
if self.overrides.is_type_ignored(obj.c_name):
continue
@@ -1382,33 +1369,61 @@ class SourceWriter:
if obj.parent != None:
bases.append(obj.parent)
bases = bases + obj.implements
- if bases:
- self.fp.write(
- ' pygobject_register_class(d, "' + obj.c_name +
- '", ' + obj.typecode + ', &Py' + obj.c_name +
- '_Type, Py_BuildValue("(' + 'O' * len(bases) + ')", ' +
- string.join(map(lambda s: '&Py'+s+'_Type', bases), ', ') +
- '));\n')
- else:
- self.fp.write(
- ' pygobject_register_class(d, "' + obj.c_name +
- '", ' + obj.typecode + ', &Py' + obj.c_name +
- '_Type, NULL);\n')
- if obj.has_new_constructor_api:
- self.fp.write(
- ' pyg_set_object_has_new_constructor(%s);\n' %
- obj.typecode)
- else:
- print >> sys.stderr, (
- "Warning: Constructor for %s needs to be updated to new API\n"
- " See http://live.gnome.org/PyGTK_2fWhatsNew28"
- "#update-constructors") % obj.c_name
- if obj.class_init_func is not None:
- self.fp.write(
- ' pyg_register_class_init(%s, %s);\n' %
- (obj.typecode, obj.class_init_func))
+ retval.append((obj, bases))
+
+ return retval
+
+ def write_registers(self):
+ for boxed in self.parser.boxes:
+ self.fp.write(' pyg_register_boxed(d, "' + boxed.name +
+ '", ' + boxed.typecode +
+ ', &Py' + boxed.c_name +
+ '_Type);\n')
+ for pointer in self.parser.pointers:
+ self.fp.write(' pyg_register_pointer(d, "' + pointer.name +
+ '", ' + pointer.typecode +
+ ', &Py' + pointer.c_name + '_Type);\n')
+ for interface in self.parser.interfaces:
+ self.fp.write(' pyg_register_interface(d, "' + interface.name +
+ '", '+ interface.typecode + ', &Py' + interface.c_name +
+ '_Type);\n')
+ if interface.interface_info is not None:
+ self.fp.write(' pyg_register_interface_info(%s, &%s);\n' %
+ (interface.typecode, interface.interface_info))
+
+ for obj, bases in self._get_classes():
+ self._write_class(obj, bases)
self.fp.write('}\n')
+ def _write_class(self, obj, bases, indent=1):
+ indent_str = ' ' * (indent * 4)
+ if bases:
+ bases_str = (
+ 'Py_BuildValue("(' + 'O' * len(bases) + ')", ' +
+ string.join(map(lambda s: '&Py'+s+'_Type', bases), ', ') +
+ ')')
+ else:
+ bases_str = 'NULL'
+
+ self.fp.write(
+ indent_str + 'pygobject_register_class(d, "' + obj.c_name +
+ '", ' + obj.typecode + ', &Py' + obj.c_name +
+ '_Type, ' + bases_str + ');\n')
+
+ if obj.has_new_constructor_api:
+ self.fp.write(
+ indent_str + 'pyg_set_object_has_new_constructor(%s);\n' %
+ obj.typecode)
+ else:
+ print >> sys.stderr, (
+ "Warning: Constructor for %s needs to be updated to new API\n"
+ " See http://live.gnome.org/PyGTK_2fWhatsNew28"
+ "#update-constructors") % obj.c_name
+
+ if obj.class_init_func is not None:
+ self.fp.write(
+ indent_str + 'pyg_register_class_init(%s, %s);\n' %
+ (obj.typecode, obj.class_init_func))
def register_types(parser):
for boxed in parser.boxes:
diff --git a/codegen/override.py b/codegen/override.py
index 6f36ae19..c4d5ffa2 100644
--- a/codegen/override.py
+++ b/codegen/override.py
@@ -44,6 +44,7 @@ class Overrides:
self.defines = {}
self.functions = {}
self.newstyle_constructors = {}
+ self.dynamicnamespace = False
if filename:
self.handle_file(filename)
@@ -198,6 +199,10 @@ class Overrides:
"new-constructor GType"
gtype, = words[1:]
self.newstyle_constructors[gtype] = True
+ elif command == 'options':
+ for option in words[1:]:
+ if option == 'dynamicnamespace':
+ self.dynamicnamespace = True
def is_ignored(self, name):
if self.ignores.has_key(name):