assert ex is not None
"""))
+ 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):
return x
_PyExecutorObject **executor_ptr, int chain_depth)
{
_PyStackRef *stack_pointer = frame->stackpointer;
- assert(_PyInterpreterState_GET()->jit);
+ PyInterpreterState *interp = _PyInterpreterState_GET();
+ 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;
+ }
// The first executor in a chain and the MAX_CHAIN_DEPTH'th executor *must*
// make progress in order to avoid infinite loops or excessively-long
// side-exit chains. We can only insert the executor into the bytecode if