Skip to content

GH-114456: lower the recursion limit under WASI for debug builds #114457

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Jan 23, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 7 additions & 4 deletions Include/cpython/pystate.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
3 changes: 2 additions & 1 deletion Lib/test/test_dynamic.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
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):
Expand Down Expand Up @@ -134,6 +134,7 @@ def test_eval_gives_lambda_custom_globals(self):

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):
Expand Down
4 changes: 3 additions & 1 deletion Lib/test/test_pickle.py
Original file line number Diff line number Diff line change
Expand Up @@ -402,7 +402,9 @@ def recurse(deep):
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')
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Lower the recursion limit under a debug build of WASI.