mirror of
https://github.com/python/cpython.git
synced 2025-08-03 16:39:00 +00:00
GH-100126: Skip incomplete frames in more places (GH-100613)
This commit is contained in:
parent
2e80c2a976
commit
61762b9387
12 changed files with 62 additions and 46 deletions
|
@ -2749,16 +2749,13 @@ _PyInterpreterFrame *
|
|||
_PyEval_GetFrame(void)
|
||||
{
|
||||
PyThreadState *tstate = _PyThreadState_GET();
|
||||
return tstate->cframe->current_frame;
|
||||
return _PyThreadState_GetFrame(tstate);
|
||||
}
|
||||
|
||||
PyFrameObject *
|
||||
PyEval_GetFrame(void)
|
||||
{
|
||||
_PyInterpreterFrame *frame = _PyEval_GetFrame();
|
||||
while (frame && _PyFrame_IsIncomplete(frame)) {
|
||||
frame = frame->previous;
|
||||
}
|
||||
if (frame == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
@ -2772,7 +2769,7 @@ PyEval_GetFrame(void)
|
|||
PyObject *
|
||||
_PyEval_GetBuiltins(PyThreadState *tstate)
|
||||
{
|
||||
_PyInterpreterFrame *frame = tstate->cframe->current_frame;
|
||||
_PyInterpreterFrame *frame = _PyThreadState_GetFrame(tstate);
|
||||
if (frame != NULL) {
|
||||
return frame->f_builtins;
|
||||
}
|
||||
|
@ -2811,7 +2808,7 @@ PyObject *
|
|||
PyEval_GetLocals(void)
|
||||
{
|
||||
PyThreadState *tstate = _PyThreadState_GET();
|
||||
_PyInterpreterFrame *current_frame = tstate->cframe->current_frame;
|
||||
_PyInterpreterFrame *current_frame = _PyThreadState_GetFrame(tstate);
|
||||
if (current_frame == NULL) {
|
||||
_PyErr_SetString(tstate, PyExc_SystemError, "frame does not exist");
|
||||
return NULL;
|
||||
|
@ -2830,7 +2827,7 @@ PyObject *
|
|||
PyEval_GetGlobals(void)
|
||||
{
|
||||
PyThreadState *tstate = _PyThreadState_GET();
|
||||
_PyInterpreterFrame *current_frame = tstate->cframe->current_frame;
|
||||
_PyInterpreterFrame *current_frame = _PyThreadState_GetFrame(tstate);
|
||||
if (current_frame == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
|
|
@ -96,10 +96,7 @@ take_ownership(PyFrameObject *f, _PyInterpreterFrame *frame)
|
|||
}
|
||||
assert(!_PyFrame_IsIncomplete(frame));
|
||||
assert(f->f_back == NULL);
|
||||
_PyInterpreterFrame *prev = frame->previous;
|
||||
while (prev && _PyFrame_IsIncomplete(prev)) {
|
||||
prev = prev->previous;
|
||||
}
|
||||
_PyInterpreterFrame *prev = _PyFrame_GetFirstComplete(frame->previous);
|
||||
frame->previous = NULL;
|
||||
if (prev) {
|
||||
assert(prev->owner != FRAME_OWNED_BY_CSTACK);
|
||||
|
|
|
@ -1302,10 +1302,7 @@ PyFrameObject*
|
|||
PyThreadState_GetFrame(PyThreadState *tstate)
|
||||
{
|
||||
assert(tstate != NULL);
|
||||
_PyInterpreterFrame *f = tstate->cframe->current_frame;
|
||||
while (f && _PyFrame_IsIncomplete(f)) {
|
||||
f = f->previous;
|
||||
}
|
||||
_PyInterpreterFrame *f = _PyThreadState_GetFrame(tstate);
|
||||
if (f == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
@ -1431,9 +1428,7 @@ _PyThread_CurrentFrames(void)
|
|||
PyThreadState *t;
|
||||
for (t = i->threads.head; t != NULL; t = t->next) {
|
||||
_PyInterpreterFrame *frame = t->cframe->current_frame;
|
||||
while (frame && _PyFrame_IsIncomplete(frame)) {
|
||||
frame = frame->previous;
|
||||
}
|
||||
frame = _PyFrame_GetFirstComplete(frame);
|
||||
if (frame == NULL) {
|
||||
continue;
|
||||
}
|
||||
|
|
|
@ -1884,13 +1884,10 @@ sys__getframe_impl(PyObject *module, int depth)
|
|||
|
||||
if (frame != NULL) {
|
||||
while (depth > 0) {
|
||||
frame = frame->previous;
|
||||
frame = _PyFrame_GetFirstComplete(frame->previous);
|
||||
if (frame == NULL) {
|
||||
break;
|
||||
}
|
||||
if (_PyFrame_IsIncomplete(frame)) {
|
||||
continue;
|
||||
}
|
||||
--depth;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue