Author: Carl Friedrich Bolz <cfb...@gmx.de>
Branch: guard-compatible
Changeset: r83017:27576d755874
Date: 2016-03-13 18:39 +0100
http://bitbucket.org/pypy/pypy/changeset/27576d755874/

Log:    test interaction with guard_compatible if the elidable function
        raises (it's never compatible then)

diff --git a/rpython/jit/metainterp/compatible.py 
b/rpython/jit/metainterp/compatible.py
--- a/rpython/jit/metainterp/compatible.py
+++ b/rpython/jit/metainterp/compatible.py
@@ -56,12 +56,19 @@
         self.pure_call_conditions.append((op, res))
 
     def check_compat(self, cpu, ref):
+        from rpython.rlib.debug import debug_print, debug_start, debug_stop
         for op, correct_res in self.pure_call_conditions:
             calldescr = op.getdescr()
             # change exactly the first argument
             arglist = op.getarglist()
             arglist[1] = newconst(ref)
-            res = do_call(cpu, arglist, calldescr)
+            try:
+                res = do_call(cpu, arglist, calldescr)
+            except Exception:
+                debug_start("jit-guard-compatible")
+                debug_print("call to elidable_compatible function raised")
+                debug_stop("jit-guard-compatible")
+                return False
             if not res.same_constant(correct_res):
                 return False
         return True
diff --git a/rpython/jit/metainterp/test/test_compatible.py 
b/rpython/jit/metainterp/test/test_compatible.py
--- a/rpython/jit/metainterp/test/test_compatible.py
+++ b/rpython/jit/metainterp/test/test_compatible.py
@@ -33,3 +33,36 @@
         self.meta_interp(main, [])
         # XXX check number of bridges
 
+    def test_exception(self):
+        S = lltype.GcStruct('S', ('x', lltype.Signed))
+        p1 = lltype.malloc(S)
+        p1.x = 5
+
+        p2 = lltype.malloc(S)
+        p2.x = 5
+
+        p3 = lltype.malloc(S)
+        p3.x = 6
+        driver = jit.JitDriver(greens = [], reds = ['n', 'x'])
+        @jit.elidable_compatible()
+        def g(s):
+            if s.x == 6:
+                raise Exception
+            return s.x
+
+        def f(n, x):
+            while n > 0:
+                driver.can_enter_jit(n=n, x=x)
+                driver.jit_merge_point(n=n, x=x)
+                try:
+                    n -= g(x)
+                except:
+                    n -= 1
+
+        def main():
+            f(100, p1)
+            f(100, p2)
+            f(100, p3)
+
+        self.meta_interp(main, [])
+        # XXX check number of bridges
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to