summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Include/cpython/pystate.h11
-rw-r--r--Lib/test/test_dynamic.py3
-rw-r--r--Lib/test/test_pickle.py4
-rw-r--r--Misc/NEWS.d/next/Core and Builtins/2024-01-22-15-10-01.gh-issue-114456.fBFEJF.rst1
4 files changed, 13 insertions, 6 deletions
diff --git a/Include/cpython/pystate.h b/Include/cpython/pystate.h
index 60b056b..1dbf976 100644
--- a/Include/cpython/pystate.h
+++ b/Include/cpython/pystate.h
@@ -217,11 +217,14 @@ struct _ts {
#ifdef Py_DEBUG
// A debug build is likely built with low optimization level which implies
// higher stack memory usage than a release build: use a lower limit.
-# define Py_C_RECURSION_LIMIT 500
+# if defined(__wasi__)
+ // Based on wasmtime 16.
+# define Py_C_RECURSION_LIMIT 150
+# else
+# define Py_C_RECURSION_LIMIT 500
+# endif
#elif defined(__wasi__)
- // WASI has limited call stack. Python's recursion limit depends on code
- // layout, optimization, and WASI runtime. Wasmtime can handle about 700
- // recursions, sometimes less. 500 is a more conservative limit.
+ // Based on wasmtime 16.
# define Py_C_RECURSION_LIMIT 500
#elif defined(__s390x__)
# define Py_C_RECURSION_LIMIT 800
diff --git a/Lib/test/test_dynamic.py b/Lib/test/test_dynamic.py
index 0aa3be6..3928bba 100644
--- a/Lib/test/test_dynamic.py
+++ b/Lib/test/test_dynamic.py
@@ -4,7 +4,7 @@ import builtins
import sys
import unittest
-from test.support import swap_item, swap_attr
+from test.support import is_wasi, Py_DEBUG, swap_item, swap_attr
class RebindBuiltinsTests(unittest.TestCase):
@@ -134,6 +134,7 @@ class RebindBuiltinsTests(unittest.TestCase):
self.assertEqual(foo(), 7)
+ @unittest.skipIf(is_wasi and Py_DEBUG, "stack depth too shallow in pydebug WASI")
def test_load_global_specialization_failure_keeps_oparg(self):
# https://github.com/python/cpython/issues/91625
class MyGlobals(dict):
diff --git a/Lib/test/test_pickle.py b/Lib/test/test_pickle.py
index f6405d6..b2245dd 100644
--- a/Lib/test/test_pickle.py
+++ b/Lib/test/test_pickle.py
@@ -402,7 +402,9 @@ if has_c_implementation:
check_unpickler(recurse(1), 32, 20)
check_unpickler(recurse(20), 32, 20)
check_unpickler(recurse(50), 64, 60)
- check_unpickler(recurse(100), 128, 140)
+ if not (support.is_wasi and support.Py_DEBUG):
+ # stack depth too shallow in pydebug WASI.
+ check_unpickler(recurse(100), 128, 140)
u = unpickler(io.BytesIO(pickle.dumps('a', 0)),
encoding='ASCII', errors='strict')
diff --git a/Misc/NEWS.d/next/Core and Builtins/2024-01-22-15-10-01.gh-issue-114456.fBFEJF.rst b/Misc/NEWS.d/next/Core and Builtins/2024-01-22-15-10-01.gh-issue-114456.fBFEJF.rst
new file mode 100644
index 0000000..2b30ad9
--- /dev/null
+++ b/Misc/NEWS.d/next/Core and Builtins/2024-01-22-15-10-01.gh-issue-114456.fBFEJF.rst
@@ -0,0 +1 @@
+Lower the recursion limit under a debug build of WASI.