[3.12] gh-107901: Fix missing line number on BACKWARD_JUMP at the end of a for loop (GH-108242) (#108275)

gh-107901: Fix missing line number on BACKWARD_JUMP at the end of a for loop (GH-108242)
(cherry picked from commit a1cc74c4ee)

Co-authored-by: Irit Katriel <1055913+iritkatriel@users.noreply.github.com>
This commit is contained in:
Miss Islington (bot) 2023-08-22 07:15:34 -07:00 committed by GitHub
parent 149d70c254
commit 4ee9454792
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 16 additions and 1 deletions

View 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

View file

@ -0,0 +1 @@
Fix missing line number on :opcode:`JUMP_BACKWARD` at the end of a for loop.

View 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;