GraalPython предоставляет тип кода Python, который похож на тип кода Python, но базовые байты байт-кода
Код: Выделить всё
co_code
Напомним, что операнды байт-кода обычно являются индексами в какую-то другую таблицу, например пул констант. или список имен переменных. Несмотря на то, что тип кода Graal хранит эту информацию в других частях типа кода так же, как это делает Python, я подозреваю, что в массиве байтов co_code есть дополнительные таблицы.
Чтобы дать некоторое представление о том, что находится в байтовом массиве co_code, вот его значение внутри функции five() для приведенного ниже примера:
Код: Выделить всё
def five():
return 5
Код: Выделить всё
87654321 0011 2233 4455 6677 8899 aabb ccdd eeff 01234567689abcdf
-------------------------------------------------------------------
00000000: 2062 275c 7831 635c 7830 345c 7830 305c b'\x1c\x04\x00\
00000010: 7830 305c 7830 3066 6976 655c 7830 345c x00\x00five\x04\
00000020: 7830 305c 7830 305c 7830 3066 6976 655c x00\x00\x00five\
00000030: 7830 305c 7830 305c 7830 305c 7830 305c x00\x00\x00\x00\
00000040: 7830 305c 7830 305c 7830 305c 7830 305c x00\x00\x00\x00\
00000050: 7830 305c 7830 305c 7830 305c 7830 305c x00\x00\x00\x00\
00000060: 7830 315c 7830 305c 7830 305c 7830 305c x01\x00\x00\x00\
00000070: 7830 335c 7830 305c 7830 305c 7830 3070 x03\x00\x00\x00p
00000080: 5c78 3035 5c78 3132 5c78 3035 5c78 3030 \x05\x12\x05\x00
00000090: 5c78 3030 5c78 3030 5c78 3831 5c78 3062 \x00\x00\x81\x0b
000000a0: 5c78 3031 5c78 6639 5c78 3038 435c 7830 \x01\xf9\x08C\x0
000000b0: 305c 7830 305c 7830 305c 7830 305c 7830 0\x00\x00\x00\x0
000000c0: 305c 7830 305c 7830 305c 7830 305c 7830 0\x00\x00\x00\x0
000000d0: 305c 7830 305c 7830 305c 7830 305c 7830 0\x00\x00\x00\x0
000000e0: 305c 7830 305c 7830 305c 7830 305c 7830 0\x00\x00\x00\x0
000000f0: 305c 7830 305c 7830 305c 7830 305c 7830 0\x00\x00\x00\x0
00000100: 305c 7830 305c 7830 305c 7830 315c 7830 0\x00\x00\x01\x0
00000110: 305c 7830 305c 7830 304e 5c78 3030 5c78 0\x00\x00N\x00\x
00000120: 3030 5c78 3030 5c78 3030 5c78 3030 5c78 00\x00\x00\x00\x
00000130: 3030 5c78 3030 5c78 3030 5c78 3030 5c78 00\x00\x00\x00\x
00000140: 3030 5c78 3030 5c78 3030 5c78 3031 5c78 00\x00\x00\x01\x
00000150: 3030 5c78 3030 5c78 3030 5c78 3030 5c78 00\x00\x00\x00\x
00000160: 3030 5c78 3030 5c78 3030 5c78 3032 5c78 00\x00\x00\x02\x
00000170: 3030 5c78 3030 5c78 3030 5c78 3063 5c78 00\x00\x00\x0c\x
00000180: 3030 5c78 3030 5c78 3030 5c78 3033 5c78 00\x00\x00\x03\x
00000190: 3030 5c78 3030 5c78 3030 5c78 3030 5c78 00\x00\x00\x00\x
000001a0: 3030 5c78 3030 5c78 3030 5c78 3030 5c78 00\x00\x00\x00\x
000001b0: 3030 5c78 3030 5c78 3033 5c78 3030 5c78 00\x00\x03\x00\x
000001c0: 3030 5c78 3030 5c78 6666 5c78 6666 5c78 00\x00\xff\xff\x
000001d0: 6666 5c78 6666 5c78 3030 5c78 3030 5c78 ff\xff\x00\x00\x
000001e0: 3030 5c78 3030 5c78 6666 5c78 6666 5c78 00\x00\xff\xff\x
000001f0: 6666 5c78 6666 270a 6573 ff\xff'.e
без этих дополнительных таблиц.
Изменение возвращаемого значения с 5 на 4 меняет всего один байт:
Код: Выделить всё
00000080: 5c78 3035 5c78 3132 5c78 3035 5c78 3030 \x05\x12\x05\x00
^^
Код: Выделить всё
00000080: 5c78 3034 5c78 3132 5c78 3035 5c78 3030 \x04\x12\x05\x00
^^
Подробнее здесь: https://stackoverflow.com/questions/785 ... l-bytecode