Skip to content

Source locations of comprehension bytecode are incorrect #98461

Closed
@iritkatriel

Description

@iritkatriel
def f():
  [(x,
   2*x) 
   for x
   in [1,2,3] if (x > 0 
                  and x < 100
                  and x != 50)]

f = f.__code__.co_consts[1]


import dis
from pprint import pprint as pp
def pos(p):
    return (p.lineno, p.end_lineno, p.col_offset, p.end_col_offset)
 
pp([(pos(x.positions), x.opname, x.argval) for x in dis.get_instructions(f)])

The output is:

[((3, 3, 0, 0), 'RESUME', 0),
 ((3, 8, 2, 31), 'BUILD_LIST', 0),
 ((3, 8, 2, 31), 'LOAD_FAST', '.0'),
 ((3, 8, 2, 31), 'FOR_ITER', 66),
 ((5, 5, 7, 8), 'STORE_FAST', 'x'),
 ((6, 6, 18, 19), 'LOAD_FAST', 'x'),
 ((6, 6, 22, 23), 'LOAD_CONST', 0),
 ((6, 6, 18, 23), 'COMPARE_OP', '>'),
 ((6, 6, 18, 23), 'POP_JUMP_IF_FALSE', 64),
 ((7, 7, 22, 23), 'LOAD_FAST', 'x'),
 ((7, 7, 26, 29), 'LOAD_CONST', 100),
 ((7, 7, 22, 29), 'COMPARE_OP', '<'),
 ((7, 7, 22, 29), 'POP_JUMP_IF_FALSE', 64),
 ((8, 8, 22, 23), 'LOAD_FAST', 'x'),
 ((8, 8, 27, 29), 'LOAD_CONST', 50),
 ((8, 8, 22, 29), 'COMPARE_OP', '!='),
 ((8, 8, 22, 29), 'POP_JUMP_IF_TRUE', 50),
 ((None, None, None, None), 'JUMP_BACKWARD', 6),
 ((3, 3, 4, 5), 'LOAD_FAST', 'x'),
 ((4, 4, 3, 4), 'LOAD_CONST', 2),
 ((4, 4, 5, 6), 'LOAD_FAST', 'x'),
 ((4, 4, 3, 6), 'BINARY_OP', 5),
 ((3, 4, 3, 7), 'BUILD_TUPLE', 2),
 ((8, 8, 22, 29), 'LIST_APPEND', 2),                     <-- incorrect from here to the end
 ((8, 8, 22, 29), 'JUMP_BACKWARD', 6),
 ((8, 8, 22, 29), 'RETURN_VALUE', None)]

Metadata

Metadata

Assignees

Labels

3.12only security fixesinterpreter-core(Objects, Python, Grammar, and Parser dirs)type-bugAn unexpected behavior, bug, or error

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions