[pypy-svn] r70706 - in pypy/branch/direct-assembler-call/pypy/jit: backend/llgraph metainterp metainterp/test
fijal at codespeak.net
fijal at codespeak.net
Tue Jan 19 15:34:43 CET 2010
Author: fijal
Date: Tue Jan 19 15:34:42 2010
New Revision: 70706
Modified:
pypy/branch/direct-assembler-call/pypy/jit/backend/llgraph/llimpl.py
pypy/branch/direct-assembler-call/pypy/jit/metainterp/test/test_recursive.py
pypy/branch/direct-assembler-call/pypy/jit/metainterp/warmspot.py
Log:
(pedronis, fijal) Do the correct thing about raising an exception from a
direct assembler call
Modified: pypy/branch/direct-assembler-call/pypy/jit/backend/llgraph/llimpl.py
==============================================================================
--- pypy/branch/direct-assembler-call/pypy/jit/backend/llgraph/llimpl.py (original)
+++ pypy/branch/direct-assembler-call/pypy/jit/backend/llgraph/llimpl.py Tue Jan 19 15:34:42 2010
@@ -817,8 +817,9 @@
self._may_force = -1
def op_call_assembler(self, loop_token, *args):
- assert not self._forced
- self._may_force = self.opindex
+ global _last_exception
+ #assert not self._forced
+ #self._may_force = self.opindex
inpargs = _from_opaque(loop_token._llgraph_compiled_version).inputargs
for i, inparg in enumerate(inpargs):
TYPE = inparg.concretetype
@@ -832,7 +833,11 @@
raise Exception("Nonsense type %s" % TYPE)
failindex = self.cpu._execute_token(loop_token)
- return self.cpu.assembler_helper_ptr(failindex)
+ try:
+ return self.cpu.assembler_helper_ptr(failindex)
+ except LLException, lle:
+ assert _last_exception is None, "exception left behind"
+ _last_exception = lle
def op_guard_not_forced(self, descr):
forced = self._forced
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 15:34:42 2010
@@ -686,7 +686,31 @@
self.check_history(call_assembler=1)
def test_directly_call_assembler_raise(self):
- pass
+
+ class MyException(Exception):
+ def __init__(self, x):
+ self.x = x
+
+ driver = JitDriver(greens = ['codeno'], reds = ['i'],
+ get_printable_location = lambda codeno : str(codeno),
+ can_inline = lambda codeno : False)
+
+ def portal(codeno):
+ i = 0
+ while i < 10:
+ driver.can_enter_jit(codeno = codeno, i = i)
+ driver.jit_merge_point(codeno = codeno, i = i)
+ if codeno == 2:
+ try:
+ portal(1)
+ except MyException, me:
+ i += me.x
+ i += 1
+ if codeno == 1:
+ raise MyException(1)
+
+ self.meta_interp(portal, [2], inline=True)
+ self.check_history(call_assembler=1)
def test_directly_call_assembler_fail_guard(self):
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 15:34:42 2010
@@ -567,6 +567,8 @@
while True:
loop_token = fail_descr.handle_fail(self.metainterp_sd)
xxx
+ except self.ContinueRunningNormally, e:
+ xxx
except self.DoneWithThisFrameVoid:
assert result_kind == 'void'
return
@@ -580,7 +582,6 @@
assert result_kind == 'float'
return e.result
except self.ExitFrameWithExceptionRef, e:
- xxx
value = ts.cast_to_baseclass(e.value)
if not we_are_translated():
raise LLException(ts.get_typeptr(value), value)
More information about the Pypy-commit
mailing list