3.14 is missing a bytecode line number for one-line conditionals · Issue #136190 · python/cpython · GitHub | Latest TMZ Celebrity News & Gossip | Watch TMZ Live
Skip to content

3.14 is missing a bytecode line number for one-line conditionals #136190

Open
@nedbat

Description

@nedbat

Bug report

Bug description:

(from nedbat/coveragepy#1991)

Here is b1991.py:

% cat b1991.py
def func(x, y):
    for size in (x or ()) if y else ():
        print(size)

func([3], True)

The disassembly looks like this:

% python3.14 -m dis -O b1991.py
  0          0       RESUME                   0

  1          2       LOAD_CONST               0 (<code object func at 0x1045ef0e0, file "b1991.py", line 1>)
             4       MAKE_FUNCTION
             6       STORE_NAME               0 (func)

  5          8       LOAD_NAME                0 (func)
            10       PUSH_NULL
            12       LOAD_SMALL_INT           3
            14       BUILD_LIST               1
            16       LOAD_CONST               1 (True)
            18       CALL                     2
            26       POP_TOP
            28       LOAD_CONST               2 (None)
            30       RETURN_VALUE

Disassembly of <code object func at 0x1045ef0e0, file "b1991.py", line 1>:
   1          0       RESUME                   0

   2          2       LOAD_FAST_BORROW         1 (y)
              4       TO_BOOL
             12       POP_JUMP_IF_FALSE       13 (to L2)
             16       NOT_TAKEN
             18       LOAD_FAST                0 (x)
             20       COPY                     1
             22       TO_BOOL
             30       POP_JUMP_IF_TRUE         3 (to L1)
             34       NOT_TAKEN
             36       POP_TOP
             38       LOAD_CONST               1 (())

  --   L1:   40       JUMP_FORWARD             1 (to L3)               <----------###

   2   L2:   42       LOAD_CONST               1 (())
       L3:   44       GET_ITER
       L4:   46       FOR_ITER                14 (to L5)
             50       STORE_FAST               2 (size)

   3         52       LOAD_GLOBAL              1 (print + NULL)
             62       LOAD_FAST_BORROW         2 (size)
             64       CALL                     1
             72       POP_TOP
             74       JUMP_BACKWARD           16 (to L4)

   2   L5:   78       END_FOR
             80       POP_ITER
             82       LOAD_CONST               0 (None)
             84       RETURN_VALUE

Offset 40 has no line number, but shouldn't it be attributed to line 2? The same problem happens on 3.13 and on the tip of main.

CPython versions tested on:

3.14, 3.15, CPython main branch, 3.13

Operating systems tested on:

macOS

Metadata

Metadata

Assignees

No one assigned

    Labels

    3.13bugs and security fixes3.14bugs and security fixes3.15new features, bugs and 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

      TMZ Celebrity News – Breaking Stories, Videos & Gossip

      Looking for the latest TMZ celebrity news? You've come to the right place. From shocking Hollywood scandals to exclusive videos, TMZ delivers it all in real time.

      Whether it’s a red carpet slip-up, a viral paparazzi moment, or a legal drama involving your favorite stars, TMZ news is always first to break the story. Stay in the loop with daily updates, insider tips, and jaw-dropping photos.

      🎥 Watch TMZ Live

      TMZ Live brings you daily celebrity news and interviews straight from the TMZ newsroom. Don’t miss a beat—watch now and see what’s trending in Hollywood.