JIT (correctness): Different `UnboundLocalError` for same code with JIT on or off
Bug report
Bug description:
The following code results in two different UnboundLocalError exceptions depending on whether it's run with the JIT on or off:
def f(): if 0: class Class: pass if 0: instance = Class() for _ in range(5000): try: _ = instance.f() except Exception: pass Class.__bases__ = (object,) f()
With JIT on, the UnboundLocalError points to 'instance', while with JIT off it points to 'Class'.
Traceback with JIT on:
Traceback (most recent call last): File "/home/danzin/divergences/divergence_child_6010_3_1.py", line 17, in <module> f() ~^^ File "/home/danzin/divergences/divergence_child_6010_3_1.py", line 12, in f _ = instance.f() ^^^^^^^^ UnboundLocalError: cannot access local variable 'instance' where it is not associated with a value
Traceback with JIT off:
Traceback (most recent call last): File "/home/danzin/divergences/divergence_child_6010_3_1.py", line 17, in <module> f() ~^^ File "/home/danzin/divergences/divergence_child_6010_3_1.py", line 15, in f Class.__bases__ = (object,) ^^^^^ UnboundLocalError: cannot access local variable 'Class' where it is not associated with a value
Output for PYTHON_LLTRACE=4:
divergence_01_lltrace.txt
Output for PYTHON_OPT_DEBUG=4:
divergence_01_opt_debug.txt
Please let me know whether you're able to reproduce this issue.
Found using lafleur.
CPython versions tested on:
CPython main branch
Operating systems tested on:
Linux
Linked PRs
- gh-140104: Set next_instr properly in the JIT during exceptions #140233
- [3.14] gh-140104: Set next_instr properly in the JIT during exceptions (GH-140233) #140687
- [3.14] gh-140104: Revert "Set next_instr properly in the JIT during exceptions (GH-140233) (GH-140687)" #140890
- [3.14] gh-140104: Set next_instr properly in the JIT during exceptions (GH-140233) #141495