[pypy-svn] r70515 - in pypy/branch/separate-compilation/pypy/translator: . cli cli/test

afa at codespeak.net afa at codespeak.net
Mon Jan 11 21:12:55 CET 2010


Author: afa
Date: Mon Jan 11 21:12:53 2010
New Revision: 70515

Modified:
   pypy/branch/separate-compilation/pypy/translator/cli/carbonpython.py
   pypy/branch/separate-compilation/pypy/translator/cli/cts.py
   pypy/branch/separate-compilation/pypy/translator/cli/function.py
   pypy/branch/separate-compilation/pypy/translator/cli/test/test_carbonpython.py
   pypy/branch/separate-compilation/pypy/translator/separate.py
Log:
Start sharing code between CarbonPython and the C backend.


Modified: pypy/branch/separate-compilation/pypy/translator/cli/carbonpython.py
==============================================================================
--- pypy/branch/separate-compilation/pypy/translator/cli/carbonpython.py	(original)
+++ pypy/branch/separate-compilation/pypy/translator/cli/carbonpython.py	Mon Jan 11 21:12:53 2010
@@ -13,6 +13,7 @@
 
 from pypy.translator.driver import TranslationDriver
 from pypy.translator.cli.entrypoint import DllEntryPoint
+from pypy.translator.separate import export, is_exported
 
 class DllDef:
     def __init__(self, name, namespace, functions=[], dontmangle=True, isnetmodule=False):
@@ -36,39 +37,15 @@
         # add all functions to the appropriate namespace
         if self.namespace:
             for func, _ in self.functions:
-                if not hasattr(func, '_namespace_'):
-                    func._namespace_ = self.namespace
+                if not hasattr(func, 'namespace'):
+                    func.namespace = self.namespace
         self.driver.proceed(['compile_cli'])
 
-class export(object):
-    def __new__(self, *args, **kwds):
-        if len(args) == 1 and isinstance(args[0], types.FunctionType):
-            func = args[0]
-            func._inputtypes_ = ()
-            return func
-        return object.__new__(self, *args, **kwds)
-    
-    def __init__(self, *args, **kwds):
-        self.inputtypes = args
-        self.namespace = kwds.pop('namespace', None)
-        if len(kwds) > 0:
-            raise TypeError, "unexpected keyword argument: '%s'" % kwds.keys()[0]
-
-    def __call__(self, func):
-        func._inputtypes_ = self.inputtypes
-        if self.namespace is not None:
-            func._namespace_ = self.namespace
-        return func
-
-def is_exported(obj):
-    return isinstance(obj, (types.FunctionType, types.UnboundMethodType)) \
-           and hasattr(obj, '_inputtypes_')
-
 def collect_entrypoints(dic):
     entrypoints = []
     for item in dic.itervalues():
         if is_exported(item):
-            entrypoints.append((item, item._inputtypes_))
+            entrypoints.append((item, item.argtypes))
         elif isinstance(item, types.ClassType) or isinstance(item, type):
             entrypoints += collect_class_entrypoints(item)
     return entrypoints
@@ -81,10 +58,10 @@
     except AttributeError:
         return []
 
-    entrypoints = [(wrap_init(cls, __init__), __init__._inputtypes_)]
+    entrypoints = [(wrap_init(cls, __init__), __init__.argtypes)]
     for item in cls.__dict__.itervalues():
         if item is not __init__.im_func and is_exported(item):
-            inputtypes = (cls,) + item._inputtypes_
+            inputtypes = (cls,) + item.argtypes
             entrypoints.append((wrap_method(item), inputtypes))
     return entrypoints
 
@@ -126,7 +103,7 @@
     elif dllname.endswith('.dll'):
         dllname, _ = os.path.splitext(dllname)
     module = new.module(dllname)
-    namespace = module.__dict__.get('_namespace_', dllname)
+    namespace = module.__dict__.get('namespace', dllname)
     sys.path.insert(0, dirname)
     execfile(filename, module.__dict__)
     sys.path.pop(0)

Modified: pypy/branch/separate-compilation/pypy/translator/cli/cts.py
==============================================================================
--- pypy/branch/separate-compilation/pypy/translator/cli/cts.py	(original)
+++ pypy/branch/separate-compilation/pypy/translator/cli/cts.py	Mon Jan 11 21:12:53 2010
@@ -318,7 +318,7 @@
     def graph_to_signature(self, graph, is_method = False, func_name = None):
         func_name = func_name or graph.name
         func_name = self.escape_name(func_name)
-        namespace = getattr(graph.func, '_namespace_', None)
+        namespace = getattr(graph.func, 'namespace', None)
         if namespace:
             func_name = '%s::%s' % (namespace, func_name)
 

Modified: pypy/branch/separate-compilation/pypy/translator/cli/function.py
==============================================================================
--- pypy/branch/separate-compilation/pypy/translator/cli/function.py	(original)
+++ pypy/branch/separate-compilation/pypy/translator/cli/function.py	Mon Jan 11 21:12:53 2010
@@ -24,7 +24,7 @@
         if hasattr(self.db.genoo, 'exceptiontransformer'):
             self.auto_propagate_exceptions = False
         
-        namespace = getattr(self.graph.func, '_namespace_', None)
+        namespace = getattr(self.graph.func, 'namespace', None)
         if namespace:
             if '.' in namespace:
                 self.namespace, self.classname = namespace.rsplit('.', 1)

Modified: pypy/branch/separate-compilation/pypy/translator/cli/test/test_carbonpython.py
==============================================================================
--- pypy/branch/separate-compilation/pypy/translator/cli/test/test_carbonpython.py	(original)
+++ pypy/branch/separate-compilation/pypy/translator/cli/test/test_carbonpython.py	Mon Jan 11 21:12:53 2010
@@ -77,11 +77,12 @@
         def baz():
             pass
 
-        assert foo._inputtypes_ == (int, float)
+        assert foo.argtypes == (int, float)
         assert not hasattr(foo, '_namespace_')
-        assert bar._inputtypes_ == (int, float)
-        assert bar._namespace_ == 'test'
-        assert baz._inputtypes_ == ()
+        assert bar.argtypes == (int, float)
+        assert bar.namespace == 'test'
+        assert baz.exported
+        assert not hasattr(baz, 'argtypes')
 
     def test_collect_entrypoints(self):
         @export(int, float)
@@ -99,7 +100,7 @@
                 pass
             
         class MyClass:
-            @export
+            @export()
             def __init__(self):
                 pass
             @export(int)
@@ -134,7 +135,7 @@
         assert res == 42
 
     def test_export_cliclass(self):
-        py.test.skip('it fails every other day on builbot, no clue why')
+        #py.test.skip('it fails every other day on builbot, no clue why')
         from pypy.translator.cli.dotnet import CLR
         
         @export(CLR.System.Collections.ArrayList, int)
@@ -152,7 +153,7 @@
         assert res == 42
 
     def test_compile_dll(self):
-        py.test.skip('This test fails every other day. No clue why :-(')
+        #py.test.skip('This test fails every other day. No clue why :-(')
         cwd, _ = os.path.split(__file__)
         mylib_py = os.path.join(cwd, 'mylib.py')
         compile_dll(mylib_py, copy_dll=False)

Modified: pypy/branch/separate-compilation/pypy/translator/separate.py
==============================================================================
--- pypy/branch/separate-compilation/pypy/translator/separate.py	(original)
+++ pypy/branch/separate-compilation/pypy/translator/separate.py	Mon Jan 11 21:12:53 2010
@@ -24,9 +24,11 @@
             return decorated
         return object.__new__(cls, *args, **kwds)
 
-    def __init__(self, *args, **kwargs):
+    def __init__(self, *args, **kwds):
         self.argtypes = args
-        self.namespace = kwargs.get('namespace')
+        self.namespace = kwds.pop('namespace', None)
+        if kwds:
+            raise TypeError("unexpected keyword arguments: %s" % kwds.keys())
 
     def __call__(self, func):
         func.exported = True
@@ -35,3 +37,8 @@
         if self.namespace is not None:
             func.namespace = self.namespace
         return func
+
+def is_exported(obj):
+    return (isinstance(obj, (types.FunctionType, types.UnboundMethodType))
+            and getattr(obj, 'exported', False))
+



More information about the Pypy-commit mailing list