aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/Python
diff options
context:
space:
mode:
Diffstat (limited to 'Python')
-rw-r--r--Python/Python-ast.c2
-rw-r--r--Python/ast.c2
-rw-r--r--Python/ast_opt.c2
-rw-r--r--Python/bytecodes.c2
-rw-r--r--Python/ceval.c8
-rw-r--r--Python/generated_cases.c.h2
-rw-r--r--Python/symtable.c11
7 files changed, 14 insertions, 15 deletions
diff --git a/Python/Python-ast.c b/Python/Python-ast.c
index 412de793974..8047b1259c5 100644
--- a/Python/Python-ast.c
+++ b/Python/Python-ast.c
@@ -13073,7 +13073,7 @@ PyObject* PyAST_mod2obj(mod_ty t)
int starting_recursion_depth;
/* Be careful here to prevent overflow. */
- int COMPILER_STACK_FRAME_SCALE = 3;
+ int COMPILER_STACK_FRAME_SCALE = 2;
PyThreadState *tstate = _PyThreadState_GET();
if (!tstate) {
return 0;
diff --git a/Python/ast.c b/Python/ast.c
index 68600ce683b..74c97f948d1 100644
--- a/Python/ast.c
+++ b/Python/ast.c
@@ -1029,7 +1029,7 @@ validate_type_params(struct validator *state, asdl_type_param_seq *tps)
/* See comments in symtable.c. */
-#define COMPILER_STACK_FRAME_SCALE 3
+#define COMPILER_STACK_FRAME_SCALE 2
int
_PyAST_Validate(mod_ty mod)
diff --git a/Python/ast_opt.c b/Python/ast_opt.c
index ad1e312b084..82e7559e5b6 100644
--- a/Python/ast_opt.c
+++ b/Python/ast_opt.c
@@ -1112,7 +1112,7 @@ astfold_type_param(type_param_ty node_, PyArena *ctx_, _PyASTOptimizeState *stat
#undef CALL_SEQ
/* See comments in symtable.c. */
-#define COMPILER_STACK_FRAME_SCALE 3
+#define COMPILER_STACK_FRAME_SCALE 2
int
_PyAST_Optimize(mod_ty mod, PyArena *arena, int optimize, int ff_features)
diff --git a/Python/bytecodes.c b/Python/bytecodes.c
index 0bea7b59597..90e26d3c86b 100644
--- a/Python/bytecodes.c
+++ b/Python/bytecodes.c
@@ -741,7 +741,7 @@ dummy_func(
tstate->cframe = cframe.previous;
assert(tstate->cframe->current_frame == frame->previous);
assert(!_PyErr_Occurred(tstate));
- _Py_LeaveRecursiveCallTstate(tstate);
+ tstate->c_recursion_remaining += PY_EVAL_C_STACK_UNITS;
return retval;
}
diff --git a/Python/ceval.c b/Python/ceval.c
index 369b9a69152..b85e9677747 100644
--- a/Python/ceval.c
+++ b/Python/ceval.c
@@ -624,6 +624,11 @@ extern const struct _PyCode_DEF(8) _Py_InitCleanup;
# pragma warning(disable:4102)
#endif
+
+/* _PyEval_EvalFrameDefault() is a *big* function,
+ * so consume 3 units of C stack */
+#define PY_EVAL_C_STACK_UNITS 2
+
PyObject* _Py_HOT_FUNCTION
_PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int throwflag)
{
@@ -676,6 +681,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int
frame->previous = &entry_frame;
cframe.current_frame = frame;
+ tstate->c_recursion_remaining -= (PY_EVAL_C_STACK_UNITS - 1);
if (_Py_EnterRecursiveCallTstate(tstate, "")) {
tstate->c_recursion_remaining--;
tstate->py_recursion_remaining--;
@@ -907,7 +913,7 @@ exit_unwind:
/* Restore previous cframe and exit */
tstate->cframe = cframe.previous;
assert(tstate->cframe->current_frame == frame->previous);
- _Py_LeaveRecursiveCallTstate(tstate);
+ tstate->c_recursion_remaining += PY_EVAL_C_STACK_UNITS;
return NULL;
}
diff --git a/Python/generated_cases.c.h b/Python/generated_cases.c.h
index e43b3dedf14..9fa549a1203 100644
--- a/Python/generated_cases.c.h
+++ b/Python/generated_cases.c.h
@@ -903,7 +903,7 @@
tstate->cframe = cframe.previous;
assert(tstate->cframe->current_frame == frame->previous);
assert(!_PyErr_Occurred(tstate));
- _Py_LeaveRecursiveCallTstate(tstate);
+ tstate->c_recursion_remaining += PY_EVAL_C_STACK_UNITS;
return retval;
}
diff --git a/Python/symtable.c b/Python/symtable.c
index 04be3192d6c..e9adbd5d29b 100644
--- a/Python/symtable.c
+++ b/Python/symtable.c
@@ -282,17 +282,10 @@ symtable_new(void)
return NULL;
}
-/* When compiling the use of C stack is probably going to be a lot
- lighter than when executing Python code but still can overflow
- and causing a Python crash if not checked (e.g. eval("()"*300000)).
- Using the current recursion limit for the compiler seems too
- restrictive (it caused at least one test to fail) so a factor is
- used to allow deeper recursion when compiling an expression.
-
- Using a scaling factor means this should automatically adjust when
+/* Using a scaling factor means this should automatically adjust when
the recursion limit is adjusted for small or large C stack allocations.
*/
-#define COMPILER_STACK_FRAME_SCALE 3
+#define COMPILER_STACK_FRAME_SCALE 2
struct symtable *
_PySymtable_Build(mod_ty mod, PyObject *filename, PyFutureFeatures *future)