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 中的報告,然後檢查產生的反組譯中單行條件式是如何指派行資訊的。當 offset 40 歸屬於第 2 行,且不會導致其他顯示的行對應發生回歸時,修改即完成;gh-136923 表示相關工作可能已經在進行中。

由索引模型根據 Issue 內容生成。

評估

技術堆疊
python
領域
compilers
Issue 類型
缺陷
難度
4/5
預估耗時
3-5 天
活躍度
停滯
描述清晰度
基本清楚
新手友好度
35/100

把新 issue 寄到你的電子郵件信箱

精選適合新手參與的 GitHub issue 摘要。