Skip to content

Commit

Permalink
[3.11] pythongh-107901: Fix missing line number on BACKWARD_JUMP at t…
Browse files Browse the repository at this point in the history
…he end of a for loop
  • Loading branch information
iritkatriel committed Aug 22, 2023
1 parent 9d00379 commit c0614ba
Show file tree
Hide file tree
Showing 3 changed files with 16 additions and 1 deletion.
14 changes: 14 additions & 0 deletions Lib/test/test_compile.py
Original file line number Diff line number Diff line change
Expand Up @@ -990,6 +990,20 @@ async def test(aseq):
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
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Fix missing line number on :opcode:`JUMP_BACKWARD` at the end of a for loop.
2 changes: 1 addition & 1 deletion Python/compile.c
Original file line number Diff line number Diff line change
Expand Up @@ -3123,7 +3123,7 @@ compiler_for(struct compiler *c, stmt_ty s)
VISIT(c, expr, s->v.For.target);
VISIT_SEQ(c, stmt, s->v.For.body);
/* Mark jump as artificial */
UNSET_LOC(c);
SET_LOC(c, s->v.For.iter);
ADDOP_JUMP(c, JUMP, start);
compiler_use_next_block(c, cleanup);

Expand Down

0 comments on commit c0614ba

Please sign in to comment.