summaryrefslogtreecommitdiffstats
path: root/Objects
diff options
context:
space:
mode:
authorMark Shannon <mark@hotpy.org>2022-07-01 10:08:20 (GMT)
committerGitHub <noreply@github.com>2022-07-01 10:08:20 (GMT)
commit544531de23d69f5b23883794fc7bb23a958a0fcb (patch)
treead88c0a6543127cd89027843ab441aa29dbdbc75 /Objects
parent1df9449db24f16c9c96bdd7dc283a5062bca68e6 (diff)
downloadcpython-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.c11
-rw-r--r--Objects/frameobject.c10
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;