[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