summaryrefslogtreecommitdiffstats
path: root/Python/generated_cases.c.h
diff options
context:
space:
mode:
authorMark Shannon <mark@hotpy.org>2025-02-25 09:24:48 (GMT)
committerGitHub <noreply@github.com>2025-02-25 09:24:48 (GMT)
commit014223649c33b2febbccfa221c2ab7f18a8c0847 (patch)
tree5fb6432982ab3085d9275f20769f8fbcc581666b /Python/generated_cases.c.h
parent99088ab081279329b8362e1c24533fa0be303e6f (diff)
downloadcpython-014223649c33b2febbccfa221c2ab7f18a8c0847.zip
cpython-014223649c33b2febbccfa221c2ab7f18a8c0847.tar.gz
cpython-014223649c33b2febbccfa221c2ab7f18a8c0847.tar.bz2
GH-130396: Use computed stack limits on linux (GH-130398)
* Implement C recursion protection with limit pointers for Linux, MacOS and Windows * Remove calls to PyOS_CheckStack * Add stack protection to parser * Make tests more robust to low stacks * Improve error messages for stack overflow
Diffstat (limited to 'Python/generated_cases.c.h')
-rw-r--r--Python/generated_cases.c.h11
1 files changed, 3 insertions, 8 deletions
diff --git a/Python/generated_cases.c.h b/Python/generated_cases.c.h
index 01fa857..268e883 100644
--- a/Python/generated_cases.c.h
+++ b/Python/generated_cases.c.h
@@ -2222,7 +2222,7 @@
JUMP_TO_PREDICTED(CALL);
}
// CPython promises to check all non-vectorcall function calls.
- if (tstate->c_recursion_remaining <= 0) {
+ if (_Py_ReachedRecursionLimit(tstate)) {
UPDATE_MISS_STATS(CALL);
assert(_PyOpcode_Deopt[opcode] == (CALL));
JUMP_TO_PREDICTED(CALL);
@@ -2230,7 +2230,6 @@
STAT_INC(CALL, hit);
PyCFunction cfunc = PyCFunction_GET_FUNCTION(callable_o);
_PyStackRef arg = args[0];
- _Py_EnterRecursiveCallTstateUnchecked(tstate);
_PyFrame_SetStackPointer(frame, stack_pointer);
PyObject *res_o = _PyCFunction_TrampolineCall(cfunc, PyCFunction_GET_SELF(callable_o), PyStackRef_AsPyObjectBorrow(arg));
stack_pointer = _PyFrame_GetStackPointer(frame);
@@ -3599,14 +3598,13 @@
JUMP_TO_PREDICTED(CALL);
}
// CPython promises to check all non-vectorcall function calls.
- if (tstate->c_recursion_remaining <= 0) {
+ if (_Py_ReachedRecursionLimit(tstate)) {
UPDATE_MISS_STATS(CALL);
assert(_PyOpcode_Deopt[opcode] == (CALL));
JUMP_TO_PREDICTED(CALL);
}
STAT_INC(CALL, hit);
PyCFunction cfunc = meth->ml_meth;
- _Py_EnterRecursiveCallTstateUnchecked(tstate);
_PyFrame_SetStackPointer(frame, stack_pointer);
PyObject *res_o = _PyCFunction_TrampolineCall(cfunc, self, NULL);
stack_pointer = _PyFrame_GetStackPointer(frame);
@@ -3696,7 +3694,7 @@
JUMP_TO_PREDICTED(CALL);
}
// CPython promises to check all non-vectorcall function calls.
- if (tstate->c_recursion_remaining <= 0) {
+ if (_Py_ReachedRecursionLimit(tstate)) {
UPDATE_MISS_STATS(CALL);
assert(_PyOpcode_Deopt[opcode] == (CALL));
JUMP_TO_PREDICTED(CALL);
@@ -3711,7 +3709,6 @@
}
STAT_INC(CALL, hit);
PyCFunction cfunc = meth->ml_meth;
- _Py_EnterRecursiveCallTstateUnchecked(tstate);
_PyFrame_SetStackPointer(frame, stack_pointer);
PyObject *res_o = _PyCFunction_TrampolineCall(cfunc,
PyStackRef_AsPyObjectBorrow(self_stackref),
@@ -7292,7 +7289,6 @@
/* Restore previous frame and return. */
tstate->current_frame = frame->previous;
assert(!_PyErr_Occurred(tstate));
- tstate->c_recursion_remaining += PY_EVAL_C_STACK_UNITS;
PyObject *result = PyStackRef_AsPyObjectSteal(retval);
stack_pointer += -1;
assert(WITHIN_STACK_BOUNDS());
@@ -12081,7 +12077,6 @@ JUMP_TO_LABEL(error);
if (frame->owner == FRAME_OWNED_BY_INTERPRETER) {
/* Restore previous frame and exit */
tstate->current_frame = frame->previous;
- tstate->c_recursion_remaining += PY_EVAL_C_STACK_UNITS;
return NULL;
}
next_instr = frame->instr_ptr;