Skip to content

Commit

Permalink
pythongh-108991: replace _PyFrame_GetState by two simpler functions
Browse files Browse the repository at this point in the history
  • Loading branch information
iritkatriel committed Sep 6, 2023
1 parent deea7c8 commit bd3a0b1
Showing 1 changed file with 21 additions and 31 deletions.
52 changes: 21 additions & 31 deletions Objects/frameobject.c
Original file line number Diff line number Diff line change
Expand Up @@ -591,39 +591,29 @@ 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;
}
Py_UNREACHABLE();
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;
}
return false;

}

/* Setter for f_lineno - you can set f_lineno from within a trace function in
Expand Down Expand Up @@ -655,7 +645,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.
Expand Down Expand Up @@ -811,7 +801,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);
}
Expand Down Expand Up @@ -1455,7 +1445,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;
}
Expand Down

0 comments on commit bd3a0b1

Please sign in to comment.