mirror of
https://github.com/python/cpython.git
synced 2025-08-04 00:48:58 +00:00
Pass reference to func, as well as args, when pushing frame. (GH-31100)
This commit is contained in:
parent
2d080347d7
commit
da4d4ec185
5 changed files with 11 additions and 29 deletions
|
@ -2243,6 +2243,7 @@ handle_eval_breaker:
|
|||
goto error;
|
||||
}
|
||||
CALL_STAT_INC(frames_pushed);
|
||||
Py_INCREF(getitem);
|
||||
_PyFrame_InitializeSpecials(new_frame, getitem,
|
||||
NULL, code->co_nlocalsplus);
|
||||
STACK_SHRINK(2);
|
||||
|
@ -4590,7 +4591,6 @@ handle_eval_breaker:
|
|||
STACK_SHRINK(call_shape.postcall_shrink);
|
||||
// The frame has stolen all the arguments from the stack,
|
||||
// so there is no need to clean them up.
|
||||
Py_DECREF(function);
|
||||
if (new_frame == NULL) {
|
||||
goto error;
|
||||
}
|
||||
|
@ -4675,7 +4675,6 @@ handle_eval_breaker:
|
|||
new_frame->localsplus[i] = NULL;
|
||||
}
|
||||
STACK_SHRINK(call_shape.postcall_shrink);
|
||||
Py_DECREF(func);
|
||||
_PyFrame_SetStackPointer(frame, stack_pointer);
|
||||
new_frame->previous = frame;
|
||||
frame = cframe.current_frame = new_frame;
|
||||
|
@ -4712,7 +4711,6 @@ handle_eval_breaker:
|
|||
new_frame->localsplus[i] = NULL;
|
||||
}
|
||||
STACK_SHRINK(call_shape.postcall_shrink);
|
||||
Py_DECREF(func);
|
||||
_PyFrame_SetStackPointer(frame, stack_pointer);
|
||||
new_frame->previous = frame;
|
||||
frame = cframe.current_frame = new_frame;
|
||||
|
@ -6077,7 +6075,7 @@ fail_post_args:
|
|||
return -1;
|
||||
}
|
||||
|
||||
/* Consumes all the references to the args */
|
||||
/* Consumes references to func and all the args */
|
||||
static InterpreterFrame *
|
||||
_PyEvalFramePushAndInit(PyThreadState *tstate, PyFunctionObject *func,
|
||||
PyObject *locals, PyObject* const* args,
|
||||
|
@ -6131,7 +6129,9 @@ _PyEval_Vector(PyThreadState *tstate, PyFunctionObject *func,
|
|||
PyObject* const* args, size_t argcount,
|
||||
PyObject *kwnames)
|
||||
{
|
||||
/* _PyEvalFramePushAndInit consumes all the references to its arguments */
|
||||
/* _PyEvalFramePushAndInit consumes the references
|
||||
* to func and all its arguments */
|
||||
Py_INCREF(func);
|
||||
for (size_t i = 0; i < argcount; i++) {
|
||||
Py_INCREF(args[i]);
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue