Skip to content

Commit 1b177e3

Browse files
committed
Skip clearing of old frame when returning a generator.
1 parent c080089 commit 1b177e3

File tree

1 file changed

+8
-5
lines changed

1 file changed

+8
-5
lines changed

Python/ceval.c

+8-5
Original file line numberDiff line numberDiff line change
@@ -5050,20 +5050,23 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr
50505050
_PyFrame_SetStackPointer(frame, stack_pointer);
50515051
InterpreterFrame *gen_frame = (InterpreterFrame *)gen->gi_iframe;
50525052
_PyFrame_Copy(frame, gen_frame);
5053-
frame->stacktop = 0;
5054-
Py_INCREF(frame->f_func);
5055-
Py_INCREF(frame->f_code);
50565053
assert(frame->frame_obj == NULL);
5057-
frame->f_locals = NULL;
50585054
gen->gi_frame_valid = 1;
50595055
gen_frame->is_generator = true;
50605056
gen_frame->f_state = FRAME_CREATED;
50615057
_Py_LeaveRecursiveCall(tstate);
50625058
if (!frame->is_entry) {
5063-
frame = cframe.current_frame = pop_frame(tstate, frame);
5059+
InterpreterFrame *prev = frame->previous;
5060+
_PyThreadState_PopFrame(tstate, frame);
5061+
frame = cframe.current_frame = prev;
50645062
_PyFrame_StackPush(frame, (PyObject *)gen);
50655063
goto resume_frame;
50665064
}
5065+
/* Make sure that frame is in a valid state */
5066+
frame->stacktop = 0;
5067+
frame->f_locals = NULL;
5068+
Py_INCREF(frame->f_func);
5069+
Py_INCREF(frame->f_code);
50675070
/* Restore previous cframe and return. */
50685071
tstate->cframe = cframe.previous;
50695072
tstate->cframe->use_tracing = cframe.use_tracing;

0 commit comments

Comments
 (0)