https://github.com/python/cpython/commit/af20b880fc14c5a397f2f160877b94cb3d69f45c
commit: af20b880fc14c5a397f2f160877b94cb3d69f45c
branch: 3.14
author: Mikhail Efimov <[email protected]>
committer: Fidget-Spinner <[email protected]>
date: 2025-11-13T18:47:25Z
summary:
[3.14] gh-140104: Set next_instr properly in the JIT during exceptions
(GH-140233) (GH-141495)
files:
A
Misc/NEWS.d/next/Core_and_Builtins/2025-10-16-21-47-00.gh-issue-140104.A8SQIm.rst
M Lib/test/test_capi/test_opt.py
M Python/ceval_macros.h
diff --git a/Lib/test/test_capi/test_opt.py b/Lib/test/test_capi/test_opt.py
index 1860325cba616d..be3f8895db5d09 100644
--- a/Lib/test/test_capi/test_opt.py
+++ b/Lib/test/test_capi/test_opt.py
@@ -1992,6 +1992,27 @@ def gen():
next(g)
""" % _testinternalcapi.SPECIALIZATION_THRESHOLD))
+ def test_next_instr_for_exception_handler_set(self):
+ # gh-140104: We just want the exception to be caught properly.
+ def f():
+ for i in range(TIER2_THRESHOLD + 3):
+ try:
+ undefined_variable(i)
+ except Exception:
+ pass
+
+ f()
+
+ def test_next_instr_for_exception_handler_set_lasts_instr(self):
+ # gh-140104: We just want the exception to be caught properly.
+ def f():
+ a_list = []
+ for _ in range(TIER2_THRESHOLD + 3):
+ try:
+ a_list[""] = 0
+ except Exception:
+ pass
+
def global_identity(x):
return x
diff --git
a/Misc/NEWS.d/next/Core_and_Builtins/2025-10-16-21-47-00.gh-issue-140104.A8SQIm.rst
b/Misc/NEWS.d/next/Core_and_Builtins/2025-10-16-21-47-00.gh-issue-140104.A8SQIm.rst
new file mode 100644
index 00000000000000..1c18cbc9ad0588
--- /dev/null
+++
b/Misc/NEWS.d/next/Core_and_Builtins/2025-10-16-21-47-00.gh-issue-140104.A8SQIm.rst
@@ -0,0 +1,2 @@
+Fix a bug with exception handling in the JIT. Patch by Ken Jin. Bug reported
+by Daniel Diniz.
diff --git a/Python/ceval_macros.h b/Python/ceval_macros.h
index 37c4b00f86df25..4a878d6dff4353 100644
--- a/Python/ceval_macros.h
+++ b/Python/ceval_macros.h
@@ -376,7 +376,9 @@ do { \
frame = tstate->current_frame; \
stack_pointer = _PyFrame_GetStackPointer(frame); \
if (next_instr == NULL) { \
- next_instr = frame->instr_ptr; \
+ /* gh-140104: The exception handler expects frame->instr_ptr
+ to after this_instr, not this_instr! */ \
+ next_instr = frame->instr_ptr + 1; \
JUMP_TO_LABEL(error); \
} \
DISPATCH(); \
@@ -404,7 +406,9 @@ do { \
stack_pointer = _PyFrame_GetStackPointer(frame); \
if (next_instr == NULL) \
{ \
- next_instr = frame->instr_ptr; \
+ /* gh-140104: The exception handler expects frame->instr_ptr
+ to after this_instr, not this_instr! */ \
+ next_instr = frame->instr_ptr + 1; \
goto error; \
} \
DISPATCH(); \
_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3//lists/python-checkins.python.org
Member address: [email protected]