summaryrefslogtreecommitdiffstats
path: root/Include
diff options
context:
space:
mode:
authorMark Shannon <mark@hotpy.org>2022-10-05 00:34:03 (GMT)
committerGitHub <noreply@github.com>2022-10-05 00:34:03 (GMT)
commit76449350b3467b85bcb565f9e2bf945bd150a66e (patch)
treee4237841cdb9d9984e3249823a8518c79470d73f /Include
parent0ff8fd65838f9f9ed90d7a055d26a2ce9fc0ce85 (diff)
downloadcpython-76449350b3467b85bcb565f9e2bf945bd150a66e.zip
cpython-76449350b3467b85bcb565f9e2bf945bd150a66e.tar.gz
cpython-76449350b3467b85bcb565f9e2bf945bd150a66e.tar.bz2
GH-91079: Decouple C stack overflow checks from Python recursion checks. (GH-96510)
Diffstat (limited to 'Include')
-rw-r--r--Include/cpython/pystate.h16
-rw-r--r--Include/internal/pycore_ceval.h21
-rw-r--r--Include/internal/pycore_runtime_init.h2
3 files changed, 24 insertions, 15 deletions
diff --git a/Include/cpython/pystate.h b/Include/cpython/pystate.h
index cc3c3ea..7722a38 100644
--- a/Include/cpython/pystate.h
+++ b/Include/cpython/pystate.h
@@ -95,8 +95,10 @@ struct _ts {
/* Was this thread state statically allocated? */
int _static;
- int recursion_remaining;
- int recursion_limit;
+ int py_recursion_remaining;
+ int py_recursion_limit;
+
+ int c_recursion_remaining;
int recursion_headroom; /* Allow 50 more calls to handle any errors. */
/* 'tracing' keeps track of the execution depth when tracing/profiling.
@@ -202,6 +204,16 @@ struct _ts {
_PyCFrame root_cframe;
};
+/* 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. */
+#ifndef C_RECURSION_LIMIT
+# ifdef __wasi__
+# define C_RECURSION_LIMIT 500
+# else
+# define C_RECURSION_LIMIT 800
+# endif
+#endif
/* other API */
diff --git a/Include/internal/pycore_ceval.h b/Include/internal/pycore_ceval.h
index 4914948c..deda070 100644
--- a/Include/internal/pycore_ceval.h
+++ b/Include/internal/pycore_ceval.h
@@ -12,15 +12,8 @@ extern "C" {
struct pyruntimestate;
struct _ceval_runtime_state;
-/* WASI has limited call stack. Python's recursion limit depends on code
- layout, optimization, and WASI runtime. Wasmtime can handle about 700-750
- recursions, sometimes less. 600 is a more conservative limit. */
#ifndef Py_DEFAULT_RECURSION_LIMIT
-# ifdef __wasi__
-# define Py_DEFAULT_RECURSION_LIMIT 600
-# else
-# define Py_DEFAULT_RECURSION_LIMIT 1000
-# endif
+# define Py_DEFAULT_RECURSION_LIMIT 1000
#endif
#include "pycore_interp.h" // PyInterpreterState.eval_frame
@@ -118,12 +111,12 @@ extern void _PyEval_DeactivateOpCache(void);
/* With USE_STACKCHECK macro defined, trigger stack checks in
_Py_CheckRecursiveCall() on every 64th call to _Py_EnterRecursiveCall. */
static inline int _Py_MakeRecCheck(PyThreadState *tstate) {
- return (tstate->recursion_remaining-- <= 0
- || (tstate->recursion_remaining & 63) == 0);
+ return (tstate->c_recursion_remaining-- <= 0
+ || (tstate->c_recursion_remaining & 63) == 0);
}
#else
static inline int _Py_MakeRecCheck(PyThreadState *tstate) {
- return tstate->recursion_remaining-- <= 0;
+ return tstate->c_recursion_remaining-- <= 0;
}
#endif
@@ -131,6 +124,9 @@ PyAPI_FUNC(int) _Py_CheckRecursiveCall(
PyThreadState *tstate,
const char *where);
+int _Py_CheckRecursiveCallPy(
+ PyThreadState *tstate);
+
static inline int _Py_EnterRecursiveCallTstate(PyThreadState *tstate,
const char *where) {
return (_Py_MakeRecCheck(tstate) && _Py_CheckRecursiveCall(tstate, where));
@@ -142,7 +138,7 @@ static inline int _Py_EnterRecursiveCall(const char *where) {
}
static inline void _Py_LeaveRecursiveCallTstate(PyThreadState *tstate) {
- tstate->recursion_remaining++;
+ tstate->c_recursion_remaining++;
}
static inline void _Py_LeaveRecursiveCall(void) {
@@ -157,6 +153,7 @@ extern PyObject* _Py_MakeCoro(PyFunctionObject *func);
extern int _Py_HandlePending(PyThreadState *tstate);
+
#ifdef __cplusplus
}
#endif
diff --git a/Include/internal/pycore_runtime_init.h b/Include/internal/pycore_runtime_init.h
index 621d5cc..8dd7a31 100644
--- a/Include/internal/pycore_runtime_init.h
+++ b/Include/internal/pycore_runtime_init.h
@@ -68,7 +68,7 @@ extern "C" {
#define _PyThreadState_INIT \
{ \
._static = 1, \
- .recursion_limit = Py_DEFAULT_RECURSION_LIMIT, \
+ .py_recursion_limit = Py_DEFAULT_RECURSION_LIMIT, \
.context_ver = 1, \
}