summaryrefslogtreecommitdiffstats
path: root/Lib/test/test_call.py
diff options
context:
space:
mode:
authorMark Shannon <mark@hotpy.org>2022-10-05 00:34:03 (GMT)
committerGitHub <noreply@github.com>2022-10-05 00:34:03 (GMT)
commit76449350b3467b85bcb565f9e2bf945bd150a66e (patch)
treee4237841cdb9d9984e3249823a8518c79470d73f /Lib/test/test_call.py
parent0ff8fd65838f9f9ed90d7a055d26a2ce9fc0ce85 (diff)
downloadcpython-76449350b3467b85bcb565f9e2bf945bd150a66e.zip
cpython-76449350b3467b85bcb565f9e2bf945bd150a66e.tar.gz
cpython-76449350b3467b85bcb565f9e2bf945bd150a66e.tar.bz2
GH-91079: Decouple C stack overflow checks from Python recursion checks. (GH-96510)
Diffstat (limited to 'Lib/test/test_call.py')
-rw-r--r--Lib/test/test_call.py38
1 files changed, 38 insertions, 0 deletions
diff --git a/Lib/test/test_call.py b/Lib/test/test_call.py
index c1a3862..1f3307f 100644
--- a/Lib/test/test_call.py
+++ b/Lib/test/test_call.py
@@ -864,6 +864,44 @@ class TestErrorMessagesUseQualifiedName(unittest.TestCase):
with self.check_raises_type_error(msg):
A().method_two_args("x", "y", x="oops")
+@cpython_only
+class TestRecursion(unittest.TestCase):
+
+ def test_super_deep(self):
+
+ def recurse(n):
+ if n:
+ recurse(n-1)
+
+ def py_recurse(n, m):
+ if n:
+ py_recurse(n-1, m)
+ else:
+ c_py_recurse(m-1)
+
+ def c_recurse(n):
+ if n:
+ _testcapi.pyobject_fastcall(c_recurse, (n-1,))
+
+ def c_py_recurse(m):
+ if m:
+ _testcapi.pyobject_fastcall(py_recurse, (1000, m))
+
+ depth = sys.getrecursionlimit()
+ sys.setrecursionlimit(100_000)
+ try:
+ recurse(90_000)
+ with self.assertRaises(RecursionError):
+ recurse(101_000)
+ c_recurse(100)
+ with self.assertRaises(RecursionError):
+ c_recurse(90_000)
+ c_py_recurse(90)
+ with self.assertRaises(RecursionError):
+ c_py_recurse(100_000)
+ finally:
+ sys.setrecursionlimit(depth)
+
if __name__ == "__main__":
unittest.main()