summaryrefslogtreecommitdiffstats
path: root/Objects
diff options
context:
space:
mode:
authorBrandt Bucher <brandtbucher@microsoft.com>2023-01-09 20:20:04 (GMT)
committerGitHub <noreply@github.com>2023-01-09 20:20:04 (GMT)
commit61762b93871419b34f02d83cee5ca0d94d4a2903 (patch)
tree286b9aff961b5435e2d34894857a603ae86aa5c6 /Objects
parent2e80c2a976c13dcb69a654b386164dca362295a3 (diff)
downloadcpython-61762b93871419b34f02d83cee5ca0d94d4a2903.zip
cpython-61762b93871419b34f02d83cee5ca0d94d4a2903.tar.gz
cpython-61762b93871419b34f02d83cee5ca0d94d4a2903.tar.bz2
GH-100126: Skip incomplete frames in more places (GH-100613)
Diffstat (limited to 'Objects')
-rw-r--r--Objects/frameobject.c4
-rw-r--r--Objects/genobject.c11
-rw-r--r--Objects/typeobject.c6
3 files changed, 11 insertions, 10 deletions
diff --git a/Objects/frameobject.c b/Objects/frameobject.c
index ebe3bfe..39ccca7 100644
--- a/Objects/frameobject.c
+++ b/Objects/frameobject.c
@@ -1405,9 +1405,7 @@ PyFrame_GetBack(PyFrameObject *frame)
PyFrameObject *back = frame->f_back;
if (back == NULL) {
_PyInterpreterFrame *prev = frame->f_frame->previous;
- while (prev && _PyFrame_IsIncomplete(prev)) {
- prev = prev->previous;
- }
+ prev = _PyFrame_GetFirstComplete(prev);
if (prev) {
back = _PyFrame_GetFrameObject(prev);
}
diff --git a/Objects/genobject.c b/Objects/genobject.c
index 6f4046e..2adb1e4 100644
--- a/Objects/genobject.c
+++ b/Objects/genobject.c
@@ -903,8 +903,11 @@ _Py_MakeCoro(PyFunctionObject *func)
if (origin_depth == 0) {
((PyCoroObject *)coro)->cr_origin_or_finalizer = NULL;
} else {
- assert(_PyEval_GetFrame());
- PyObject *cr_origin = compute_cr_origin(origin_depth, _PyEval_GetFrame()->previous);
+ _PyInterpreterFrame *frame = tstate->cframe->current_frame;
+ assert(frame);
+ assert(_PyFrame_IsIncomplete(frame));
+ frame = _PyFrame_GetFirstComplete(frame->previous);
+ PyObject *cr_origin = compute_cr_origin(origin_depth, frame);
((PyCoroObject *)coro)->cr_origin_or_finalizer = cr_origin;
if (!cr_origin) {
Py_DECREF(coro);
@@ -1286,7 +1289,7 @@ compute_cr_origin(int origin_depth, _PyInterpreterFrame *current_frame)
/* First count how many frames we have */
int frame_count = 0;
for (; frame && frame_count < origin_depth; ++frame_count) {
- frame = frame->previous;
+ frame = _PyFrame_GetFirstComplete(frame->previous);
}
/* Now collect them */
@@ -1305,7 +1308,7 @@ compute_cr_origin(int origin_depth, _PyInterpreterFrame *current_frame)
return NULL;
}
PyTuple_SET_ITEM(cr_origin, i, frameinfo);
- frame = frame->previous;
+ frame = _PyFrame_GetFirstComplete(frame->previous);
}
return cr_origin;
diff --git a/Objects/typeobject.c b/Objects/typeobject.c
index f2d78cf..e4da5b2 100644
--- a/Objects/typeobject.c
+++ b/Objects/typeobject.c
@@ -9578,13 +9578,13 @@ super_init_impl(PyObject *self, PyTypeObject *type, PyObject *obj) {
/* Call super(), without args -- fill in from __class__
and first local variable on the stack. */
PyThreadState *tstate = _PyThreadState_GET();
- _PyInterpreterFrame *cframe = tstate->cframe->current_frame;
- if (cframe == NULL) {
+ _PyInterpreterFrame *frame = _PyThreadState_GetFrame(tstate);
+ if (frame == NULL) {
PyErr_SetString(PyExc_RuntimeError,
"super(): no current frame");
return -1;
}
- int res = super_init_without_args(cframe, cframe->f_code, &type, &obj);
+ int res = super_init_without_args(frame, frame->f_code, &type, &obj);
if (res < 0) {
return -1;