From 83235f7791fbe6ee2618192f2341de9cd22d0511 Mon Sep 17 00:00:00 2001 From: Mark Shannon Date: Wed, 24 Apr 2024 14:41:30 +0100 Subject: GH-115419: Move setting the instruction pointer to error exit stubs (GH-118088) --- Lib/test/test_capi/test_opt.py | 2 +- Python/bytecodes.c | 3 ++- Python/executor_cases.c.h | 2 ++ Python/optimizer.c | 1 + Python/optimizer_analysis.c | 3 --- 5 files changed, 6 insertions(+), 5 deletions(-) diff --git a/Lib/test/test_capi/test_opt.py b/Lib/test/test_capi/test_opt.py index ae23ead..c004f46 100644 --- a/Lib/test/test_capi/test_opt.py +++ b/Lib/test/test_capi/test_opt.py @@ -231,7 +231,7 @@ class TestUops(unittest.TestCase): ex = get_first_executor(testfunc) self.assertIsNotNone(ex) uops = get_opnames(ex) - self.assertIn("_SET_IP", uops) + self.assertIn("_JUMP_TO_TOP", uops) self.assertIn("_LOAD_FAST_0", uops) def test_extended_arg(self): 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; -- cgit v0.12