Skip to content

Commit 4eab5a0

Browse files
committed
up last_profiled_frame
1 parent f4f1020 commit 4eab5a0

6 files changed

Lines changed: 39 additions & 0 deletions

File tree

Modules/_testinternalcapi/test_cases.c.h

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

Objects/genobject.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -681,6 +681,9 @@ _gen_throw(PyGenObject *gen, int close_on_genexit,
681681
'yield from' or awaiting on with 'await'. */
682682
ret = _gen_throw((PyGenObject *)yf, close_on_genexit,
683683
typ, val, tb);
684+
if (tstate->last_profiled_frame == frame) {
685+
tstate->last_profiled_frame = prev;
686+
}
684687
tstate->current_frame = prev;
685688
frame->previous = NULL;
686689
}
@@ -701,6 +704,9 @@ _gen_throw(PyGenObject *gen, int close_on_genexit,
701704
frame->previous = prev;
702705
tstate->current_frame = frame;
703706
ret = PyObject_CallFunctionObjArgs(meth, typ, val, tb, NULL);
707+
if (tstate->last_profiled_frame == frame) {
708+
tstate->last_profiled_frame = prev;
709+
}
704710
tstate->current_frame = prev;
705711
frame->previous = NULL;
706712
Py_DECREF(meth);

Python/bytecodes.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1860,6 +1860,9 @@ dummy_func(
18601860
gen->gi_exc_state.previous_item = NULL;
18611861
_Py_LeaveRecursiveCallPy(tstate);
18621862
_PyInterpreterFrame *gen_frame = frame;
1863+
if (tstate->last_profiled_frame == gen_frame) {
1864+
tstate->last_profiled_frame = gen_frame->previous;
1865+
}
18631866
frame = tstate->current_frame = frame->previous;
18641867
gen_frame->previous = NULL;
18651868
((_PyThreadStateImpl *)tstate)->generator_return_kind = GENERATOR_YIELD;
@@ -5874,6 +5877,9 @@ dummy_func(
58745877
gen_frame->owner = FRAME_OWNED_BY_GENERATOR;
58755878
_Py_LeaveRecursiveCallPy(tstate);
58765879
_PyInterpreterFrame *prev = frame->previous;
5880+
if (tstate->last_profiled_frame == frame) {
5881+
tstate->last_profiled_frame = prev;
5882+
}
58775883
_PyThreadState_PopFrame(tstate, frame);
58785884
frame = tstate->current_frame = prev;
58795885
LOAD_IP(frame->return_offset);

Python/ceval.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2006,6 +2006,9 @@ _PyEvalFramePushAndInit(PyThreadState *tstate, _PyStackRef func,
20062006
_PyFrame_Initialize(tstate, frame, func, locals, code, 0, previous);
20072007
if (initialize_locals(tstate, func_obj, frame->localsplus, args, argcount, kwnames)) {
20082008
assert(frame->owner == FRAME_OWNED_BY_THREAD);
2009+
if (tstate->last_profiled_frame == frame) {
2010+
tstate->last_profiled_frame = tstate->current_frame;
2011+
}
20092012
clear_thread_frame(tstate, frame);
20102013
return NULL;
20112014
}

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: 9 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)