diff --git a/Include/internal/pycore_opcode_utils.h b/Include/internal/pycore_opcode_utils.h index c4acb00a4b2..a6733362d3b 100644 --- a/Include/internal/pycore_opcode_utils.h +++ b/Include/internal/pycore_opcode_utils.h @@ -58,6 +58,12 @@ extern "C" { #define MAKE_FUNCTION_ANNOTATIONS 0x04 #define MAKE_FUNCTION_CLOSURE 0x08 +/* Values used in the oparg for RESUME */ +#define RESUME_AT_FUNC_START 0 +#define RESUME_AFTER_YIELD 1 +#define RESUME_AFTER_YIELD_FROM 2 +#define RESUME_AFTER_AWAIT 3 + #ifdef __cplusplus } diff --git a/Objects/genobject.c b/Objects/genobject.c index 092fd5f19b1..14771396619 100644 --- a/Objects/genobject.c +++ b/Objects/genobject.c @@ -10,6 +10,7 @@ #include "pycore_modsupport.h" // _PyArg_CheckPositional() #include "pycore_object.h" // _PyObject_GC_UNTRACK() #include "pycore_opcode_metadata.h" // _PyOpcode_Caches +#include "pycore_opcode_utils.h" // RESUME_AFTER_YIELD_FROM #include "pycore_pyerrors.h" // _PyErr_ClearExcState() #include "pycore_pystate.h" // _PyThreadState_GET() @@ -363,7 +364,7 @@ _PyGen_yf(PyGenObject *gen) assert(_PyCode_CODE(_PyGen_GetCode(gen))[0].op.code != SEND); return NULL; } - if (!is_resume(frame->instr_ptr) || frame->instr_ptr->op.arg < 2) + if (!is_resume(frame->instr_ptr) || frame->instr_ptr->op.arg < RESUME_AFTER_YIELD_FROM) { /* Not in a yield from */ return NULL; diff --git a/Python/bytecodes.c b/Python/bytecodes.c index e101efaae4c..2d7b5ba21ea 100644 --- a/Python/bytecodes.c +++ b/Python/bytecodes.c @@ -147,7 +147,7 @@ dummy_func( next_instr--; } else { - if (oparg < 2) { + if (oparg < RESUME_AFTER_YIELD_FROM) { CHECK_EVAL_BREAKER(); } next_instr[-1].op.code = RESUME_CHECK; diff --git a/Python/ceval.c b/Python/ceval.c index 61f83871016..e3a7c5f3840 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -643,7 +643,7 @@ static const _Py_CODEUNIT _Py_INTERPRETER_TRAMPOLINE_INSTRUCTIONS[] = { { .op.code = INTERPRETER_EXIT, .op.arg = 0 }, /* reached on return */ { .op.code = NOP, .op.arg = 0 }, { .op.code = INTERPRETER_EXIT, .op.arg = 0 }, /* reached on yield */ - { .op.code = RESUME, .op.arg = 0 } + { .op.code = RESUME, .op.arg = RESUME_AT_FUNC_START } }; extern const struct _PyCode_DEF(8) _Py_InitCleanup; diff --git a/Python/compile.c b/Python/compile.c index 1d9ae626677..3ff64182ba2 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -1383,7 +1383,7 @@ compiler_enter_scope(struct compiler *c, identifier name, else { RETURN_IF_ERROR(compiler_set_qualname(c)); } - ADDOP_I(c, loc, RESUME, 0); + ADDOP_I(c, loc, RESUME, RESUME_AT_FUNC_START); if (u->u_scope_type == COMPILER_SCOPE_MODULE) { loc.lineno = -1; @@ -1552,7 +1552,7 @@ compiler_add_yield_from(struct compiler *c, location loc, int await) ADDOP_JUMP(c, loc, SETUP_FINALLY, fail); ADDOP_I(c, loc, YIELD_VALUE, 0); ADDOP(c, NO_LOCATION, POP_BLOCK); - ADDOP_I(c, loc, RESUME, await ? 3 : 2); + ADDOP_I(c, loc, RESUME, await ? RESUME_AFTER_AWAIT : RESUME_AFTER_YIELD_FROM); ADDOP_JUMP(c, loc, JUMP_NO_INTERRUPT, send); USE_LABEL(c, fail); @@ -4161,7 +4161,7 @@ addop_yield(struct compiler *c, location loc) { ADDOP_I(c, loc, CALL_INTRINSIC_1, INTRINSIC_ASYNC_GEN_WRAP); } ADDOP_I(c, loc, YIELD_VALUE, 0); - ADDOP_I(c, loc, RESUME, 1); + ADDOP_I(c, loc, RESUME, RESUME_AFTER_YIELD); return SUCCESS; } diff --git a/Python/generated_cases.c.h b/Python/generated_cases.c.h index 3ae1a58b739..d5e0d849efe 100644 --- a/Python/generated_cases.c.h +++ b/Python/generated_cases.c.h @@ -23,7 +23,7 @@ next_instr--; } else { - if (oparg < 2) { + if (oparg < RESUME_AFTER_YIELD_FROM) { CHECK_EVAL_BREAKER(); } next_instr[-1].op.code = RESUME_CHECK; diff --git a/Python/specialize.c b/Python/specialize.c index cd26ff54272..07fd93d29b0 100644 --- a/Python/specialize.c +++ b/Python/specialize.c @@ -10,6 +10,7 @@ #include "pycore_moduleobject.h" #include "pycore_object.h" #include "pycore_opcode_metadata.h" // _PyOpcode_Caches +#include "pycore_opcode_utils.h" // RESUME_AT_FUNC_START #include "pycore_pylifecycle.h" // _PyOS_URandomNonblock() #include "pycore_runtime.h" // _Py_ID() @@ -2541,6 +2542,6 @@ const struct _PyCode_DEF(8) _Py_InitCleanup = { .co_code_adaptive = { EXIT_INIT_CHECK, 0, RETURN_VALUE, 0, - RESUME, 0, + RESUME, RESUME_AT_FUNC_START, } };