summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohan Dahlin <jdahlin@async.com.br>2008-04-21 04:18:56 +0000
committerJohan Dahlin <johan@src.gnome.org>2008-04-21 04:18:56 +0000
commit98f7a1583951151f7db3982e181f4b52c3a4cd4b (patch)
tree2f611f919e4cb4a85c026e1d2f6e23bd576f6cfc
parentf7cda3296db97fafbe011b3fff2108849f23d0a5 (diff)
downloadgobject-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--ChangeLog10
-rw-r--r--giscanner/gidlwriter.py8
-rw-r--r--giscanner/gobjecttreebuilder.py45
-rw-r--r--giscanner/treebuilder.py13
-rwxr-xr-xtools/g-ir-scanner2
5 files changed, 60 insertions, 18 deletions
diff --git a/ChangeLog b/ChangeLog
index 7828ef97..a2071359 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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())