Skip to content

Commit

Permalink
pythonGH-114456: lower the recursion limit under WASI for debug builds (
Browse files Browse the repository at this point in the history
pythonGH-114457)

Testing under wasmtime 16.0.0 w/ code from python#114413 is how the value was found.
  • Loading branch information
brettcannon authored Jan 23, 2024
1 parent afe8f37 commit f59f90b
Show file tree
Hide file tree
Showing 4 changed files with 13 additions and 6 deletions.
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.

0 comments on commit f59f90b

Please sign in to comment.