[pypy-svn] r79351 - in pypy/branch/jit-free/pypy/jit/metainterp: optimizeopt test

arigo at codespeak.net arigo at codespeak.net
Mon Nov 22 17:58:17 CET 2010


Author: arigo
Date: Mon Nov 22 17:58:15 2010
New Revision: 79351

Modified:
   pypy/branch/jit-free/pypy/jit/metainterp/optimizeopt/optimizer.py
   pypy/branch/jit-free/pypy/jit/metainterp/test/test_exception.py
   pypy/branch/jit-free/pypy/jit/metainterp/test/test_optimizeopt.py
Log:
Merge r79349-r79350 from trunk.


Modified: pypy/branch/jit-free/pypy/jit/metainterp/optimizeopt/optimizer.py
==============================================================================
--- pypy/branch/jit-free/pypy/jit/metainterp/optimizeopt/optimizer.py	(original)
+++ pypy/branch/jit-free/pypy/jit/metainterp/optimizeopt/optimizer.py	Mon Nov 22 17:58:15 2010
@@ -299,7 +299,9 @@
             return CVAL_ZERO
 
     def propagate_all_forward(self):
-        self.exception_might_have_happened = False
+        self.exception_might_have_happened = True
+        # ^^^ at least at the start of bridges.  For loops, we could set
+        # it to False, but we probably don't care
         self.newoperations = []
         self.i = 0
         while self.i < len(self.loop.operations):

Modified: pypy/branch/jit-free/pypy/jit/metainterp/test/test_exception.py
==============================================================================
--- pypy/branch/jit-free/pypy/jit/metainterp/test/test_exception.py	(original)
+++ pypy/branch/jit-free/pypy/jit/metainterp/test/test_exception.py	Mon Nov 22 17:58:15 2010
@@ -1,6 +1,6 @@
 import py, sys
 from pypy.jit.metainterp.test.test_basic import LLJitMixin, OOJitMixin
-from pypy.rlib.jit import JitDriver, OPTIMIZER_SIMPLE
+from pypy.rlib.jit import JitDriver, OPTIMIZER_SIMPLE, dont_look_inside
 from pypy.rlib.rarithmetic import ovfcheck, LONG_BIT, intmask
 from pypy.jit.codewriter.policy import StopAtXPolicy
 
@@ -588,6 +588,33 @@
         res = self.interp_operations(f, [99])
         assert res == 21
 
+    def test_bug_exc1_noexc_exc2(self):
+        myjitdriver = JitDriver(greens=[], reds=['i'])
+        @dont_look_inside
+        def rescall(i):
+            if i < 10:
+                raise KeyError
+            if i < 20:
+                return None
+            raise ValueError
+        def f(i):
+            while i < 30:
+                myjitdriver.can_enter_jit(i=i)
+                myjitdriver.jit_merge_point(i=i)
+                try:
+                    rescall(i)
+                except KeyError:
+                    assert i < 10
+                except ValueError:
+                    assert i >= 20
+                else:
+                    assert 10 <= i < 20
+                i += 1
+            return i
+        res = self.meta_interp(f, [0], inline=True)
+        assert res == 30
+
+
 class MyError(Exception):
     def __init__(self, n):
         self.n = n

Modified: pypy/branch/jit-free/pypy/jit/metainterp/test/test_optimizeopt.py
==============================================================================
--- pypy/branch/jit-free/pypy/jit/metainterp/test/test_optimizeopt.py	(original)
+++ pypy/branch/jit-free/pypy/jit/metainterp/test/test_optimizeopt.py	Mon Nov 22 17:58:15 2010
@@ -789,8 +789,12 @@
         i3 = call(i2, descr=nonwritedescr)
         jump(i1)       # the exception is considered lost when we loop back
         """
+        # note that 'guard_no_exception' at the very start must be kept
+        # around: bridges may start with one.  (In case of loops we could
+        # remove it, but we probably don't care.)
         expected = """
         [i]
+        guard_no_exception() []
         i1 = int_add(i, 3)
         i2 = call(i1, descr=nonwritedescr)
         guard_no_exception() [i1, i2]



More information about the Pypy-commit mailing list