[pypy-svn] r22747 - in pypy/dist/pypy/translator/c: . test

mwh at codespeak.net mwh at codespeak.net
Fri Jan 27 18:02:09 CET 2006


Author: mwh
Date: Fri Jan 27 18:02:06 2006
New Revision: 22747

Added:
   pypy/dist/pypy/translator/c/newfuncgen.py
      - copied unchanged from r22720, pypy/dist/pypy/translator/c/funcgen.py
   pypy/dist/pypy/translator/c/test/test_newgc.py   (contents, props changed)
Modified:
   pypy/dist/pypy/translator/c/genc.py
   pypy/dist/pypy/translator/c/node.py
Log:
(cfbolz,mwh)
hacks towards being able to use a custom function code generator,
the idea being to make this code generator work with the new style
of handling gc operations.


Modified: pypy/dist/pypy/translator/c/genc.py
==============================================================================
--- pypy/dist/pypy/translator/c/genc.py	(original)
+++ pypy/dist/pypy/translator/c/genc.py	Fri Jan 27 18:02:06 2006
@@ -19,12 +19,14 @@
     _compiled = False
     symboltable = None
     stackless = False
+    use_new_funcgen = False
     
-    def __init__(self, translator, entrypoint, gcpolicy=None, libraries=None, thread_enabled=False):
+    def __init__(self, translator, entrypoint, gcpolicy=None, libraries=None, thread_enabled=False, use_new_funcgen=False):
         self.translator = translator
         self.entrypoint = entrypoint
         self.gcpolicy = gcpolicy
         self.thread_enabled = thread_enabled
+        self.use_new_funcgen = use_new_funcgen
 
         if libraries is None:
             libraries = []
@@ -38,6 +40,7 @@
         if self.stackless:
             from pypy.translator.c.stackless import StacklessData
             db.stacklessdata = StacklessData(db)
+        db.use_new_funcgen = self.use_new_funcgen
 
         # we need a concrete gcpolicy to do this
         self.libraries += db.gcpolicy.gc_libraries()

Modified: pypy/dist/pypy/translator/c/node.py
==============================================================================
--- pypy/dist/pypy/translator/c/node.py	(original)
+++ pypy/dist/pypy/translator/c/node.py	Fri Jan 27 18:02:06 2006
@@ -5,6 +5,7 @@
      parentlink, Ptr, PyObject, Void, OpaqueType, Float, \
      RuntimeTypeInfo, getRuntimeTypeInfo, Char
 from pypy.translator.c.funcgen import FunctionCodeGenerator
+from pypy.translator.c.newfuncgen import FunctionCodeGenerator as NewFunctionCodeGenerator
 from pypy.translator.c.external import CExternalFunctionCodeGenerator
 from pypy.translator.c.support import USESLOTS # set to False if necessary while refactoring
 from pypy.translator.c.support import cdecl, somelettersfrom, c_string_constant
@@ -548,8 +549,11 @@
     elif hasattr(fnobj, 'graph'):
         cpython_exc = getattr(fnobj, 'exception_policy', None) == "CPython"
         if hasattr(db, 'stacklessdata'):
+            assert not db.use_new_funcgen, "can't use stackless with the new funcgen yet"
             from pypy.translator.c.stackless import SlpFunctionCodeGenerator
             gencls = SlpFunctionCodeGenerator
+        elif db.use_new_funcgen:
+            gencls = NewFunctionCodeGenerator
         else:
             gencls = FunctionCodeGenerator
         return gencls(fnobj.graph, db, cpython_exc, functionname)

Added: pypy/dist/pypy/translator/c/test/test_newgc.py
==============================================================================
--- (empty file)
+++ pypy/dist/pypy/translator/c/test/test_newgc.py	Fri Jan 27 18:02:06 2006
@@ -0,0 +1,29 @@
+import autopath
+import sys
+import py
+from py.test import raises
+
+from pypy.translator.tool.cbuild import skip_missing_compiler
+from pypy.translator.translator import TranslationContext
+from pypy.translator.c import genc
+
+from pypy.rpython.memory.gctransform import GCTransformer
+
+def compile_func(fn, inputtypes):
+    t = TranslationContext()
+    t.buildannotator().build_types(fn, inputtypes)
+    t.buildrtyper().specialize()
+#    GCTransformer(t.graphs).transform()
+    
+    builder = genc.CExtModuleBuilder(t, fn, use_new_funcgen=True)
+    builder.generate_source()
+    skip_missing_compiler(builder.compile)
+    builder.import_module()
+    return builder.get_entry_point()
+
+
+def test_something():
+    def f():
+        return 1
+    fn = compile_func(f, [])
+    assert fn() == 1



More information about the Pypy-commit mailing list