diff options
author | Mark Shannon <mark@hotpy.org> | 2024-04-24 13:41:30 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-04-24 13:41:30 (GMT) |
commit | 83235f7791fbe6ee2618192f2341de9cd22d0511 (patch) | |
tree | eacb89c202dbf8af6a9d3cc9f99b564397cf3182 /Python | |
parent | 77cd0428b698a743844179f7babead43b2794d77 (diff) | |
download | cpython-83235f7791fbe6ee2618192f2341de9cd22d0511.zip cpython-83235f7791fbe6ee2618192f2341de9cd22d0511.tar.gz cpython-83235f7791fbe6ee2618192f2341de9cd22d0511.tar.bz2 |
GH-115419: Move setting the instruction pointer to error exit stubs (GH-118088)
Diffstat (limited to 'Python')
-rw-r--r-- | Python/bytecodes.c | 3 | ||||
-rw-r--r-- | Python/executor_cases.c.h | 2 | ||||
-rw-r--r-- | Python/optimizer.c | 1 | ||||
-rw-r--r-- | Python/optimizer_analysis.c | 3 |
4 files changed, 5 insertions, 4 deletions
diff --git a/Python/bytecodes.c b/Python/bytecodes.c index 1f908a9..c31617d 100644 --- a/Python/bytecodes.c +++ b/Python/bytecodes.c @@ -4226,7 +4226,8 @@ dummy_func( EXIT_TO_TRACE(); } - tier2 op(_ERROR_POP_N, (unused[oparg] --)) { + tier2 op(_ERROR_POP_N, (target/2, unused[oparg] --)) { + frame->instr_ptr = ((_Py_CODEUNIT *)_PyFrame_GetCode(frame)->co_code_adaptive) + target; SYNC_SP(); GOTO_UNWIND(); } diff --git a/Python/executor_cases.c.h b/Python/executor_cases.c.h index 43b0221..7403d6f 100644 --- a/Python/executor_cases.c.h +++ b/Python/executor_cases.c.h @@ -4210,6 +4210,8 @@ case _ERROR_POP_N: { oparg = CURRENT_OPARG(); + uint32_t target = (uint32_t)CURRENT_OPERAND(); + frame->instr_ptr = ((_Py_CODEUNIT *)_PyFrame_GetCode(frame)->co_code_adaptive) + target; stack_pointer += -oparg; GOTO_UNWIND(); break; diff --git a/Python/optimizer.c b/Python/optimizer.c index 6a8b4f3..b17c299 100644 --- a/Python/optimizer.c +++ b/Python/optimizer.c @@ -978,6 +978,7 @@ prepare_for_execution(_PyUOpInstruction *buffer, int length) current_error_target = target; make_exit(&buffer[next_spare], _ERROR_POP_N, 0); buffer[next_spare].oparg = popped; + buffer[next_spare].operand = target; next_spare++; } buffer[i].error_target = current_error; diff --git a/Python/optimizer_analysis.c b/Python/optimizer_analysis.c index 76de6e5..a76edd6 100644 --- a/Python/optimizer_analysis.c +++ b/Python/optimizer_analysis.c @@ -554,9 +554,6 @@ remove_unneeded_uops(_PyUOpInstruction *buffer, int buffer_size) needs_ip = true; may_have_escaped = true; } - if (_PyUop_Flags[opcode] & HAS_ERROR_FLAG) { - needs_ip = true; - } if (needs_ip && last_set_ip >= 0) { if (buffer[last_set_ip].opcode == _CHECK_VALIDITY) { buffer[last_set_ip].opcode = _CHECK_VALIDITY_AND_SET_IP; |