[pypy-svn] r28193 - in pypy/dist/pypy: rpython translator/stackless translator/stackless/test

mwh at codespeak.net mwh at codespeak.net
Sat Jun 3 19:42:46 CEST 2006


Author: mwh
Date: Sat Jun  3 19:42:39 2006
New Revision: 28193

Modified:
   pypy/dist/pypy/rpython/rstack.py
   pypy/dist/pypy/translator/stackless/code.py
   pypy/dist/pypy/translator/stackless/test/test_resume_point.py
   pypy/dist/pypy/translator/stackless/transform.py
Log:
(mwh, pedronis)
code and test for resume_state_invoke(blah, blah, returns=int).


Modified: pypy/dist/pypy/rpython/rstack.py
==============================================================================
--- pypy/dist/pypy/rpython/rstack.py	(original)
+++ pypy/dist/pypy/rpython/rstack.py	Sat Jun  3 19:42:39 2006
@@ -120,7 +120,7 @@
         if 'i_returns' in kwds_i:
             assert len(kwds_i) == 1
             returns_index = kwds_i['i_returns']
-            v_return = args_v.pop(returns_index-1)
+            v_return = hop.args_v[returns_index]
         else:
             assert not kwds_i
             v_return = hop.inputconst(lltype.Void, None)

Modified: pypy/dist/pypy/translator/stackless/code.py
==============================================================================
--- pypy/dist/pypy/translator/stackless/code.py	(original)
+++ pypy/dist/pypy/translator/stackless/code.py	Sat Jun  3 19:42:39 2006
@@ -214,6 +214,39 @@
 INDEX_RESUME_AFTER_VOID = frame.RestartInfo.add_prebuilt(resume_after_void,
                                                          [RESUME_AFTER_STATE,
                                                           EMPTY_STATE])
+
+def resume_after_long(state, retvalue):
+    if global_state.restart_substate == -1:
+        # normal entry point for a call to state.switch()
+        # first unwind the stack
+        u = UnwindException()
+        s = lltype.malloc(RESUME_AFTER_STATE)
+        s.header.f_restart = INDEX_RESUME_AFTER_LONG
+        s.c = state
+        global_state.retval_long = retvalue
+        add_frame_state(u, s.header)
+        raise u
+    elif global_state.restart_substate == 0:
+        # STATE 0: we didn't do anything so far, but the stack is unwound
+        global_state.restart_substate = -1
+        # grab the frame corresponding to ourself
+        # the 'targetstate' local is garbage here, it must be read back from
+        # 's.c' where we saved it by the normal entry point above
+        mystate = global_state.top
+        s = lltype.cast_pointer(lltype.Ptr(RESUME_AFTER_STATE), mystate)
+        targetstate = s.c
+        resume_bottom = targetstate
+        while resume_bottom.f_back:
+             resume_bottom = resume_bottom.f_back
+        resume_bottom.f_back = mystate.f_back
+        global_state.top = targetstate
+        raise UnwindException()
+
+resume_after_long.stackless_explicit = True
+INDEX_RESUME_AFTER_LONG = frame.RestartInfo.add_prebuilt(resume_after_long,
+                                                         [RESUME_AFTER_STATE,
+                                                          EMPTY_STATE])
+
 # ____________________________________________________________
 
 class StacklessData:

Modified: pypy/dist/pypy/translator/stackless/test/test_resume_point.py
==============================================================================
--- pypy/dist/pypy/translator/stackless/test/test_resume_point.py	(original)
+++ pypy/dist/pypy/translator/stackless/test/test_resume_point.py	Sat Jun  3 19:42:39 2006
@@ -50,9 +50,12 @@
         rstack.resume_point("rp1", y, returns=z) 
         return z+y
     def example():
-        f(one(),one()+one())
-        return 0
-    transform_stackless_function(example)
+        v1 = f(one(),one()+one())
+        s = rstack.resume_state_create(None, "rp1", 5*one())
+        v2 = rstack.resume_state_invoke(int, s, returns=one()*7)
+        return v1*100 + v2
+    res = llinterp_stackless_function(example)
+    assert res == 412
 
 def test_call_exception_handling():
     def g(x,y):
@@ -140,3 +143,4 @@
         return v1*100 + rstack.resume_state_invoke(C, s1).x
     res = llinterp_stackless_function(example)
     assert res == 204
+

Modified: pypy/dist/pypy/translator/stackless/transform.py
==============================================================================
--- pypy/dist/pypy/translator/stackless/transform.py	(original)
+++ pypy/dist/pypy/translator/stackless/transform.py	Sat Jun  3 19:42:39 2006
@@ -233,10 +233,33 @@
         self.yield_current_frame_to_caller_ptr = mixlevelannotator.constfunc(
             code.yield_current_frame_to_caller, [], s_StatePtr)
 
-        self.resume_after_void_ptr = mixlevelannotator.constfunc(
-            code.resume_after_void, [annmodel.SomePtr(lltype.Ptr(STATE_HEADER)),
-                                     annmodel.s_None],
-                                    annmodel.s_None)
+        s_hdrptr = annmodel.SomePtr(lltype.Ptr(STATE_HEADER))
+        self.resume_afters = {
+            lltype.Void: mixlevelannotator.constfunc(
+                code.resume_after_void,
+                [s_hdrptr, annmodel.s_None],
+                annmodel.s_None),
+            lltype.Signed: mixlevelannotator.constfunc(
+                code.resume_after_long,
+                [s_hdrptr, annmodel.SomeInteger()],
+                annmodel.s_None),
+##             lltype.SignedLongLong: mixlevelannotator.constfunc(
+##                 code.resume_after_longlong,
+##                 [s_hdrptr, annmodel.SomeInteger(knowntype=rarithmetic.r_longlong)],
+##                 annmodel.s_None),
+##             lltype.Float: mixlevelannotator.constfunc(
+##                 code.resume_after_float,
+##                 [s_hdrptr, annmodel.SomeFloat()],
+##                 annmodel.s_None),
+##             llmemory.Address: mixlevelannotator.constfunc(
+##                 code.resume_after_addr,
+##                 [s_hdrptr, annmodel.SomeAddress()],
+##                 annmodel.s_None),
+##             SAVED_REFERENCE: mixlevelannotator.constfunc(
+##                 code.resume_after_ref,
+##                 [s_hdrptr, annmodel.SomePtr(SAVED_REFERENCE)],
+##                 annmodel.s_None),
+            }
 
         mixlevelannotator.finish()
 
@@ -531,14 +554,12 @@
         retvar = varoftype(lltype.Void)
         realrettype = op.result.concretetype
         v_returns = op.args[1]
-        if v_returns.concretetype == lltype.Signed:
-            raise NotImplementedError
-        elif v_returns.concretetype == lltype.Void:
-            args = [self.resume_after_void_ptr] + op.args
-            newop = model.SpaceOperation('direct_call', args, retvar)
-            block.operations[-1] = newop
-        else:
+        resume_after_ptr = self.resume_afters[storage_type(v_returns.concretetype)]
+        if storage_type(v_returns.concretetype) != v_returns.concretetype:
             raise NotImplementedError
+        args = [resume_after_ptr] + op.args
+        newop = model.SpaceOperation('direct_call', args, retvar)
+        block.operations[-1] = newop
         noexclink = block.exits[0].copy()
         for i, a in enumerate(noexclink.args):
             if a is op.result:



More information about the Pypy-commit mailing list