Author: Armin Rigo <ar...@tunes.org>
Branch: py3.5
Changeset: r87788:e9aaf617e117
Date: 2016-10-14 15:44 +0200
http://bitbucket.org/pypy/pypy/changeset/e9aaf617e117/

Log:    Fix for http://bugs.python.org/issue25274 in sys.setrecursionlimit()

diff --git a/pypy/module/sys/vm.py b/pypy/module/sys/vm.py
--- a/pypy/module/sys/vm.py
+++ b/pypy/module/sys/vm.py
@@ -41,6 +41,7 @@
         f = ec.getnextframe_nohidden(f)
 
 
+@jit.dont_look_inside
 @unwrap_spec(new_limit="c_int")
 def setrecursionlimit(space, new_limit):
     """setrecursionlimit() sets the maximum number of nested calls that
@@ -50,11 +51,19 @@
 depending on the compiler settings) for ~1400 calls.  Setting the
 value to N reserves N/1000 times 768KB of stack space.
 """
-    from rpython.rlib.rstack import _stack_set_length_fraction
+    from rpython.rlib.rstack import _stack_set_length_fraction, stack_check
+    from rpython.rlib.rstackovf import StackOverflow
     if new_limit <= 0:
         raise oefmt(space.w_ValueError, "recursion limit must be positive")
+    try:
+        _stack_set_length_fraction(new_limit * 0.001)
+        stack_check()
+    except StackOverflow:
+        old_limit = space.sys.recursionlimit
+        _stack_set_length_fraction(old_limit * 0.001)
+        raise oefmt(space.w_RecursionError,
+                    "maximum recursion depth exceeded")
     space.sys.recursionlimit = new_limit
-    _stack_set_length_fraction(new_limit * 0.001)
 
 def getrecursionlimit(space):
     """Return the last value set by setrecursionlimit().
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to