summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrett Cannon <brett@python.org>2023-11-17 23:52:11 (GMT)
committerGitHub <noreply@github.com>2023-11-17 23:52:11 (GMT)
commitf489ace9e7aaa29b5a83b0a74a247abc8b032910 (patch)
tree686e4f0d2bb101e8619222b6e83bca2d889243b3
parentdabc0d77b21d8cc619a2ffcf859f684b6c1c7020 (diff)
downloadcpython-f489ace9e7aaa29b5a83b0a74a247abc8b032910.zip
cpython-f489ace9e7aaa29b5a83b0a74a247abc8b032910.tar.gz
cpython-f489ace9e7aaa29b5a83b0a74a247abc8b032910.tar.bz2
GH-111808: Make the default value for `test.support.infinite_recursion()` conditional on compiler optimizations (GH-112223)
Co-authored-by: Victor Stinner <vstinner@python.org>
-rw-r--r--Lib/test/support/__init__.py12
-rw-r--r--Lib/test/test_richcmp.py2
-rw-r--r--Lib/test/test_typing.py2
-rw-r--r--Misc/NEWS.d/next/Tests/2023-11-17-15-20-41.gh-issue-111808.jtIayt.rst4
4 files changed, 16 insertions, 4 deletions
diff --git a/Lib/test/support/__init__.py b/Lib/test/support/__init__.py
index d476ba5..bb9f998 100644
--- a/Lib/test/support/__init__.py
+++ b/Lib/test/support/__init__.py
@@ -2120,13 +2120,21 @@ def set_recursion_limit(limit):
finally:
sys.setrecursionlimit(original_limit)
-def infinite_recursion(max_depth=100):
+def infinite_recursion(max_depth=None):
"""Set a lower limit for tests that interact with infinite recursions
(e.g test_ast.ASTHelpers_Test.test_recursion_direct) since on some
debug windows builds, due to not enough functions being inlined the
stack size might not handle the default recursion limit (1000). See
bpo-11105 for details."""
- if max_depth < 3:
+ if max_depth is None:
+ if not python_is_optimized() or Py_DEBUG:
+ # Python built without compiler optimizations or in debug mode
+ # usually consumes more stack memory per function call.
+ # Unoptimized number based on what works under a WASI debug build.
+ max_depth = 50
+ else:
+ max_depth = 100
+ elif max_depth < 3:
raise ValueError("max_depth must be at least 3, got {max_depth}")
depth = get_recursion_depth()
depth = max(depth - 1, 1) # Ignore infinite_recursion() frame.
diff --git a/Lib/test/test_richcmp.py b/Lib/test/test_richcmp.py
index 5f449cd..6fb31c8 100644
--- a/Lib/test/test_richcmp.py
+++ b/Lib/test/test_richcmp.py
@@ -221,7 +221,7 @@ class MiscTest(unittest.TestCase):
self.assertRaises(Exc, func, Bad())
@support.no_tracing
- @support.infinite_recursion(25)
+ @support.infinite_recursion()
def test_recursion(self):
# Check that comparison for recursive objects fails gracefully
from collections import UserList
diff --git a/Lib/test/test_typing.py b/Lib/test/test_typing.py
index 8681e7e..2b5f34b 100644
--- a/Lib/test/test_typing.py
+++ b/Lib/test/test_typing.py
@@ -5621,7 +5621,7 @@ class ForwardRefTests(BaseTestCase):
def cmp(o1, o2):
return o1 == o2
- with infinite_recursion(25): # magic number, small but reasonable
+ with infinite_recursion():
r1 = namespace1()
r2 = namespace2()
self.assertIsNot(r1, r2)
diff --git a/Misc/NEWS.d/next/Tests/2023-11-17-15-20-41.gh-issue-111808.jtIayt.rst b/Misc/NEWS.d/next/Tests/2023-11-17-15-20-41.gh-issue-111808.jtIayt.rst
new file mode 100644
index 0000000..36151d4
--- /dev/null
+++ b/Misc/NEWS.d/next/Tests/2023-11-17-15-20-41.gh-issue-111808.jtIayt.rst
@@ -0,0 +1,4 @@
+Make the default value of ``test.support.infinite_recursion()`` to be
+conditional based on whether optimizations were used when compiling the
+interpreter. This helps with platforms like WASI whose stack size is greatly
+restricted in debug builds.