mirror of
https://github.com/python/cpython.git
synced 2025-08-30 13:38:43 +00:00
gh-111354: Simplify _PyGen_yf by moving some of its work to the compiler and frame state (#111648)
This commit is contained in:
parent
7810b6981a
commit
d49aba5a7a
16 changed files with 342 additions and 338 deletions
|
@ -1049,7 +1049,9 @@ dummy_func(
|
|||
assert(frame != &entry_frame);
|
||||
frame->instr_ptr = next_instr;
|
||||
PyGenObject *gen = _PyFrame_GetGenerator(frame);
|
||||
gen->gi_frame_state = FRAME_SUSPENDED;
|
||||
assert(FRAME_SUSPENDED_YIELD_FROM == FRAME_SUSPENDED + 1);
|
||||
assert(oparg == 0 || oparg == 1);
|
||||
gen->gi_frame_state = FRAME_SUSPENDED + oparg;
|
||||
_PyFrame_SetStackPointer(frame, stack_pointer - 1);
|
||||
int err = _Py_call_instrumentation_arg(
|
||||
tstate, PY_MONITORING_EVENT_PY_YIELD,
|
||||
|
@ -1075,7 +1077,9 @@ dummy_func(
|
|||
assert(frame != &entry_frame);
|
||||
frame->instr_ptr = next_instr;
|
||||
PyGenObject *gen = _PyFrame_GetGenerator(frame);
|
||||
gen->gi_frame_state = FRAME_SUSPENDED;
|
||||
assert(FRAME_SUSPENDED_YIELD_FROM == FRAME_SUSPENDED + 1);
|
||||
assert(oparg == 0 || oparg == 1);
|
||||
gen->gi_frame_state = FRAME_SUSPENDED + oparg;
|
||||
_PyFrame_SetStackPointer(frame, stack_pointer - 1);
|
||||
tstate->exc_info = gen->gi_exc_state.previous_item;
|
||||
gen->gi_exc_state.previous_item = NULL;
|
||||
|
|
|
@ -1549,7 +1549,7 @@ compiler_add_yield_from(struct compiler *c, location loc, int await)
|
|||
// Set up a virtual try/except to handle when StopIteration is raised during
|
||||
// a close or throw call. The only way YIELD_VALUE raises if they do!
|
||||
ADDOP_JUMP(c, loc, SETUP_FINALLY, fail);
|
||||
ADDOP(c, loc, YIELD_VALUE);
|
||||
ADDOP_I(c, loc, YIELD_VALUE, 1);
|
||||
ADDOP(c, NO_LOCATION, POP_BLOCK);
|
||||
ADDOP_I(c, loc, RESUME, await ? RESUME_AFTER_AWAIT : RESUME_AFTER_YIELD_FROM);
|
||||
ADDOP_JUMP(c, loc, JUMP_NO_INTERRUPT, send);
|
||||
|
@ -4159,7 +4159,7 @@ addop_yield(struct compiler *c, location loc) {
|
|||
if (c->u->u_ste->ste_generator && c->u->u_ste->ste_coroutine) {
|
||||
ADDOP_I(c, loc, CALL_INTRINSIC_1, INTRINSIC_ASYNC_GEN_WRAP);
|
||||
}
|
||||
ADDOP(c, loc, YIELD_VALUE);
|
||||
ADDOP_I(c, loc, YIELD_VALUE, 0);
|
||||
ADDOP_I(c, loc, RESUME, RESUME_AFTER_YIELD);
|
||||
return SUCCESS;
|
||||
}
|
||||
|
|
8
Python/generated_cases.c.h
generated
8
Python/generated_cases.c.h
generated
|
@ -1501,7 +1501,9 @@
|
|||
assert(frame != &entry_frame);
|
||||
frame->instr_ptr = next_instr;
|
||||
PyGenObject *gen = _PyFrame_GetGenerator(frame);
|
||||
gen->gi_frame_state = FRAME_SUSPENDED;
|
||||
assert(FRAME_SUSPENDED_YIELD_FROM == FRAME_SUSPENDED + 1);
|
||||
assert(oparg == 0 || oparg == 1);
|
||||
gen->gi_frame_state = FRAME_SUSPENDED + oparg;
|
||||
_PyFrame_SetStackPointer(frame, stack_pointer - 1);
|
||||
int err = _Py_call_instrumentation_arg(
|
||||
tstate, PY_MONITORING_EVENT_PY_YIELD,
|
||||
|
@ -1532,7 +1534,9 @@
|
|||
assert(frame != &entry_frame);
|
||||
frame->instr_ptr = next_instr;
|
||||
PyGenObject *gen = _PyFrame_GetGenerator(frame);
|
||||
gen->gi_frame_state = FRAME_SUSPENDED;
|
||||
assert(FRAME_SUSPENDED_YIELD_FROM == FRAME_SUSPENDED + 1);
|
||||
assert(oparg == 0 || oparg == 1);
|
||||
gen->gi_frame_state = FRAME_SUSPENDED + oparg;
|
||||
_PyFrame_SetStackPointer(frame, stack_pointer - 1);
|
||||
tstate->exc_info = gen->gi_exc_state.previous_item;
|
||||
gen->gi_exc_state.previous_item = NULL;
|
||||
|
|
2
Python/opcode_targets.h
generated
2
Python/opcode_targets.h
generated
|
@ -44,7 +44,6 @@ static void *opcode_targets[256] = {
|
|||
&&TARGET_UNARY_NEGATIVE,
|
||||
&&TARGET_UNARY_NOT,
|
||||
&&TARGET_WITH_EXCEPT_START,
|
||||
&&TARGET_YIELD_VALUE,
|
||||
&&TARGET_BINARY_OP,
|
||||
&&TARGET_BUILD_CONST_KEY_MAP,
|
||||
&&TARGET_BUILD_LIST,
|
||||
|
@ -118,6 +117,7 @@ static void *opcode_targets[256] = {
|
|||
&&TARGET_SWAP,
|
||||
&&TARGET_UNPACK_EX,
|
||||
&&TARGET_UNPACK_SEQUENCE,
|
||||
&&TARGET_YIELD_VALUE,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue