https://github.com/python/cpython/commit/2e216728038a03d387231f39ded091ec318ba61b
commit: 2e216728038a03d387231f39ded091ec318ba61b
branch: 3.14
author: Mikhail Efimov <[email protected]>
committer: Fidget-Spinner <[email protected]>
date: 2025-10-27T23:49:10Z
summary:

[3.14] gh-140104: Set next_instr properly in the JIT during exceptions 
(GH-140233) (GH-140687)

Co-authored-by: Ken Jin <[email protected]>
Co-authored-by: devdanzin <[email protected]>
Co-authored-by: Chris Eibl <[email protected]>

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 c74c8ee0eef8e2..bdcda12c76e1bc 100644
--- a/Lib/test/test_capi/test_opt.py
+++ b/Lib/test/test_capi/test_opt.py
@@ -1972,6 +1972,27 @@ def testfunc(n):
         assert ex is not None
         """))
 
+    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 187ec8fdd26584..df1950416c2ddd 100644
--- a/Python/ceval_macros.h
+++ b/Python/ceval_macros.h
@@ -368,7 +368,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();                                        \

_______________________________________________
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]

Reply via email to