[pypy-svn] r61801 - in pypy/branch/pyjitpl5/pypy/jit: backend/llgraph metainterp metainterp/test

arigo at codespeak.net arigo at codespeak.net
Thu Feb 12 17:58:09 CET 2009


Author: arigo
Date: Thu Feb 12 17:58:08 2009
New Revision: 61801

Modified:
   pypy/branch/pyjitpl5/pypy/jit/backend/llgraph/llimpl.py
   pypy/branch/pyjitpl5/pypy/jit/metainterp/pyjitpl.py
   pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_exception.py
Log:
(fijal, arigo)
Test and fix for exceptions.


Modified: pypy/branch/pyjitpl5/pypy/jit/backend/llgraph/llimpl.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/backend/llgraph/llimpl.py	(original)
+++ pypy/branch/pyjitpl5/pypy/jit/backend/llgraph/llimpl.py	Thu Feb 12 17:58:08 2009
@@ -75,7 +75,8 @@
     'guard_false'     : (('bool',), None),
     'guard_value'     : (('int', 'int'), None),
     'guard_class'     : (('ptr', 'ptr'), None),
-    'guard_exception' : (('ptr',), None),
+    'guard_no_exception'      : ((), None),
+    'guard_exception'         : (('ptr',), 'ptr'),
     'guard_nonvirtualized__4' : (('ptr', 'int'), None),
     'newstr'          : (('int',), 'ptr'),
     'strlen'          : (('ptr',), 'int'),
@@ -616,20 +617,24 @@
 
     op_guard_nonvirtualized_ptr = op_guard_nonvirtualized__4
 
+    def op_guard_no_exception(self):
+        if self.last_exception:
+            self.last_exception_handled = True
+            raise GuardFailed
+
     def op_guard_exception(self, expected_exception):
         expected_exception = llmemory.cast_adr_to_ptr(
             self.cpu.cast_int_to_adr(expected_exception),
             rclass.CLASSTYPE)
+        assert expected_exception
         if self.last_exception:
             got = self.last_exception.args[0]
             self.last_exception_handled = True
-            if not expected_exception:
-                raise GuardFailed
             if not rclass.ll_issubclass(got, expected_exception):
                 raise GuardFailed
+            return self.last_exception.args[1]
         else:
-            if expected_exception:
-                raise GuardFailed
+            raise GuardFailed
 
     def op_new(self, typesize):
         TYPE = symbolic.Size2Type[typesize]

Modified: pypy/branch/pyjitpl5/pypy/jit/metainterp/pyjitpl.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/metainterp/pyjitpl.py	(original)
+++ pypy/branch/pyjitpl5/pypy/jit/metainterp/pyjitpl.py	Thu Feb 12 17:58:08 2009
@@ -693,7 +693,8 @@
     def handle_guard_failure(self, guard_failure):
         orig_boxes = self.initialize_state_from_guard_failure(guard_failure)
         try:
-            if guard_failure.guard_op.opname == 'guard_exception':
+            if guard_failure.guard_op.opname in ['guard_exception',
+                                                 'guard_no_exception']:
                 self.raise_exception_upon_guard_failure(guard_failure)
             self.interpret()
             assert False, "should always raise"
@@ -816,14 +817,17 @@
         self.handle_exception(etype, evalue)
 
     def handle_exception(self, etype, evalue):
-        exception_box = ConstInt(etype)
         frame = self.framestack[-1]
-        frame.generate_guard(frame.pc, 'guard_exception',
-                             None, [exception_box])
         if etype:
+            exception_box = ConstInt(etype)
             exc_value_box = BoxPtr(evalue)
+            op = frame.generate_guard(frame.pc, 'guard_exception',
+                                      None, [exception_box])
+            if op:
+                op.results = [exc_value_box]
             return self.finishframe_exception(exception_box, exc_value_box)
         else:
+            frame.generate_guard(frame.pc, 'guard_no_exception', None, [])
             return False
 
 ##    def forced_vars_after_guard_failure(self, guard_failure):

Modified: pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_exception.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_exception.py	(original)
+++ pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_exception.py	Thu Feb 12 17:58:08 2009
@@ -9,17 +9,17 @@
     def test_simple(self):
         def g(n):
             if n <= 0:
-                raise IndexError
+                raise MyError(n)
             return n - 1
         def f(n):
             try:
                 return g(n)
-            except IndexError:
-                return 5
+            except MyError, e:
+                return e.n + 10
         res = self.interp_operations(f, [9])
         assert res == 8
         res = self.interp_operations(f, [-99])
-        assert res == 5
+        assert res == -89
 
     def test_no_exception(self):
         myjitdriver = JitDriver(greens = [], reds = ['n'])
@@ -81,16 +81,17 @@
         myjitdriver = JitDriver(greens = [], reds = ['n'])
         def check(n):
             if n > -100:
-                raise IndexError
+                raise MyError(n)
         def f(n):
             while n > 0:
                 myjitdriver.can_enter_jit(n=n)
                 myjitdriver.jit_merge_point(n=n)
                 try:
                     check(n)
-                except IndexError:
-                    n = n - 5
+                except MyError, e:
+                    n = e.n - 5
             return n
+        assert f(53) == -2
         res = self.meta_interp(f, [53], policy=StopAtXPolicy(check))
         assert res == -2
 
@@ -177,7 +178,7 @@
         myjitdriver = JitDriver(greens = [], reds = ['n'])
         def check(n):
             if n < 0:
-                raise IndexError
+                raise MyError(n)
             return 5
         def f(n):
             try:
@@ -185,8 +186,9 @@
                     myjitdriver.can_enter_jit(n=n)
                     myjitdriver.jit_merge_point(n=n)
                     n = n - check(n)
-            except IndexError:
-                return n
+            except MyError, e:
+                return e.n
+        assert f(53) == -2
         res = self.meta_interp(f, [53], policy=StopAtXPolicy(check))
         assert res == -2
 



More information about the Pypy-commit mailing list