diff options
author | Irit Katriel <1055913+iritkatriel@users.noreply.github.com> | 2023-09-06 11:54:59 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-09-06 11:54:59 (GMT) |
commit | 39376cb93d40b8fe588be0c1987272b0f8c49e26 (patch) | |
tree | dcd10682f70e425c7f12c5e6e100e00339a44656 /Objects/frameobject.c | |
parent | 5f3433f210d25d366fcebfb40adf444c8f46cd59 (diff) | |
download | cpython-39376cb93d40b8fe588be0c1987272b0f8c49e26.zip cpython-39376cb93d40b8fe588be0c1987272b0f8c49e26.tar.gz cpython-39376cb93d40b8fe588be0c1987272b0f8c49e26.tar.bz2 |
gh-108991: replace _PyFrame_GetState by two simpler functions (#108992)
Diffstat (limited to 'Objects/frameobject.c')
-rw-r--r-- | Objects/frameobject.c | 51 |
1 files changed, 20 insertions, 31 deletions
diff --git a/Objects/frameobject.c b/Objects/frameobject.c index 28f5a5a..7017cc6 100644 --- a/Objects/frameobject.c +++ b/Objects/frameobject.c @@ -591,39 +591,28 @@ first_line_not_before(int *lines, int len, int line) return result; } -static PyFrameState -_PyFrame_GetState(PyFrameObject *frame) +static bool +frame_is_cleared(PyFrameObject *frame) { assert(!_PyFrame_IsIncomplete(frame->f_frame)); if (frame->f_frame->stacktop == 0) { - return FRAME_CLEARED; + return true; } - switch(frame->f_frame->owner) { - case FRAME_OWNED_BY_GENERATOR: - { - PyGenObject *gen = _PyFrame_GetGenerator(frame->f_frame); - return gen->gi_frame_state; - } - case FRAME_OWNED_BY_THREAD: - { - if (_PyInterpreterFrame_LASTI(frame->f_frame) < 0) { - return FRAME_CREATED; - } - switch (frame->f_frame->prev_instr->op.code) - { - case COPY_FREE_VARS: - case MAKE_CELL: - case RETURN_GENERATOR: - /* Frame not fully initialized */ - return FRAME_CREATED; - default: - return FRAME_EXECUTING; - } - } - case FRAME_OWNED_BY_FRAME_OBJECT: - return FRAME_COMPLETED; + if (frame->f_frame->owner == FRAME_OWNED_BY_GENERATOR) { + PyGenObject *gen = _PyFrame_GetGenerator(frame->f_frame); + return gen->gi_frame_state == FRAME_CLEARED; + } + return false; +} + +static bool frame_is_suspended(PyFrameObject *frame) +{ + assert(!_PyFrame_IsIncomplete(frame->f_frame)); + if (frame->f_frame->owner == FRAME_OWNED_BY_GENERATOR) { + PyGenObject *gen = _PyFrame_GetGenerator(frame->f_frame); + return gen->gi_frame_state == FRAME_SUSPENDED; } - Py_UNREACHABLE(); + return false; } /* Setter for f_lineno - you can set f_lineno from within a trace function in @@ -655,7 +644,7 @@ frame_setlineno(PyFrameObject *f, PyObject* p_new_lineno, void *Py_UNUSED(ignore return -1; } - PyFrameState state = _PyFrame_GetState(f); + bool is_suspended = frame_is_suspended(f); /* * This code preserves the historical restrictions on * setting the line number of a frame. @@ -811,7 +800,7 @@ frame_setlineno(PyFrameObject *f, PyObject* p_new_lineno, void *Py_UNUSED(ignore } assert(unbound == 0); } - if (state == FRAME_SUSPENDED) { + if (is_suspended) { /* Account for value popped by yield */ start_stack = pop_value(start_stack); } @@ -1455,7 +1444,7 @@ void PyFrame_LocalsToFast(PyFrameObject *f, int clear) { assert(!_PyFrame_IsIncomplete(f->f_frame)); - if (f && f->f_fast_as_locals && _PyFrame_GetState(f) != FRAME_CLEARED) { + if (f && f->f_fast_as_locals && !frame_is_cleared(f)) { _PyFrame_LocalsToFast(f->f_frame, clear); f->f_fast_as_locals = 0; } |