diff options
author | Mark Shannon <mark@hotpy.org> | 2022-07-01 10:08:20 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-07-01 10:08:20 (GMT) |
commit | 544531de23d69f5b23883794fc7bb23a958a0fcb (patch) | |
tree | ad88c0a6543127cd89027843ab441aa29dbdbc75 /Objects | |
parent | 1df9449db24f16c9c96bdd7dc283a5062bca68e6 (diff) | |
download | cpython-544531de23d69f5b23883794fc7bb23a958a0fcb.zip cpython-544531de23d69f5b23883794fc7bb23a958a0fcb.tar.gz cpython-544531de23d69f5b23883794fc7bb23a958a0fcb.tar.bz2 |
GH-94262: Don't create frame objects for frames that aren't yet complete. (GH-94371)
Diffstat (limited to 'Objects')
-rw-r--r-- | Objects/codeobject.c | 11 | ||||
-rw-r--r-- | Objects/frameobject.c | 10 |
2 files changed, 13 insertions, 8 deletions
diff --git a/Objects/codeobject.c b/Objects/codeobject.c index 6f2a837..d4fa0e3 100644 --- a/Objects/codeobject.c +++ b/Objects/codeobject.c @@ -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; } diff --git a/Objects/frameobject.c b/Objects/frameobject.c index 9ff0443..44cc062 100644 --- a/Objects/frameobject.c +++ b/Objects/frameobject.c @@ -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; |