From b7b35d4e876d578102bb43cbda394d3162cb8ed3 Mon Sep 17 00:00:00 2001 From: Dino Viehland Date: Mon, 8 Sep 2025 11:56:26 -0700 Subject: [PATCH] Opcodes which consume no inputs should indicate they produced the value, not an arbitrary local --- Lib/test/test_peepholer.py | 7 +++++++ Python/flowgraph.c | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/Lib/test/test_peepholer.py b/Lib/test/test_peepholer.py index 98629df457460e..1caf6de4a14e39 100644 --- a/Lib/test/test_peepholer.py +++ b/Lib/test/test_peepholer.py @@ -1116,6 +1116,13 @@ def trace(frame, event, arg): self.assertInBytecode(f, "LOAD_FAST_BORROW") self.assertNotInBytecode(f, "LOAD_FAST_CHECK") + def test_import_from_doesnt_clobber_load_fast_borrow(self): + def f(self): + if x: pass + self.x + from shutil import ExecError + print(ExecError) + self.assertInBytecode(f, "LOAD_FAST_BORROW", "self") class DirectCfgOptimizerTests(CfgOptimizationTestCase): diff --git a/Python/flowgraph.c b/Python/flowgraph.c index 3a29845db9f7f8..18594ca2f44c0f 100644 --- a/Python/flowgraph.c +++ b/Python/flowgraph.c @@ -2891,7 +2891,7 @@ optimize_load_fast(cfg_builder *g) int num_pushed = _PyOpcode_num_pushed(opcode, oparg); int net_pushed = num_pushed - num_popped; assert(net_pushed >= 0); - for (int i = 0; i < net_pushed; i++) { + for (int j = 0; j < net_pushed; j++) { PUSH_REF(i, NOT_LOCAL); } break;