summaryrefslogtreecommitdiffstats
path: root/Python
diff options
context:
space:
mode:
authorMark Shannon <mark@hotpy.org>2024-04-24 13:41:30 (GMT)
committerGitHub <noreply@github.com>2024-04-24 13:41:30 (GMT)
commit83235f7791fbe6ee2618192f2341de9cd22d0511 (patch)
treeeacb89c202dbf8af6a9d3cc9f99b564397cf3182 /Python
parent77cd0428b698a743844179f7babead43b2794d77 (diff)
downloadcpython-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.c3
-rw-r--r--Python/executor_cases.c.h2
-rw-r--r--Python/optimizer.c1
-rw-r--r--Python/optimizer_analysis.c3
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;