python / python/cpython

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

Đang mở
#136,190 2 bình luận 0 reaction 0 người được giao Xem trên GitHub

Chưa có ai nhận issue này.

3.13 3.14 3.15 interpreter-core type-bug
Ngôn ngữ chính
Python
Star
77.2k
Fork
35.9k
Chỉ số merge pull request
Chỉ số pull request đang chờ

Mô tả

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

Hướng dẫn đóng góp

Mở hướng dẫn đóng góp

Bắt đầu từ đâu

  1. Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
  2. Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
  3. Fork repository và làm thay đổi trên một nhánh.
  4. Mở pull request có tham chiếu số hiệu của issue.

Hướng nghiên cứu

Tái hiện báo cáo từ b1991.py bằng python3.14 -m dis -O b1991.py, sau đó kiểm tra cách thông tin dòng được gán cho điều kiện một dòng trong disassembly được tạo ra. Thay đổi được hoàn tất khi offset 40 được gán cho dòng 2 mà không làm hồi quy các ánh xạ dòng khác được hiển thị; gh-136923 cho thấy công việc liên quan có thể đã đang được thực hiện.

Do mô hình lập chỉ mục viết ra từ nội dung của issue.

Đánh giá

Công nghệ
python
Lĩnh vực
compilers
Loại issue
Lỗi
Độ khó
4/5
Thời gian dự kiến
3-5 ngày
Mức độ hoạt động
Đình trệ
Độ rõ ràng
Khá rõ ràng
Mức phù hợp với người mới
35/100

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.