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?
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
@ user2357112 Tak, potwierdziłem, że nadal tam są. – satoru
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