summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Lib/test/test_compile.py14
-rw-r--r--Misc/NEWS.d/next/Core and Builtins/2023-08-21-21-13-30.gh-issue-107901.hszvdk.rst1
-rw-r--r--Python/flowgraph.c2
3 files changed, 16 insertions, 1 deletions
diff --git a/Lib/test/test_compile.py b/Lib/test/test_compile.py
index 2ed8ae0..a470d61 100644
--- a/Lib/test/test_compile.py
+++ b/Lib/test/test_compile.py
@@ -1031,6 +1031,20 @@ class TestSpecifics(unittest.TestCase):
code_lines = self.get_code_lines(test.__code__)
self.assertEqual(expected_lines, code_lines)
+ def test_lineno_of_backward_jump(self):
+ # Issue gh-107901
+ def f():
+ for i in x:
+ if y:
+ pass
+
+ linenos = list(inst.positions.lineno
+ for inst in dis.get_instructions(f.__code__)
+ if inst.opname == 'JUMP_BACKWARD')
+
+ self.assertTrue(len(linenos) > 0)
+ self.assertTrue(all(l is not None for l in linenos))
+
def test_big_dict_literal(self):
# The compiler has a flushing point in "compiler_dict" that calls compiles
# a portion of the dictionary literal when the loop that iterates over the items
diff --git a/Misc/NEWS.d/next/Core and Builtins/2023-08-21-21-13-30.gh-issue-107901.hszvdk.rst b/Misc/NEWS.d/next/Core and Builtins/2023-08-21-21-13-30.gh-issue-107901.hszvdk.rst
new file mode 100644
index 0000000..112e093
--- /dev/null
+++ b/Misc/NEWS.d/next/Core and Builtins/2023-08-21-21-13-30.gh-issue-107901.hszvdk.rst
@@ -0,0 +1 @@
+Fix missing line number on :opcode:`JUMP_BACKWARD` at the end of a for loop.
diff --git a/Python/flowgraph.c b/Python/flowgraph.c
index 9d78656..719ed92 100644
--- a/Python/flowgraph.c
+++ b/Python/flowgraph.c
@@ -531,7 +531,7 @@ normalize_jumps_in_block(cfg_builder *g, basicblock *b) {
if (backwards_jump == NULL) {
return ERROR;
}
- basicblock_addop(backwards_jump, JUMP, target->b_label.id, NO_LOCATION);
+ basicblock_addop(backwards_jump, JUMP, target->b_label.id, last->i_loc);
backwards_jump->b_instr[0].i_target = target;
last->i_opcode = reversed_opcode;
last->i_target = b->b_next;