[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