https://github.com/python/cpython/commit/f59f90b5bccb9e7ac522bc779ab1f6bf11bb4aa3
commit: f59f90b5bccb9e7ac522bc779ab1f6bf11bb4aa3
branch: main
author: Brett Cannon <br...@python.org>
committer: brettcannon <br...@python.org>
date: 2024-01-23T15:48:14-08:00
summary:

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.

files:
A Misc/NEWS.d/next/Core and 
Builtins/2024-01-22-15-10-01.gh-issue-114456.fBFEJF.rst
M Include/cpython/pystate.h
M Lib/test/test_dynamic.py
M Lib/test/test_pickle.py

diff --git a/Include/cpython/pystate.h b/Include/cpython/pystate.h
index 60b056bdcc2f1f..1dbf97660f382f 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 0aa3be6a1bde6a..3928bbab4423c2 100644
--- a/Lib/test/test_dynamic.py
+++ b/Lib/test/test_dynamic.py
@@ -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):
@@ -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):
diff --git a/Lib/test/test_pickle.py b/Lib/test/test_pickle.py
index f6405d6dd44ef6..b2245ddf72f708 100644
--- a/Lib/test/test_pickle.py
+++ b/Lib/test/test_pickle.py
@@ -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')
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 00000000000000..2b30ad98fb5c79
--- /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.

_______________________________________________
Python-checkins mailing list -- python-checkins@python.org
To unsubscribe send an email to python-checkins-le...@python.org
https://mail.python.org/mailman3/lists/python-checkins.python.org/
Member address: arch...@mail-archive.com

Reply via email to