Skip to content

Commit d53e184

Browse files
committed
Make sure that frames are correctly deferred
1 parent 9201ae5 commit d53e184

File tree

5 files changed

+42
-0
lines changed

5 files changed

+42
-0
lines changed

Objects/genobject.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,9 @@ gen_send_ex2(PyGenObject *gen, PyObject *arg, PyObject **presult,
226226
gen->gi_frame_state = FRAME_EXECUTING;
227227
EVAL_CALL_STAT_INC(EVAL_CALL_GENERATOR);
228228
PyObject *result = _PyEval_EvalFrame(tstate, frame, exc);
229+
if (frame->references_immediate) {
230+
_PyFrame_Defer(frame, tstate->interp);
231+
}
229232
assert(tstate->exc_info == prev_exc_info);
230233
assert(gen->gi_exc_state.previous_item == NULL);
231234
assert(gen->gi_frame_state != FRAME_EXECUTING);

Python/bytecodes.c

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -953,6 +953,9 @@ dummy_func(
953953
_PyInterpreterFrame *dying = frame;
954954
frame = tstate->current_frame = dying->previous;
955955
_PyEval_FrameClearAndPop(tstate, dying);
956+
if (frame->references_immediate) {
957+
_PyFrame_Defer(frame, tstate->interp);
958+
}
956959
_PyFrame_StackPush(frame, retval);
957960
LOAD_IP(frame->return_offset);
958961
goto resume_frame;
@@ -977,6 +980,9 @@ dummy_func(
977980
_PyInterpreterFrame *dying = frame;
978981
frame = tstate->current_frame = dying->previous;
979982
_PyEval_FrameClearAndPop(tstate, dying);
983+
if (frame->references_immediate) {
984+
_PyFrame_Defer(frame, tstate->interp);
985+
}
980986
_PyFrame_StackPush(frame, PyStackRef_FromPyObjectSteal(retval));
981987
LOAD_IP(frame->return_offset);
982988
goto resume_frame;
@@ -1192,6 +1198,9 @@ dummy_func(
11921198
_PyInterpreterFrame *gen_frame = frame;
11931199
frame = tstate->current_frame = frame->previous;
11941200
gen_frame->previous = NULL;
1201+
if (frame->references_immediate) {
1202+
_PyFrame_Defer(frame, tstate->interp);
1203+
}
11951204
_PyFrame_StackPush(frame, retval);
11961205
/* We don't know which of these is relevant here, so keep them equal */
11971206
assert(INLINE_CACHE_ENTRIES_SEND == INLINE_CACHE_ENTRIES_FOR_ITER);
@@ -1219,6 +1228,9 @@ dummy_func(
12191228
_PyInterpreterFrame *gen_frame = frame;
12201229
frame = tstate->current_frame = frame->previous;
12211230
gen_frame->previous = NULL;
1231+
if (frame->references_immediate) {
1232+
_PyFrame_Defer(frame, tstate->interp);
1233+
}
12221234
/* We don't know which of these is relevant here, so keep them equal */
12231235
assert(INLINE_CACHE_ENTRIES_SEND == INLINE_CACHE_ENTRIES_FOR_ITER);
12241236
#if TIER_ONE
@@ -4382,6 +4394,9 @@ dummy_func(
43824394
_PyInterpreterFrame *prev = frame->previous;
43834395
_PyThreadState_PopFrame(tstate, frame);
43844396
frame = tstate->current_frame = prev;
4397+
if (frame->references_immediate) {
4398+
_PyFrame_Defer(frame, tstate->interp);
4399+
}
43854400
LOAD_IP(frame->return_offset);
43864401
LOAD_SP();
43874402
LLTRACE_RESUME_FRAME();

Python/ceval.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1000,6 +1000,9 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int
10001000
}
10011001

10021002
resume_with_error:
1003+
if (frame->references_immediate) {
1004+
_PyFrame_Defer(frame, tstate->interp);
1005+
}
10031006
next_instr = frame->instr_ptr;
10041007
stack_pointer = _PyFrame_GetStackPointer(frame);
10051008
goto error;

Python/executor_cases.c.h

Lines changed: 6 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Python/generated_cases.c.h

Lines changed: 15 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)