[pypy-svn] r25536 - in pypy/branch/stacklesscfg/pypy/translator/stackless: . test

hpk at codespeak.net hpk at codespeak.net
Sat Apr 8 12:14:28 CEST 2006


Author: hpk
Date: Sat Apr  8 12:14:27 2006
New Revision: 25536

Modified:
   pypy/branch/stacklesscfg/pypy/translator/stackless/test/test_transform.py
   pypy/branch/stacklesscfg/pypy/translator/stackless/transform.py
Log:
(hpk, mwh) intermediate checkins with some bugs fixed but C not compiling ... stay tuned



Modified: pypy/branch/stacklesscfg/pypy/translator/stackless/test/test_transform.py
==============================================================================
--- pypy/branch/stacklesscfg/pypy/translator/stackless/test/test_transform.py	(original)
+++ pypy/branch/stacklesscfg/pypy/translator/stackless/test/test_transform.py	Sat Apr  8 12:14:27 2006
@@ -1,8 +1,13 @@
+import py
+import os
 from pypy.translator.stackless.transform import StacklessTransfomer
+from pypy.translator.c.genc import CStandaloneBuilder
 from pypy.rpython.memory.gctransform import varoftype
 from pypy.rpython.lltypesystem import lltype, llmemory
 from pypy.translator.translator import TranslationContext, graphof
 from pypy.objspace.flow.model import checkgraph
+from pypy.annotation import model as annmodel
+from pypy.annotation.listdef import ListDef 
 from pypy import conftest
 
 ## def test_frame_types():
@@ -32,18 +37,32 @@
             raise UnwindException # XXX or so
     def g(x):
         check(x)
-        return 2
+        return x + 1
     def example(x):
-        return g(x) + x + 1
+        return g(x) + 1
+    res = run_stackless_function(example, example, g)
+    assert res == "6"
+    
+def run_stackless_function(fn, *stacklessfuncs):
+    def entry_point(argv):
+        os.write(1, str(fn(len(argv)))+'\n')
+        return 0
+
+    s_list_of_strings = annmodel.SomeList(ListDef(None, annmodel.SomeString()))
+    s_list_of_strings.listdef.resize()
     t = TranslationContext()
-    t.buildannotator().build_types(example, [int])
+    t.buildannotator().build_types(entry_point, [s_list_of_strings])
     t.buildrtyper().specialize()
+
     st = StacklessTransfomer(t)
-    st.transform_graph(graphof(t, example))
-    st.transform_graph(graphof(t, g))
-    for graph in t.graphs: 
-        checkgraph(graph) # XXX
-    example_graph = graphof(t, example)
+    for func in stacklessfuncs: 
+        graph = graphof(t, func)
+        st.transform_graph(graph) 
+        checkgraph(graph) 
     if conftest.option.view:
         t.view()
-    
+
+    cbuilder = CStandaloneBuilder(t, entry_point)
+    cbuilder.generate_source()
+    cbuilder.compile()
+    return cbuilder.cmdexec('')

Modified: pypy/branch/stacklesscfg/pypy/translator/stackless/transform.py
==============================================================================
--- pypy/branch/stacklesscfg/pypy/translator/stackless/transform.py	(original)
+++ pypy/branch/stacklesscfg/pypy/translator/stackless/transform.py	Sat Apr  8 12:14:27 2006
@@ -1,5 +1,5 @@
 from pypy.rpython.lltypesystem import lltype, llmemory
-from pypy.rpython import rarithmetic, rclass
+from pypy.rpython import rarithmetic, rclass, rmodel
 from pypy.translator.backendopt import support
 from pypy.objspace.flow import model
 from pypy.rpython.memory.gctransform import varoftype
@@ -120,7 +120,7 @@
         assert self.curr_graph is None
         self.curr_graph = graph
         
-        for block in graph.iterblocks():
+        for block in list(graph.iterblocks()):
             self.transform_block(block)
         if self.resume_points:
             XXX
@@ -141,17 +141,18 @@
                 link = block.exits[0]
 
                 var_unwind_exception = varoftype(evalue)
-                
+               
+                args = [v for v in link.args if v is not op.result]
                 save_block = self.generate_save_block(
-                                link.args, var_unwind_exception)
+                                args, var_unwind_exception)
 
-                newlink = model.Link(link.args + [var_unwind_exception], 
+                newlink = model.Link(args + [var_unwind_exception], 
                                      save_block, code.UnwindException)
                 block.exitswitch = model.c_last_exception
                 newlink.last_exception = model.Constant(code.UnwindException) 
                 newlink.last_exc_value = var_unwind_exception 
                 block.recloseblock(link, newlink) # exits.append(newlink)
-                self.translator.rtyper._convert_link(block, newlink)
+                self._convertlink(block, newlink)
     # ARGH ... 
 
                 block = after_block
@@ -159,20 +160,34 @@
             else:
                 i += 1
 
+    def _convertlink(self, block, link):
+        rtyper = self.translator.rtyper
+        if link.exitcase is not None:
+            if isinstance(block.exitswitch, model.Variable):
+                r_case = rtyper.bindingrepr(block.exitswitch)
+            else:
+                assert block.exitswitch == model.c_last_exception
+                r_case = rclass.get_type_repr(rtyper)
+            link.llexitcase = r_case.convert_const(link.exitcase)
+        else:
+            link.llexitcase = None
+
     def generate_save_block(self, varstosave, var_unwind_exception):
-        edata = self.translator.rtyper.getexceptiondata()
+        rtyper = self.translator.rtyper
+        edata = rtyper.getexceptiondata()
         etype = edata.lltype_of_exception_type
         evalue = edata.lltype_of_exception_value
         inputargs = [copyvar(self.translator, v) for v in varstosave]
-        var_unwind_exception = varoftype(getinstancerepr(self.translator.rtyper,
+        unwind_exception_type = getinstancerepr(rtyper,
             self.translator.annotator.bookkeeper.getuniqueclassdef(
-                code.UnwindException)).lowleveltype)
+                code.UnwindException)).lowleveltype
+        var_unwind_exception = copyvar(self.translator, var_unwind_exception) 
 
         fields = []
         for i, v in enumerate(varstosave):
             if v.concretetype is not lltype.Void:
                 fields.append(('field_%d'%(i,), v.concretetype))
-        frame_type = lltype.Struct("S",
+        frame_type = lltype.GcStruct("S",
                             ('header', STATE_HEADER),
                             *fields)
         
@@ -191,24 +206,30 @@
 ##             state.header.state = XXX
 ##             u.frame = state.header
         header_var = varoftype(lltype.Ptr(STATE_HEADER))
+        var_exc = varoftype(unwind_exception_type)
+        saveops.append(model.SpaceOperation("cast_pointer", [var_unwind_exception], 
+                                            var_exc))
+    
         saveops.append(model.SpaceOperation("cast_pointer", [frame_state_var], header_var))
         var_unwind_exception_frame = varoftype(lltype.Ptr(STATE_HEADER))
-        saveops.append(model.SpaceOperation("getfield",
-                                            [var_unwind_exception, model.Constant("frame", lltype.Void)],
-                                            var_unwind_exception_frame))
-        saveops.append(model.SpaceOperation("setfield",
-                                            [header_var, model.Constant("f_back", lltype.Void), var_unwind_exception_frame],
-                                            varoftype(lltype.Void)))
-        saveops.append(model.SpaceOperation("setfield",
-                                            [var_unwind_exception, model.Constant("frame", lltype.Void)],
-                                            varoftype(lltype.Void)))
-
-        save_state_block.closeblock(model.Link([model.Constant(code.UnwindException), 
-                                                var_unwind_exception], 
+        # XXX 
+        saveops.append(model.SpaceOperation(
+            "getfield", [var_exc, model.Constant("frame_bottom", lltype.Void)],
+            var_unwind_exception_frame))
+        saveops.append(model.SpaceOperation(
+            "setfield", [header_var, model.Constant("f_back", lltype.Void), 
+                         var_unwind_exception_frame],
+            varoftype(lltype.Void)))
+        saveops.append(model.SpaceOperation(
+            "setfield", [var_exc, model.Constant("frame", lltype.Void), header_var],
+            varoftype(lltype.Void)))
+
+        s_exc = self.translator.annotator.bookkeeper.immutablevalue(code.UnwindException)
+        r_exc = rtyper.getrepr(s_exc) 
+        c_unwindexception = rmodel.inputconst(r_exc, code.UnwindException)
+        save_state_block.closeblock(model.Link([c_unwindexception, var_exc], 
                                                self.curr_graph.exceptblock))
-
         return save_state_block
-
         
 
     def generate_saveops(self, frame_state_var, varstosave):



More information about the Pypy-commit mailing list