diff options
author | Brett Cannon <brett@python.org> | 2024-01-23 23:48:14 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-01-23 23:48:14 (GMT) |
commit | f59f90b5bccb9e7ac522bc779ab1f6bf11bb4aa3 (patch) | |
tree | 83782c1796acc78abfc39e30c0c41ec1e1101f18 | |
parent | afe8f376c096d5d6e8b12fbc691ca9b35381470b (diff) | |
download | cpython-f59f90b5bccb9e7ac522bc779ab1f6bf11bb4aa3.zip cpython-f59f90b5bccb9e7ac522bc779ab1f6bf11bb4aa3.tar.gz cpython-f59f90b5bccb9e7ac522bc779ab1f6bf11bb4aa3.tar.bz2 |
GH-114456: lower the recursion limit under WASI for debug builds (GH-114457)
Testing under wasmtime 16.0.0 w/ code from https://github.com/python/cpython/issues/114413 is how the value was found.
-rw-r--r-- | Include/cpython/pystate.h | 11 | ||||
-rw-r--r-- | Lib/test/test_dynamic.py | 3 | ||||
-rw-r--r-- | Lib/test/test_pickle.py | 4 | ||||
-rw-r--r-- | Misc/NEWS.d/next/Core and Builtins/2024-01-22-15-10-01.gh-issue-114456.fBFEJF.rst | 1 |
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. |