2014-04-13 17 views
5

Trong các mô-đun nội bộ như peephole, đối số của LOAD_CONST được lưu trữ trong hai byte theo sau opcode.Tại sao có thể sử dụng hơn 2^16 hằng số trong một hàm Python?

Ví dụ, macro nó sử dụng để có được lập luận của một hoạt động được thực hiện như:

#define GETARG(arr, i) ((int)((arr[i+2]<<8) + arr[i+1]))

Đối số của LOAD_CONST là một chỉ số vào mảng consts.

Vì vậy, tôi đoán có lẽ chúng tôi chỉ có thể sử dụng tối đa 2^16 hằng số trong hàm Python.

Nhưng khi tôi thử nghiệm với một hàm sử dụng hằng số 66666 (> 65536), nó vẫn chạy bình thường.

Lý do có thể là gì?

+1

Bạn đã xây dựng chức năng như thế nào? Kiểm tra 'f .__ code __. Co_consts' và xem liệu có hằng số 66666 actuall ở đó không. Có lẽ họ đã được tối ưu hóa. – user2357112

+0

@ user2357112 Có, tôi đã xác nhận rằng họ vẫn ở đó. – satoru

+0

Tôi đã xây dựng một hàm như vậy và giải mã nó bằng 'dis.dis'. Có vẻ như có một opcode 'EXTENDED_ARG' xử lý nó. – user2357112

Trả lời

6

Từ dis tài liệu:

EXTENDED_ARG (ext)

Tiền tố bất kỳ opcode trong đó có một cuộc tranh cãi quá lớn để phù hợp vào mặc định hai byte. ext chứa hai byte bổ sung mà, được lấy cùng với đối số của mã opcode tiếp theo, bao gồm một đối số bốn byte là , là hai byte quan trọng nhất.

Nếu một mã vạch cần một đối số dài hơn 2 byte, một opcode EXTENDED_ARG cung cấp thêm 2 byte đối số.

+0

+1 .. Bằng cách này, tất cả mọi người đã từng nghe về một hàm có hơn 2^16 tham số? Hoặc thậm chí gần đó? – Ant

+0

@Ant Đây là một trường hợp rất hiếm. – satoru

Các vấn đề liên quan