[pypy-svn] r70711 - in pypy/branch/direct-assembler-call/pypy/jit/metainterp: . test
fijal at codespeak.net
fijal at codespeak.net
Tue Jan 19 16:32:22 CET 2010
Author: fijal
Date: Tue Jan 19 16:32:22 2010
New Revision: 70711
Modified:
pypy/branch/direct-assembler-call/pypy/jit/metainterp/test/test_recursive.py
pypy/branch/direct-assembler-call/pypy/jit/metainterp/warmspot.py
pypy/branch/direct-assembler-call/pypy/jit/metainterp/warmstate.py
Log:
Surprisingly, this seems to be enough to cover all cases for direct
assembler call helper.
Modified: pypy/branch/direct-assembler-call/pypy/jit/metainterp/test/test_recursive.py
==============================================================================
--- pypy/branch/direct-assembler-call/pypy/jit/metainterp/test/test_recursive.py (original)
+++ pypy/branch/direct-assembler-call/pypy/jit/metainterp/test/test_recursive.py Tue Jan 19 16:32:22 2010
@@ -713,7 +713,27 @@
self.check_history(call_assembler=1)
def test_directly_call_assembler_fail_guard(self):
- pass
+ driver = JitDriver(greens = ['codeno'], reds = ['i', 'k'],
+ get_printable_location = lambda codeno : str(codeno),
+ can_inline = lambda codeno : False)
+
+ def portal(codeno, k):
+ i = 0
+ while i < 10:
+ driver.can_enter_jit(codeno=codeno, i=i, k=k)
+ driver.jit_merge_point(codeno=codeno, i=i, k=k)
+ if codeno == 2:
+ k += portal(1, k)
+ elif k > 40:
+ if i % 2:
+ k += 1
+ else:
+ k += 2
+ k += 1
+ i += 1
+ return k
+
+ self.meta_interp(portal, [2, 0], inline=True)
class TestLLtype(RecursiveTests, LLJitMixin):
pass
Modified: pypy/branch/direct-assembler-call/pypy/jit/metainterp/warmspot.py
==============================================================================
--- pypy/branch/direct-assembler-call/pypy/jit/metainterp/warmspot.py (original)
+++ pypy/branch/direct-assembler-call/pypy/jit/metainterp/warmspot.py Tue Jan 19 16:32:22 2010
@@ -563,31 +563,35 @@
def assembler_call_helper(failindex):
fail_descr = self.cpu.get_fail_descr_from_number(failindex)
- try:
- while True:
+ while True:
+ try:
loop_token = fail_descr.handle_fail(self.metainterp_sd)
- xxx
- except self.ContinueRunningNormally, e:
- xxx
- except self.DoneWithThisFrameVoid:
- assert result_kind == 'void'
- return
- except self.DoneWithThisFrameInt, e:
- assert result_kind == 'int'
- return lltype.cast_primitive(RESULT, e.result)
- except self.DoneWithThisFrameRef, e:
- assert result_kind == 'ref'
- return ts.cast_from_ref(RESULT, e.result)
- except self.DoneWithThisFrameFloat, e:
- assert result_kind == 'float'
- return e.result
- except self.ExitFrameWithExceptionRef, e:
- value = ts.cast_to_baseclass(e.value)
- if not we_are_translated():
- raise LLException(ts.get_typeptr(value), value)
- else:
- value = cast_base_ptr_to_instance(Exception, value)
- raise Exception, value
+ fail_descr = self.cpu.execute_token(loop_token)
+ except self.ContinueRunningNormally, e:
+ args = ()
+ for _, name, _ in portalfunc_ARGS:
+ v = getattr(e, name)
+ args = args + (v,)
+ self.state.set_future_values(*args)
+ except self.DoneWithThisFrameVoid:
+ assert result_kind == 'void'
+ return
+ except self.DoneWithThisFrameInt, e:
+ assert result_kind == 'int'
+ return lltype.cast_primitive(RESULT, e.result)
+ except self.DoneWithThisFrameRef, e:
+ assert result_kind == 'ref'
+ return ts.cast_from_ref(RESULT, e.result)
+ except self.DoneWithThisFrameFloat, e:
+ assert result_kind == 'float'
+ return e.result
+ except self.ExitFrameWithExceptionRef, e:
+ value = ts.cast_to_baseclass(e.value)
+ if not we_are_translated():
+ raise LLException(ts.get_typeptr(value), value)
+ else:
+ value = cast_base_ptr_to_instance(Exception, value)
+ raise Exception, value
self.cpu.assembler_helper_ptr = self.helper_func(
self.PTR_ASSEMBLER_HELPER_FUNCTYPE,
Modified: pypy/branch/direct-assembler-call/pypy/jit/metainterp/warmstate.py
==============================================================================
--- pypy/branch/direct-assembler-call/pypy/jit/metainterp/warmstate.py (original)
+++ pypy/branch/direct-assembler-call/pypy/jit/metainterp/warmstate.py Tue Jan 19 16:32:22 2010
@@ -194,7 +194,7 @@
ContinueRunningNormally = self.warmrunnerdesc.ContinueRunningNormally
num_green_args = self.warmrunnerdesc.num_green_args
get_jitcell = self.make_jitcell_getter()
- set_future_values = self.make_set_future_values()
+ self.set_future_values = self.make_set_future_values()
self.make_jitdriver_callbacks()
confirm_enter_jit = self.confirm_enter_jit
@@ -245,7 +245,7 @@
return
# machine code was already compiled for these greenargs
# get the assembler and fill in the boxes
- set_future_values(*args[num_green_args:])
+ self.set_future_values(*args[num_green_args:])
loop_token = cell.entry_loop_token
# ---------- execute assembler ----------
More information about the Pypy-commit
mailing list