gobject-introspection r183 - in trunk: . giscanner tools



Author: johan
Date: Mon Apr 21 04:18:56 2008
New Revision: 183
URL: http://svn.gnome.org/viewvc/gobject-introspection?rev=183&view=rev

Log:
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



Modified:
   trunk/ChangeLog
   trunk/giscanner/gidlwriter.py
   trunk/giscanner/gobjecttreebuilder.py
   trunk/giscanner/treebuilder.py
   trunk/tools/g-ir-scanner

Modified: trunk/giscanner/gidlwriter.py
==============================================================================
--- trunk/giscanner/gidlwriter.py	(original)
+++ trunk/giscanner/gidlwriter.py	Mon Apr 21 04:18:56 2008
@@ -31,13 +31,17 @@
             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()

Modified: trunk/giscanner/gobjecttreebuilder.py
==============================================================================
--- trunk/giscanner/gobjecttreebuilder.py	(original)
+++ trunk/giscanner/gobjecttreebuilder.py	Mon Apr 21 04:18:56 2008
@@ -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 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 @@
 
     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 @@
             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 @@
             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
 

Modified: trunk/giscanner/treebuilder.py
==============================================================================
--- trunk/giscanner/treebuilder.py	(original)
+++ trunk/giscanner/treebuilder.py	Mon Apr 21 04:18:56 2008
@@ -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 @@
         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 @@
             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 @@
         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
 

Modified: trunk/tools/g-ir-scanner
==============================================================================
--- trunk/tools/g-ir-scanner	(original)
+++ trunk/tools/g-ir-scanner	Mon Apr 21 04:18:56 2008
@@ -51,7 +51,7 @@
         ss.parse_file(filename)
     ss.parse_macros()
 
-    builder = GObjectTreeBuilder()
+    builder = GObjectTreeBuilder(options.namespace)
     builder.load_library(options.library)
     builder.parse(TreeBuilder(ss).get_nodes())
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]