[pypy-commit] pypy exc-later: Ensure (hackishly) that OverflowError is correctly propagated even when it's not caught explicitly

rlamy noreply at buildbot.pypy.org
Mon Mar 23 13:30:09 CET 2015


Author: Ronan Lamy <ronan.lamy at gmail.com>
Branch: exc-later
Changeset: r76511:1e06bd97b03a
Date: 2015-03-23 12:30 +0000
http://bitbucket.org/pypy/pypy/changeset/1e06bd97b03a/

Log:	Ensure (hackishly) that OverflowError is correctly propagated even
	when it's not caught explicitly

diff --git a/rpython/translator/c/test/test_exception.py b/rpython/translator/c/test/test_exception.py
--- a/rpython/translator/c/test/test_exception.py
+++ b/rpython/translator/c/test/test_exception.py
@@ -3,6 +3,7 @@
 from rpython.translator.c.test import test_typed
 from rpython.translator.c.test import test_backendoptimized
 from rpython.rtyper.lltypesystem import lltype
+from rpython.rlib.rarithmetic import ovfcheck
 
 getcompiled = test_typed.TestTypedTestCase().getcompiled
 getcompiledopt = test_backendoptimized.TestTypedOptimizedTestCase().getcompiled
@@ -195,3 +196,19 @@
     assert g() == -1
     compiled = getcompiled(g, [])
     assert compiled() == -1
+
+def test_ovf_propagation():
+    def div(a, b):
+        try:
+            return ovfcheck(a//b)
+        except ZeroDivisionError:
+            raise
+    def f():
+        div(4, 2)
+        try:
+            return div(-sys.maxint-1, -1)
+        except OverflowError:
+            return 0
+    assert f() == 0
+    compiled = getcompiled(f, [])
+    assert compiled() == 0
diff --git a/rpython/translator/simplify.py b/rpython/translator/simplify.py
--- a/rpython/translator/simplify.py
+++ b/rpython/translator/simplify.py
@@ -342,6 +342,16 @@
                 if not exits:
                     block.exitswitch = None
                 block.recloseblock(block.exits[0], *exits)
+            if OverflowError in op.canraise:
+                if not any(issubclass(OverflowError, exit.exitcase)
+                           for exit in block.exits[1:]):
+                    v_etype = const(OverflowError)
+                    v_exc = Variable('last_exc_value')
+                    exit = Link([v_etype, v_exc], graph.exceptblock, OverflowError)
+                    exit.extravars(v_etype, v_exc)
+                    exits = list(block.exits)
+                    exits.append(exit)
+                    block.recloseblock(*exits)
             if Exception in op.canraise:
                 if block.exits[-1].exitcase is not Exception:
                     v_etype = Variable('last_exception')


More information about the pypy-commit mailing list