]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
[3.12] gh-107901: Fix missing line number on BACKWARD_JUMP at the end of a for loop...
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Tue, 22 Aug 2023 14:15:34 +0000 (07:15 -0700)
committerGitHub <noreply@github.com>
Tue, 22 Aug 2023 14:15:34 +0000 (16:15 +0200)
gh-107901: Fix missing line number on BACKWARD_JUMP at the end of a for loop (GH-108242)
(cherry picked from commit a1cc74c4eebc55795877eb3be019a1bec34402f8)

Co-authored-by: Irit Katriel <1055913+iritkatriel@users.noreply.github.com>
Lib/test/test_compile.py
Misc/NEWS.d/next/Core and Builtins/2023-08-21-21-13-30.gh-issue-107901.hszvdk.rst [new file with mode: 0644]
Python/flowgraph.c

index 142d3f5c125b6d6bfdfa66109f3f7de606e30665..55e55c7d2884d069c883d7a1e2dd7f908eeec58a 100644 (file)
@@ -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 (file)
index 0000000..112e093
--- /dev/null
@@ -0,0 +1 @@
+Fix missing line number on :opcode:`JUMP_BACKWARD` at the end of a for loop.
index f8039a4985d948c4fede56fa2932f2a664b6c1c7..4fe581beb5fc6344a0a2d5944bef48cb7fd3a0be 100644 (file)
@@ -450,7 +450,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;