Создать байт-код Python из списка кодов операций и аргументов? - PullRequest
11 голосов
/ 23 января 2012

Существует ли простой способ создания байт-кода Python из списка из двух кортежей с кодами операций и их аргументами?

Например:

>>> bytecode_compile([
        ('LOAD_CONST', 2),
        ('STORE_FAST', 'a'),
        ('LOAD_FAST', 'a'),
        ('RETURN_VALUE',)])
'd\x01\x00}\x00\x00|\x00\x00S'

Ответы [ 2 ]

3 голосов
/ 24 декабря 2016

Я подробно писал об этом здесь , поэтому я не буду повторять это, но дам некоторые краткие комментарии.

Это определенно выполнимо, но мне интересно, насколько вообще это будет полезно.Ссылка посвящена тому, как запускать и записывать такие вещи.

Байт-код может изменяться как с точки зрения кода операции, так и с именами кода операции или семантики кодов операции между версиями.На самом деле, в Python 3.6 и выше байт-код становится кодовым словом.

Если вы все же решите пойти по этому пути xdis недавно добавил функцию list2bytecode(), чтобы сделать это.

Если вы предпочитаете работать в текстовом файле, поскольку написано большинство ассемблерного кода, я написал для этого xasm .Вот пример сборки в формате, который можно использовать:

# Python bytecode 3.6 (3379)

# Method Name:       five
# Filename:          /tmp/five.pl
# Argument count:    0
# Kw-only arguments: 0
# Number of locals:  0
# Stack size:        1
# Flags:             0x00000043 (NOFREE | NEWLOCALS | OPTIMIZED)
# First Line:        1
# Constants:
#    0: None
#    1: 5
  2:
            LOAD_CONST           (5)
            RETURN_VALUE


# Method Name:       <module>
# Filename:          /tmp/five.pl
# Argument count:    0
# Kw-only arguments: 0
# Number of locals:  0
# Stack size:        2
# Flags:             0x00000040 (NOFREE)
# First Line:        1
# Constants:
#    0: <code object five at 0x0000>
#    1: 'five'
#    2: None
# Names:
#    0: five
#    1: print
  1:
            LOAD_CONST           0 (<code object five at 0x0000>)
            LOAD_CONST           ('five')
            MAKE_FUNCTION        0
            STORE_NAME           (five)

  3:
            LOAD_NAME            (print)
            LOAD_NAME            (five)
            CALL_FUNCTION        0
            CALL_FUNCTION        1
            POP_TOP
            LOAD_CONST           (None)
            RETURN_VALUE
3 голосов
/ 27 января 2012

Я не думаю, что ассемблер Python "сборка байт-кода" существует, но, возможно, его не так сложно собрать самостоятельно.В исходном коде python в Python-XYZ / Include / opcode.h все байтовые коды для кодов операций перечислены с аргументами, которые они принимают.

...