diff options
author | Johan Dahlin <jdahlin@async.com.br> | 2008-04-23 01:28:27 +0000 |
---|---|---|
committer | Johan Dahlin <johan@src.gnome.org> | 2008-04-23 01:28:27 +0000 |
commit | 204aaf88530b238c5f8c3a468f1c1a55e8b3c4e7 (patch) | |
tree | d02963dbf8ad4fb25e7f50bc3718dc3735308eae | |
parent | d5e956f29e88455fd2ac1f0a413813cf266ce681 (diff) | |
download | gobject-introspection-204aaf88530b238c5f8c3a468f1c1a55e8b3c4e7.tar.gz |
Add support for Callbacks
2008-04-22 Johan Dahlin <jdahlin@async.com.br>
* giscanner/gidlwriter.py:
* giscanner/girwriter.py:
* giscanner/gobjecttreebuilder.py:
* giscanner/treebuilder.py:
Add support for Callbacks
svn path=/trunk/; revision=222
-rw-r--r-- | ChangeLog | 8 | ||||
-rw-r--r-- | TODO | 1 | ||||
-rw-r--r-- | giscanner/gidlwriter.py | 10 | ||||
-rw-r--r-- | giscanner/girwriter.py | 11 | ||||
-rw-r--r-- | giscanner/gobjecttreebuilder.py | 11 | ||||
-rw-r--r-- | giscanner/treebuilder.py | 32 |
6 files changed, 61 insertions, 12 deletions
@@ -1,3 +1,11 @@ +2008-04-22 Johan Dahlin <jdahlin@async.com.br> + + * giscanner/gidlwriter.py: + * giscanner/girwriter.py: + * giscanner/gobjecttreebuilder.py: + * giscanner/treebuilder.py: + Add support for Callbacks + 2008-04-22 Havoc Pennington <hp@pobox.com> * girepository/ginvoke.c (g_function_info_invoke): If a symbol is @@ -32,7 +32,6 @@ Repository Scanner ------ -- Callbacks - Virtual functions - Signals - Property.readable/writable, GLibProperty.blurb/nick diff --git a/giscanner/gidlwriter.py b/giscanner/gidlwriter.py index 8d637d9c..35fc521e 100644 --- a/giscanner/gidlwriter.py +++ b/giscanner/gidlwriter.py @@ -2,7 +2,7 @@ from __future__ import with_statement from .gobjecttreebuilder import (GLibBoxed, GLibEnum, GLibEnumMember, GLibFlags, GLibObject, GLibInterface) -from .treebuilder import Class, Enum, Function, Interface +from .treebuilder import Callback, Class, Enum, Function, Interface from .xmlwriter import XMLWriter @@ -29,6 +29,8 @@ class GIDLWriter(XMLWriter): self._write_class(node) elif isinstance(node, GLibBoxed): self._write_boxed(node) + elif isinstance(node, Callback): + self._write_callback(node) else: print 'WRITER: Unhandled node', node @@ -116,3 +118,9 @@ class GIDLWriter(XMLWriter): attrs = [('name', prop.name), ('prop', prop.type)] self.write_tag('property', attrs) + + def _write_callback(self, func): + attrs = [('name', func.name)] + with self.tagcontext('callback', attrs): + self._write_return_type(func.retval) + self._write_parameters(func.parameters) diff --git a/giscanner/girwriter.py b/giscanner/girwriter.py index 10a7ed34..54fa262c 100644 --- a/giscanner/girwriter.py +++ b/giscanner/girwriter.py @@ -2,7 +2,7 @@ from __future__ import with_statement from .gobjecttreebuilder import (GLibBoxed, GLibEnum, GLibEnumMember, GLibFlags, GLibObject, GLibInterface) -from .treebuilder import Class, Enum, Function, Interface +from .treebuilder import Callback, Class, Enum, Function, Interface from .xmlwriter import XMLWriter @@ -35,6 +35,8 @@ class GIRWriter(XMLWriter): self._write_class(node) elif isinstance(node, GLibBoxed): self._write_boxed(node) + elif isinstance(node, Callback): + self._write_callback(node) else: print 'WRITER: Unhandled node', node @@ -125,3 +127,10 @@ class GIRWriter(XMLWriter): attrs = [('name', prop.name), ('prop', prop.type)] self.write_tag('property', attrs) + + + def _write_callback(self, callback): + attrs = [('name', callback.name)] + with self.tagcontext('callback', attrs): + self._write_return_type(callback.retval) + self._write_parameters(callback.parameters) diff --git a/giscanner/gobjecttreebuilder.py b/giscanner/gobjecttreebuilder.py index 320ddcf2..7510c87f 100644 --- a/giscanner/gobjecttreebuilder.py +++ b/giscanner/gobjecttreebuilder.py @@ -4,8 +4,8 @@ import os from . import cgobject from .odict import odict -from .treebuilder import (Class, Enum, Function, Interface, Member, Property, - Struct) +from .treebuilder import (Callback, Class, Enum, Function, Interface, + Member, Property, Struct) # Copied from h2defs.py _upperstr_pat1 = re.compile(r'([^A-Z])([A-Z])') @@ -166,8 +166,10 @@ class GObjectTreeBuilder(object): self._parse_function(node) elif isinstance(node, Struct): self._parse_struct(node) + elif isinstance(node, Callback): + self._parse_callback(node) else: - print 'Unhandled node:', node + print 'GOBJECT BUILDER: Unhandled node:', node def _parse_enum(self, enum): enum.name = self._strip_namespace_object(enum.name) @@ -263,6 +265,9 @@ class GObjectTreeBuilder(object): return self._add_attribute(struct) + def _parse_callback(self, callback): + self._add_attribute(callback) + def _introspect_type(self, type_id, symbol): fundamental_type_id = cgobject.type_fundamental(type_id) if (fundamental_type_id == cgobject.TYPE_ENUM or diff --git a/giscanner/treebuilder.py b/giscanner/treebuilder.py index 173dbd63..f2ee906a 100644 --- a/giscanner/treebuilder.py +++ b/giscanner/treebuilder.py @@ -108,6 +108,17 @@ class Property(Node): self.name, self.type, self.value) +class Callback(Node): + def __init__(self, name, retval, parameters): + self.name = name + self.retval = retval + self.parameters = parameters + + def __repr__(self): + return 'Callback(%r, %r, %r)' % ( + self.name, self.retval, self.parameters) + + class TreeBuilder(object): def __init__(self, generator): self.generator = generator @@ -134,7 +145,11 @@ class TreeBuilder(object): if stype == giscanner.CSYMBOL_TYPE_FUNCTION: return self._create_function(symbol) elif stype == giscanner.CSYMBOL_TYPE_TYPEDEF: - return self._traverse_one(symbol, symbol.base_type.type) + if (symbol.base_type.type == giscanner.CTYPE_POINTER and + symbol.base_type.base_type.type == giscanner.CTYPE_FUNCTION): + return self._create_callback(symbol) + else: + return self._traverse_one(symbol, symbol.base_type.type) elif stype == giscanner.CSYMBOL_TYPE_STRUCT: return self._create_struct(symbol) elif stype == giscanner.CSYMBOL_TYPE_ENUM: @@ -151,12 +166,9 @@ class TreeBuilder(object): return Enum(symbol.ident, members) def _create_function(self, symbol): - parameters = [] - for child in symbol.base_type.child_list: - parameters.append(self._create_parameter(child)) - + parameters = self._create_parameters(symbol.base_type) retval = Return(self._create_source_type(symbol.base_type.base_type)) - return Function(symbol.ident, retval, parameters, symbol.ident) + return Function(symbol.ident, retval, list(parameters), symbol.ident) def _create_source_type(self, source_type): if source_type.type == giscanner.CTYPE_VOID: @@ -172,6 +184,10 @@ class TreeBuilder(object): value = '???' return value + def _create_parameters(self, base_type): + for child in base_type.child_list: + yield self._create_parameter(child) + def _create_parameter(self, symbol): return Parameter(symbol.ident, self._create_source_type(symbol.base_type)) @@ -179,3 +195,7 @@ class TreeBuilder(object): def _create_struct(self, symbol): return Struct(symbol.ident) + def _create_callback(self, symbol): + parameters = self._create_parameters(symbol.base_type.base_type) + retval = Return(self._create_source_type(symbol.base_type.base_type.base_type)) + return Callback(symbol.ident, retval, list(parameters)) |