GH-94262: Don't create frame objects for frames that aren't yet complete. (GH-94371)

This commit is contained in:
Mark Shannon 2022-07-01 11:08:20 +01:00 committed by GitHub
parent 1df9449db2
commit 544531de23
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 87 additions and 13 deletions

View file

@ -638,11 +638,10 @@ PyCode_New(int argcount, int kwonlyargcount,
exceptiontable);
}
static const char assert0[4] = {
LOAD_ASSERTION_ERROR,
0,
RAISE_VARARGS,
1
static const char assert0[6] = {
RESUME, 0,
LOAD_ASSERTION_ERROR, 0,
RAISE_VARARGS, 1
};
PyCodeObject *
@ -666,7 +665,7 @@ PyCode_NewEmpty(const char *filename, const char *funcname, int firstlineno)
if (filename_ob == NULL) {
goto failed;
}
code_ob = PyBytes_FromStringAndSize(assert0, 4);
code_ob = PyBytes_FromStringAndSize(assert0, 6);
if (code_ob == NULL) {
goto failed;
}

View file

@ -1169,8 +1169,14 @@ PyFrame_GetBack(PyFrameObject *frame)
{
assert(frame != NULL);
PyFrameObject *back = frame->f_back;
if (back == NULL && frame->f_frame->previous != NULL) {
back = _PyFrame_GetFrameObject(frame->f_frame->previous);
if (back == NULL) {
_PyInterpreterFrame *prev = frame->f_frame->previous;
while (prev && _PyFrame_IsIncomplete(prev)) {
prev = prev->previous;
}
if (prev) {
back = _PyFrame_GetFrameObject(prev);
}
}
Py_XINCREF(back);
return back;