2014-04-13 10 views
5

W modułach wewnętrznych, takich jak peephole, argument o numerze LOAD_CONST jest przechowywany w dwóch bajtach następujących po opcode.Dlaczego można używać więcej niż 2^16 stałych w funkcji Pythona?

Na przykład, makro używa się do argumentu operacji jest implementowana jako:

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

Argument LOAD_CONST jest indeksem w tablicy consts.

Zgaduję, że być może możemy użyć maksymalnie 2^16 stałych w funkcji Pythona.

Ale kiedy eksperymentuję z funkcją, która używa stałych 66666 (> 65536), nadal działa normalnie.

Jaki może być tego powód?

+1

Jak zbudowałeś tę funkcję? Sprawdź 'f .__ code __. Co_consts' i sprawdź, czy istnieją tam stałe stałe 66666. Może zostały zoptymalizowane. – user2357112

+0

@ user2357112 Tak, potwierdziłem, że nadal tam są. – satoru

+0

Zbudowałem taką funkcję i dekompilowałem ją za pomocą 'dis.dis'. Wygląda na to, że istnieje kod operacyjny 'EXTENDED_ARG', który go obsługuje. – user2357112

Odpowiedz

6

Z dis docs:

EXTENDED_ARG (ext)

Prefiksy dowolny opcode który ma argument zbyt duży do dopasowanie do domyślnie dwa bajty. ext zawiera dwa dodatkowe bajty, które, wzięte razem z następującym argumentem opcode, zawierają czterobajtowy argument , przy czym ext jest dwoma najbardziej znaczącymi bajtami.

Jeśli kod operacyjny potrzebuje argumentu dłuższego niż 2 bajty, kod operacji EXTENDED_ARG dostarcza jeszcze 2 bajty argumentu.

+0

+1. Przy okazji, czy wszyscy słyszeli o funkcji, która wymaga więcej niż 2^16 parametrów? A może nawet blisko? – Ant

+0

@Ant To powinno być bardzo rzadkim przypadkiem. – satoru