gh-132744: Check recursion limit in CALL_PY_GENERAL (GH-132746)
This commit is contained in:
@@ -3858,6 +3858,7 @@ dummy_func(
|
||||
unused/1 + // Skip over the counter
|
||||
_CHECK_PEP_523 +
|
||||
_CHECK_FUNCTION_VERSION +
|
||||
_CHECK_RECURSION_REMAINING +
|
||||
_PY_FRAME_GENERAL +
|
||||
_SAVE_RETURN_OFFSET +
|
||||
_PUSH_FRAME;
|
||||
@@ -3889,6 +3890,7 @@ dummy_func(
|
||||
_CHECK_METHOD_VERSION +
|
||||
_EXPAND_METHOD +
|
||||
flush + // so that self is in the argument array
|
||||
_CHECK_RECURSION_REMAINING +
|
||||
_PY_FRAME_GENERAL +
|
||||
_SAVE_RETURN_OFFSET +
|
||||
_PUSH_FRAME;
|
||||
@@ -3967,6 +3969,9 @@ dummy_func(
|
||||
PyFunctionObject *func = (PyFunctionObject *)callable_o;
|
||||
PyCodeObject *code = (PyCodeObject *)func->func_code;
|
||||
DEOPT_IF(!_PyThreadState_HasStackSpace(tstate, code->co_framesize));
|
||||
}
|
||||
|
||||
op(_CHECK_RECURSION_REMAINING, (--)) {
|
||||
DEOPT_IF(tstate->py_recursion_remaining <= 1);
|
||||
}
|
||||
|
||||
@@ -4008,6 +4013,7 @@ dummy_func(
|
||||
_CHECK_FUNCTION_VERSION +
|
||||
_CHECK_FUNCTION_EXACT_ARGS +
|
||||
_CHECK_STACK_SPACE +
|
||||
_CHECK_RECURSION_REMAINING +
|
||||
_INIT_CALL_PY_EXACT_ARGS +
|
||||
_SAVE_RETURN_OFFSET +
|
||||
_PUSH_FRAME;
|
||||
@@ -4018,6 +4024,7 @@ dummy_func(
|
||||
_CHECK_FUNCTION_VERSION +
|
||||
_CHECK_FUNCTION_EXACT_ARGS +
|
||||
_CHECK_STACK_SPACE +
|
||||
_CHECK_RECURSION_REMAINING +
|
||||
_INIT_CALL_PY_EXACT_ARGS +
|
||||
_SAVE_RETURN_OFFSET +
|
||||
_PUSH_FRAME;
|
||||
|
||||
4
Python/executor_cases.c.h
generated
4
Python/executor_cases.c.h
generated
@@ -5094,6 +5094,10 @@
|
||||
UOP_STAT_INC(uopcode, miss);
|
||||
JUMP_TO_JUMP_TARGET();
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case _CHECK_RECURSION_REMAINING: {
|
||||
if (tstate->py_recursion_remaining <= 1) {
|
||||
UOP_STAT_INC(uopcode, miss);
|
||||
JUMP_TO_JUMP_TARGET();
|
||||
|
||||
22
Python/generated_cases.c.h
generated
22
Python/generated_cases.c.h
generated
@@ -1907,6 +1907,9 @@
|
||||
assert(_PyOpcode_Deopt[opcode] == (CALL));
|
||||
JUMP_TO_PREDICTED(CALL);
|
||||
}
|
||||
}
|
||||
// _CHECK_RECURSION_REMAINING
|
||||
{
|
||||
if (tstate->py_recursion_remaining <= 1) {
|
||||
UPDATE_MISS_STATS(CALL);
|
||||
assert(_PyOpcode_Deopt[opcode] == (CALL));
|
||||
@@ -2022,6 +2025,14 @@
|
||||
stack_pointer = _PyFrame_GetStackPointer(frame);
|
||||
}
|
||||
// flush
|
||||
// _CHECK_RECURSION_REMAINING
|
||||
{
|
||||
if (tstate->py_recursion_remaining <= 1) {
|
||||
UPDATE_MISS_STATS(CALL);
|
||||
assert(_PyOpcode_Deopt[opcode] == (CALL));
|
||||
JUMP_TO_PREDICTED(CALL);
|
||||
}
|
||||
}
|
||||
// _PY_FRAME_GENERAL
|
||||
{
|
||||
args = &stack_pointer[-oparg];
|
||||
@@ -4168,6 +4179,9 @@
|
||||
assert(_PyOpcode_Deopt[opcode] == (CALL));
|
||||
JUMP_TO_PREDICTED(CALL);
|
||||
}
|
||||
}
|
||||
// _CHECK_RECURSION_REMAINING
|
||||
{
|
||||
if (tstate->py_recursion_remaining <= 1) {
|
||||
UPDATE_MISS_STATS(CALL);
|
||||
assert(_PyOpcode_Deopt[opcode] == (CALL));
|
||||
@@ -4254,6 +4268,14 @@
|
||||
JUMP_TO_PREDICTED(CALL);
|
||||
}
|
||||
}
|
||||
// _CHECK_RECURSION_REMAINING
|
||||
{
|
||||
if (tstate->py_recursion_remaining <= 1) {
|
||||
UPDATE_MISS_STATS(CALL);
|
||||
assert(_PyOpcode_Deopt[opcode] == (CALL));
|
||||
JUMP_TO_PREDICTED(CALL);
|
||||
}
|
||||
}
|
||||
// _PY_FRAME_GENERAL
|
||||
{
|
||||
args = &stack_pointer[-oparg];
|
||||
|
||||
4
Python/optimizer_cases.c.h
generated
4
Python/optimizer_cases.c.h
generated
@@ -1844,6 +1844,10 @@
|
||||
break;
|
||||
}
|
||||
|
||||
case _CHECK_RECURSION_REMAINING: {
|
||||
break;
|
||||
}
|
||||
|
||||
case _INIT_CALL_PY_EXACT_ARGS: {
|
||||
JitOptSymbol **args;
|
||||
JitOptSymbol *self_or_null;
|
||||
|
||||
Reference in New Issue
Block a user