mirror of
https://github.com/python/cpython.git
synced 2025-08-03 16:39:00 +00:00
GH-96237: Allow non-functions as reference-holder in frames. (GH-96238)
This commit is contained in:
parent
8db7693bbf
commit
c09fa7542c
6 changed files with 26 additions and 13 deletions
|
@ -154,11 +154,12 @@ lltrace_instruction(_PyInterpreterFrame *frame,
|
|||
static void
|
||||
lltrace_resume_frame(_PyInterpreterFrame *frame)
|
||||
{
|
||||
PyFunctionObject *f = frame->f_func;
|
||||
if (f == NULL) {
|
||||
PyObject *fobj = frame->f_funcobj;
|
||||
if (fobj == NULL || !PyFunction_Check(fobj)) {
|
||||
printf("\nResuming frame.");
|
||||
return;
|
||||
}
|
||||
PyFunctionObject *f = (PyFunctionObject *)fobj;
|
||||
PyObject *type, *value, *traceback;
|
||||
PyErr_Fetch(&type, &value, &traceback);
|
||||
PyObject *name = f->func_qualname;
|
||||
|
@ -2619,7 +2620,8 @@ handle_eval_breaker:
|
|||
TARGET(COPY_FREE_VARS) {
|
||||
/* Copy closure variables to free variables */
|
||||
PyCodeObject *co = frame->f_code;
|
||||
PyObject *closure = frame->f_func->func_closure;
|
||||
assert(PyFunction_Check(frame->f_funcobj));
|
||||
PyObject *closure = ((PyFunctionObject *)frame->f_funcobj)->func_closure;
|
||||
int offset = co->co_nlocals + co->co_nplaincellvars;
|
||||
assert(oparg == co->co_nfreevars);
|
||||
for (int i = 0; i < oparg; ++i) {
|
||||
|
@ -4897,7 +4899,9 @@ handle_eval_breaker:
|
|||
}
|
||||
|
||||
TARGET(RETURN_GENERATOR) {
|
||||
PyGenObject *gen = (PyGenObject *)_Py_MakeCoro(frame->f_func);
|
||||
assert(PyFunction_Check(frame->f_funcobj));
|
||||
PyFunctionObject *func = (PyFunctionObject *)frame->f_funcobj;
|
||||
PyGenObject *gen = (PyGenObject *)_Py_MakeCoro(func);
|
||||
if (gen == NULL) {
|
||||
goto error;
|
||||
}
|
||||
|
@ -4919,7 +4923,7 @@ handle_eval_breaker:
|
|||
/* Make sure that frame is in a valid state */
|
||||
frame->stacktop = 0;
|
||||
frame->f_locals = NULL;
|
||||
Py_INCREF(frame->f_func);
|
||||
Py_INCREF(frame->f_funcobj);
|
||||
Py_INCREF(frame->f_code);
|
||||
/* Restore previous cframe and return. */
|
||||
tstate->cframe = cframe.previous;
|
||||
|
|
|
@ -13,7 +13,7 @@ _PyFrame_Traverse(_PyInterpreterFrame *frame, visitproc visit, void *arg)
|
|||
{
|
||||
Py_VISIT(frame->frame_obj);
|
||||
Py_VISIT(frame->f_locals);
|
||||
Py_VISIT(frame->f_func);
|
||||
Py_VISIT(frame->f_funcobj);
|
||||
Py_VISIT(frame->f_code);
|
||||
/* locals */
|
||||
PyObject **locals = _PyFrame_GetLocalsArray(frame);
|
||||
|
@ -114,7 +114,7 @@ _PyFrame_Clear(_PyInterpreterFrame *frame)
|
|||
}
|
||||
Py_XDECREF(frame->frame_obj);
|
||||
Py_XDECREF(frame->f_locals);
|
||||
Py_DECREF(frame->f_func);
|
||||
Py_DECREF(frame->f_funcobj);
|
||||
Py_DECREF(frame->f_code);
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue