https://github.com/python/cpython/commit/35ed3e4cedc8aef3936da81a6b64e90374532b13
commit: 35ed3e4cedc8aef3936da81a6b64e90374532b13
branch: main
author: Mikhail Efimov <[email protected]>
committer: Fidget-Spinner <[email protected]>
date: 2025-11-12T19:04:02Z
summary:
gh-140936: Fix JIT assertion crash at finalization if some generator is alive
(GH-140969)
files:
M Lib/test/test_capi/test_opt.py
M Python/optimizer.c
diff --git a/Lib/test/test_capi/test_opt.py b/Lib/test/test_capi/test_opt.py
index 4e94f62d35eba2..e65556fb28f92d 100644
--- a/Lib/test/test_capi/test_opt.py
+++ b/Lib/test/test_capi/test_opt.py
@@ -2660,6 +2660,25 @@ def f():
f()
+ def test_interpreter_finalization_with_generator_alive(self):
+ script_helper.assert_python_ok("-c", textwrap.dedent("""
+ import sys
+ t = tuple(range(%d))
+ def simple_for():
+ for x in t:
+ x
+
+ def gen():
+ try:
+ yield
+ except:
+ simple_for()
+
+ sys.settrace(lambda *args: None)
+ simple_for()
+ g = gen()
+ next(g)
+ """ % _testinternalcapi.SPECIALIZATION_THRESHOLD))
def global_identity(x):
diff --git a/Python/optimizer.c b/Python/optimizer.c
index f44f8a9614b846..3b7e2dafab85bb 100644
--- a/Python/optimizer.c
+++ b/Python/optimizer.c
@@ -118,7 +118,13 @@ _PyOptimizer_Optimize(
{
_PyStackRef *stack_pointer = frame->stackpointer;
PyInterpreterState *interp = _PyInterpreterState_GET();
- assert(interp->jit);
+ if (!interp->jit) {
+ // gh-140936: It is possible that interp->jit will become false during
+ // interpreter finalization. However, the specialized JUMP_BACKWARD_JIT
+ // instruction may still be present. In this case, we should
+ // return immediately without optimization.
+ return 0;
+ }
assert(!interp->compiling);
#ifndef Py_GIL_DISABLED
interp->compiling = true;
_______________________________________________
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]