From 2110e0938c11e7525772770b1fa9b3440d6633a5 Mon Sep 17 00:00:00 2001 From: Ken Jin <28750310+Fidget-Spinner@users.noreply.github.com> Date: Mon, 23 Dec 2024 20:17:17 +0800 Subject: [PATCH] fix compilation from upstream --- Include/internal/pycore_uop_metadata.h | 8 ++++++++ Python/ceval.c | 9 ++------- Python/optimizer.c | 3 ++- Python/optimizer_bytecodes.c | 17 +++++++++++++---- Python/optimizer_cases.c.h | 23 +++++++++++++++++++++-- 5 files changed, 46 insertions(+), 14 deletions(-) diff --git a/Include/internal/pycore_uop_metadata.h b/Include/internal/pycore_uop_metadata.h index 3ffc44fbcc0ec8..f78893d2969436 100644 --- a/Include/internal/pycore_uop_metadata.h +++ b/Include/internal/pycore_uop_metadata.h @@ -292,6 +292,8 @@ const uint16_t _PyUop_Flags[MAX_UOP_ID+1] = { [_DEOPT] = 0, [_ERROR_POP_N] = HAS_ARG_FLAG | HAS_ESCAPES_FLAG, [_TIER2_RESUME_CHECK] = HAS_DEOPT_FLAG, + [_RETURN_OFFSET] = 0, + [_YIELD_OFFSET] = 0, }; const uint8_t _PyUop_Replication[MAX_UOP_ID+1] = { @@ -526,6 +528,7 @@ const char *const _PyOpcode_uop_name[MAX_UOP_ID+1] = { [_PY_FRAME_KW] = "_PY_FRAME_KW", [_REPLACE_WITH_TRUE] = "_REPLACE_WITH_TRUE", [_RETURN_GENERATOR] = "_RETURN_GENERATOR", + [_RETURN_OFFSET] = "_RETURN_OFFSET", [_RETURN_VALUE] = "_RETURN_VALUE", [_SAVE_RETURN_OFFSET] = "_SAVE_RETURN_OFFSET", [_SEND_GEN_FRAME] = "_SEND_GEN_FRAME", @@ -574,6 +577,7 @@ const char *const _PyOpcode_uop_name[MAX_UOP_ID+1] = { [_UNPACK_SEQUENCE_TUPLE] = "_UNPACK_SEQUENCE_TUPLE", [_UNPACK_SEQUENCE_TWO_TUPLE] = "_UNPACK_SEQUENCE_TWO_TUPLE", [_WITH_EXCEPT_START] = "_WITH_EXCEPT_START", + [_YIELD_OFFSET] = "_YIELD_OFFSET", [_YIELD_VALUE] = "_YIELD_VALUE", }; int _PyUop_num_popped(int opcode, int oparg) @@ -1125,6 +1129,10 @@ int _PyUop_num_popped(int opcode, int oparg) return oparg; case _TIER2_RESUME_CHECK: return 0; + case _RETURN_OFFSET: + return 0; + case _YIELD_OFFSET: + return 0; default: return -1; } diff --git a/Python/ceval.c b/Python/ceval.c index 24fe8f3d69a3f2..eb8f6e452fab09 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -717,13 +717,8 @@ extern void _PyUOpPrint(const _PyUOpInstruction *uop); static int base_opcode(PyCodeObject *code, int offset) { - int opcode = _Py_GetBaseOpcode(code, offset); - if (opcode == ENTER_EXECUTOR) { - int oparg = _PyCode_CODE(code)[offset].op.arg; - _PyExecutorObject *ex = code->co_executors->executors[oparg]; - return ex->vm_data.opcode; - } - return opcode; + _Py_CODEUNIT inst = _Py_GetBaseCodeUnit(code, offset); + return inst.op.code; } #endif diff --git a/Python/optimizer.c b/Python/optimizer.c index 0b5ad071df0938..b872d0ee515bec 100644 --- a/Python/optimizer.c +++ b/Python/optimizer.c @@ -804,7 +804,7 @@ translate_bytecode_to_trace( DPRINTF(2, "Trace stack underflow\n"); OPT_STAT_INC(trace_stack_underflow); ADD_TO_TRACE(uop, oparg, 0, target); - if (uop == _RETURN_GENERATOR) { + if (uop == _RETURN_GENERATOR || uop == _RETURN_VALUE) { ADD_TO_TRACE(_RETURN_OFFSET, 0, 0, 0); } else { @@ -949,6 +949,7 @@ translate_bytecode_to_trace( // SKip trunk traces where they are too short, and don't end in a _JUMP_TO_TOP. if (first || (progress_needed && trace[trace_length-1].opcode != _JUMP_TO_TOP && + trace[trace_length-1].opcode != _DYNAMIC_EXIT && (trace_length <= UOP_MIN_TRACE_LENGTH || (is_resume_trace && trace_length <= UOP_MIN_TRACE_LENGTH_RESUME)) )) { OPT_STAT_INC(trace_too_short); diff --git a/Python/optimizer_bytecodes.c b/Python/optimizer_bytecodes.c index 95d63029188eb7..4889b25784bb7a 100644 --- a/Python/optimizer_bytecodes.c +++ b/Python/optimizer_bytecodes.c @@ -702,8 +702,10 @@ dummy_func(void) { op(_RETURN_VALUE, (retval -- res)) { SAVE_STACK(); ctx->frame->stack_pointer = stack_pointer; - if (frame_pop(ctx)) { - goto done; + int err = frame_pop(ctx); + if (err) { + ctx->done = true; + break; } stack_pointer = ctx->frame->stack_pointer; @@ -727,8 +729,10 @@ dummy_func(void) { op(_RETURN_GENERATOR, ( -- res)) { SYNC_SP(); ctx->frame->stack_pointer = stack_pointer; - if (frame_pop(ctx)) { - goto done; + int err = frame_pop(ctx); + if (err) { + ctx->done = true; + break; } stack_pointer = ctx->frame->stack_pointer; res = sym_new_unknown(ctx); @@ -892,6 +896,11 @@ dummy_func(void) { ctx->done = true; } + op(_DYNAMIC_EXIT, (exit_p/4 --)) { + (void)exit_p; + ctx->done = true; + } + op(_GUARD_GLOBALS_VERSION_PUSH_KEYS, (version/1 -- globals_keys)) { globals_keys = sym_new_unknown(ctx); (void)version; diff --git a/Python/optimizer_cases.c.h b/Python/optimizer_cases.c.h index 2368572c217be8..ac6f55e72c904b 100644 --- a/Python/optimizer_cases.c.h +++ b/Python/optimizer_cases.c.h @@ -668,7 +668,11 @@ stack_pointer += -1; assert(WITHIN_STACK_BOUNDS()); ctx->frame->stack_pointer = stack_pointer; - frame_pop(ctx); + int err = frame_pop(ctx); + if (err) { + ctx->done = true; + break; + } stack_pointer = ctx->frame->stack_pointer; /* Stack space handling */ assert(corresponding_check_stack == NULL); @@ -2216,7 +2220,11 @@ case _RETURN_GENERATOR: { _Py_UopsSymbol *res; ctx->frame->stack_pointer = stack_pointer; - frame_pop(ctx); + int err = frame_pop(ctx); + if (err) { + ctx->done = true; + break; + } stack_pointer = ctx->frame->stack_pointer; res = sym_new_unknown(ctx); /* Stack space handling */ @@ -2558,6 +2566,9 @@ } case _DYNAMIC_EXIT: { + PyObject *exit_p = (PyObject *)this_instr->operand0; + (void)exit_p; + ctx->done = true; break; } @@ -2591,3 +2602,11 @@ break; } + case _RETURN_OFFSET: { + break; + } + + case _YIELD_OFFSET: { + break; + } +