diff options
author | Johan Dahlin <jdahlin@async.com.br> | 2008-04-21 04:18:56 +0000 |
---|---|---|
committer | Johan Dahlin <johan@src.gnome.org> | 2008-04-21 04:18:56 +0000 |
commit | 98f7a1583951151f7db3982e181f4b52c3a4cd4b (patch) | |
tree | 2f611f919e4cb4a85c026e1d2f6e23bd576f6cfc | |
parent | f7cda3296db97fafbe011b3fff2108849f23d0a5 (diff) | |
download | gobject-introspection-98f7a1583951151f7db3982e181f4b52c3a4cd4b.tar.gz |
Resolve libtool .la files. Strip name spaces for methods. Add function
2008-04-21 Johan Dahlin <jdahlin@async.com.br>
* giscanner/gidlwriter.py:
* giscanner/gobjecttreebuilder.py:
* giscanner/treebuilder.py:
* tools/g-ir-scanner:
Resolve libtool .la files.
Strip name spaces for methods.
Add function symbols
svn path=/trunk/; revision=183
-rw-r--r-- | ChangeLog | 10 | ||||
-rw-r--r-- | giscanner/gidlwriter.py | 8 | ||||
-rw-r--r-- | giscanner/gobjecttreebuilder.py | 45 | ||||
-rw-r--r-- | giscanner/treebuilder.py | 13 | ||||
-rwxr-xr-x | tools/g-ir-scanner | 2 |
5 files changed, 60 insertions, 18 deletions
@@ -1,3 +1,13 @@ +2008-04-21 Johan Dahlin <jdahlin@async.com.br> + + * giscanner/gidlwriter.py: + * giscanner/gobjecttreebuilder.py: + * giscanner/treebuilder.py: + * tools/g-ir-scanner: + Resolve libtool .la files. + Strip name spaces for methods. + Add function symbols + 2008-04-20 Johan Dahlin <jdahlin@async.com.br> * giscanner/cgobject.py: diff --git a/giscanner/gidlwriter.py b/giscanner/gidlwriter.py index 018f0a69..6a2049b8 100644 --- a/giscanner/gidlwriter.py +++ b/giscanner/gidlwriter.py @@ -31,13 +31,17 @@ class GIDLWriter(XMLWriter): print 'WRITER: Unhandled node', node def _write_function(self, func): - self.push_tag('function', [('name', func.name)]) + attrs = [('name', func.name), + ('symbol', func.symbol)] + self.push_tag('function', attrs) self._write_return_type(func.retval) self._write_parameters(func.parameters) self.pop_tag() def _write_method(self, method): - self.push_tag('method', [('name', method.name)]) + attrs = [('name', method.name), + ('symbol', method.symbol)] + self.push_tag('method', attrs) self._write_return_type(method.retval) self._write_parameters(method.parameters) self.pop_tag() diff --git a/giscanner/gobjecttreebuilder.py b/giscanner/gobjecttreebuilder.py index 073f5011..bec158b9 100644 --- a/giscanner/gobjecttreebuilder.py +++ b/giscanner/gobjecttreebuilder.py @@ -1,10 +1,21 @@ import ctypes +import os from giscanner import cgobject from giscanner.treebuilder import Class, Enum, Function, Member, Struct from giscanner.odict import odict +def resolve_libtool(libname): + data = open(libname).read() + pos = data.find('dlname=') + pos2 = data[pos:].find('\n') + real = data[pos:pos+pos2][8:-1] + libname = os.path.join(os.path.dirname(libname), + '.libs', real) + return libname + + class GLibEnum(Enum): def __init__(self, name, members, get_type): Enum.__init__(self, name, members) @@ -35,21 +46,22 @@ class GLibObject(Class): class GObjectTreeBuilder(object): - def __init__(self): - self.nodes = [] - self._namespace = odict() + def __init__(self, namespace_name): + self._namespace_name = namespace_name + self._output_ns = odict() self._library = None # Public API def get_nodes(self): - return self._namespace.values() + return self._output_ns.values() def load_library(self, libname): + if libname.endswith('.la'): + libname = resolve_libtool(libname) self._library = ctypes.cdll.LoadLibrary(libname) def parse(self, nodes): - nodes = list(nodes) for node in nodes: self._parse_node(node) @@ -57,9 +69,21 @@ class GObjectTreeBuilder(object): def _add_attribute(self, node, replace=False): node_name = node.name - if node_name in self._namespace and not replace: + if node_name in self._output_ns and not replace: return - self._namespace[node_name] = node + self._output_ns[node_name] = node + + def _get_attribute(self, name): + return self._output_ns.get(name) + + def _strip_namespace(self, name): + # gtk_init_check -> init_check + prefix = self._namespace_name.lower() + '_' + lower = name.lower() + if lower.startswith(prefix): + name = name[len(prefix):] + + return name def _call_get_type_function(self, symbol_name): func = getattr(self._library, symbol_name) @@ -85,8 +109,9 @@ class GObjectTreeBuilder(object): return elif self._parse_method(func): return - else: - self._add_attribute(func) + + func.name = self._strip_namespace(func.name) + self._add_attribute(func) def _parse_get_type_function(self, func): # GType *_get_type(void) @@ -112,7 +137,7 @@ class GObjectTreeBuilder(object): return False object_name = first_arg.replace('*', '') - class_ = self._namespace.get(object_name, None) + class_ = self._get_attribute(object_name) if class_ is None or not isinstance(class_, GLibObject): return False diff --git a/giscanner/treebuilder.py b/giscanner/treebuilder.py index 19413aa2..b6241a81 100644 --- a/giscanner/treebuilder.py +++ b/giscanner/treebuilder.py @@ -1,17 +1,20 @@ import giscanner + class Node(object): pass class Function(Node): - def __init__(self, name, retval, parameters): + def __init__(self, name, retval, parameters, symbol): self.name = name self.retval = retval self.parameters = parameters + self.symbol = symbol def __repr__(self): - return 'Function(%r, %r, %r)' % (self.name, self.retval, self.parameters) + return 'Function(%r, %r, %r)' % (self.name, self.retval, + self.parameters) class Parameter(Node): @@ -96,7 +99,7 @@ class TreeBuilder(object): elif stype == giscanner.CSYMBOL_TYPE_ENUM: return self._create_enum(symbol) else: - print 'unhandled symbol', symbol.type + print 'BUILDER: unhandled symbol', symbol.type def _create_enum(self, symbol): members = [] @@ -112,7 +115,7 @@ class TreeBuilder(object): parameters.append(self._create_parameter(child)) retval = Return(self._create_source_type(symbol.base_type.base_type)) - return Function(symbol.ident, retval, parameters) + return Function(symbol.ident, retval, parameters, symbol.ident) def _create_source_type(self, source_type): if source_type.type == giscanner.CTYPE_VOID: @@ -124,7 +127,7 @@ class TreeBuilder(object): elif source_type.type == giscanner.CTYPE_POINTER: value = self._create_source_type(source_type.base_type) + '*' else: - print 'Unhandled source type: %d' % (source_type.type,) + print 'BUILDER: Unhandled source type: %d' % (source_type.type,) value = '???' return value diff --git a/tools/g-ir-scanner b/tools/g-ir-scanner index 5aab0fc9..be9f4fd7 100755 --- a/tools/g-ir-scanner +++ b/tools/g-ir-scanner @@ -51,7 +51,7 @@ def main(args): ss.parse_file(filename) ss.parse_macros() - builder = GObjectTreeBuilder() + builder = GObjectTreeBuilder(options.namespace) builder.load_library(options.library) builder.parse(TreeBuilder(ss).get_nodes()) |