python / python/cpython

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

未关闭
#136,190 2 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看

还没有人认领这个 Issue。

3.13 3.14 3.15 interpreter-core type-bug
主要语言
Python
星标
77.2k
派生
35.9k
PR 合并指标
PR 指标待抓取

描述

Bug report

Bug description:

(from https://github.com/nedbat/coveragepy/issues/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

Linked PRs
  • gh-136923

贡献指南

打开贡献指南

从这里开始

  1. 先读完整个 Issue,再读项目的贡献指南。
  2. 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
  3. Fork 仓库,在一个分支上完成修改。
  4. 提交 Pull Request,并在描述里引用这个 Issue 编号。

调研方向

使用 python3.14 -m dis -O b1991.py 重现 b1991.py 中的报告,然后检查生成的反汇编中单行条件语句是如何分配行信息的。当偏移量 40 归属于第 2 行,且不会导致其他显示的行映射发生回归时,修改即完成;gh-136923 表明相关工作可能已经在进行中。

由索引模型根据 Issue 内容生成。

评估

技术栈
python
领域
compilers
Issue 类型
缺陷
难度
4/5
预计耗时
3-5 天
活跃度
停滞
描述清晰度
基本清楚
新手友好度
35/100

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。