Содержание страницы
dis – Дизассемблер байт-кода Python¶dis – Disassembler for Python bytecode
Исходный код: Lib/dis.py
Модуль dis поддерживает анализ байт-кода CPython путём
eго дизассемблирования. Байт-код CPython, который этот модуль принимает на вход,
определён в файле Include/opcode.h и используется компилятором и
интерпретатором.
Особенность реализации CPython: Байт-код является деталью реализации интерпретатора CPython. Нет никаких гарантий, что байт-код не будет добавлен, удалён или изменён в разных версиях Python. Не следует рассчитывать, что использование этого модуля будет работать в разных виртуальных машинах Python или в разных релизах Python.
Изменено в версии 3.6: Для каждой инструкции используется 2 байта. Ранее количество байт зависело от инструкции.
Пример: Дана функция myfunc():
def myfunc(alist):
return len(alist)
следующую команду можно использовать для отображения дизассемблирования
myfunc():
>>> dis.dis(myfunc)
2 0 LOAD_GLOBAL 0 (len)
2 LOAD_FAST 0 (alist)
4 CALL_FUNCTION 1
6 RETURN_VALUE
(«2» – это номер строки).
Анализ байт-кода¶Bytecode analysis
Новое в версии 3.4.
API анализа байт-кода позволяет оборачивать фрагменты кода Python в объект
Bytecode, который предоставляет удобный доступ к деталям скомпилированного
кода.
-
class
dis.Bytecode(x, *, first_line=None, current_offset=None)¶ Анализирует байткод, соответствующий функции, генератору, асинхронному генератору, корутине, методу, строке исходного кода или объекту кода (как возвращается
compile()).Это удобная обёртка над многими функциями, перечисленными ниже, особенно
get_instructions(), поскольку итерация по экземпляруBytecodeвозвращает операции байткода в виде экземпляровInstruction.Если first_line не равен
None, он указывает номер строки, который должен быть указан для первой строки исходного кода в дизассемблированном коде. В противном случае информация о строке исходного кода (если есть) берётся непосредственно из дизассемблированного объекта кода.Если current_offset не равно
None, оно указывает смещение инструкции в дизассемблированном коде. Установка этого значения означает, чтоdis()будет отображать маркер «текущая инструкция» напротив указанной операции.-
classmethod
from_traceback(tb)¶ Создаёт экземпляр
Bytecodeиз заданного traceback, устанавливая current_offset на инструкцию, ответственную за исключение.
-
codeobj¶ Скомпилированный объект кода.
-
first_line¶ Первая строка исходного кода объекта кода (если доступна)
-
dis()¶ Возвращает форматированное представление операций байткода (то же, что выводится
dis.dis(), но возвращается в виде многострочной строки).
-
info()¶ Возвращает форматированную многострочную строку с подробной информацией об объекте кода, как
code_info().
Изменено в версии 3.7: Теперь может обрабатывать объекты корутин и асинхронных генераторов.
-
classmethod
Пример:
>>> bytecode = dis.Bytecode(myfunc)
>>> for instr in bytecode:
... print(instr.opname)
...
LOAD_GLOBAL
LOAD_FAST
CALL_FUNCTION
RETURN_VALUE
Функции анализа¶Analysis functions
Модуль dis также определяет следующие функции анализа, которые преобразуют входные данные непосредственно в желаемый вывод. Они могут быть полезны, если выполняется только одна операция, и промежуточный объект анализа не нужен:
-
dis.code_info(x)¶ Возвращает форматированную многострочную строку с подробной информацией об объекте кода для указанной функции, генератора, асинхронного генератора, корутины, метода, строки исходного кода или объекта кода.
Обратите внимание, что точное содержимое строк с информацией о коде сильно зависит от реализации и может произвольно меняться в разных реализациях Python или версиях Python.
Новое в версии 3.2.
Изменено в версии 3.7: Теперь может обрабатывать объекты корутин и асинхронных генераторов.
-
dis.show_code(x, *, file=None)¶ Выводит подробную информацию об объекте кода для указанной функции, метода, строки исходного кода или объекта кода в file (или
sys.stdout, если file не указан).Это удобная краткая форма для
print(code_info(x), file=file), предназначенная для интерактивного исследования в приглашении интерпретатора.Новое в версии 3.2.
Изменено в версии 3.4: Добавлен параметр file.
-
dis.dis(x=None, *, file=None, depth=None)¶ Дизассемблирует объект x. x может быть модулем, классом, методом, функцией, генератором, асинхронным генератором, корутиной, объектом кода, строкой исходного кода или последовательностью байт сырого байт-кода. Для модуля дизассемблируются все функции. Для класса – все методы (включая методы класса и статические методы). Для объекта кода или последовательности сырого байт-кода выводится по одной строке на каждую инструкцию байт-кода. Также рекурсивно дизассемблируются вложенные объекты кода (код включений, генераторных выражений и вложенных функций, а также код, используемый для построения вложенных классов). Строки сначала компилируются в объекты кода с помощью встроенной функции
compile(), а затем дизассемблируются. Если объект не указан, эта функция дизассемблирует последнюю трассировку.Результат дисассемблирования выводится в виде текста в указанный аргумент file, если он передан, иначе – в
sys.stdout.Максимальная глубина рекурсии ограничивается параметром depth, если только он не равен
None.depth=0означает отсутствие рекурсии.Изменено в версии 3.4: Добавлен параметр file.
Изменено в версии 3.7: Реализовано рекурсивное дисассемблирование и добавлен параметр depth.
Изменено в версии 3.7: Теперь может обрабатывать объекты корутин и асинхронных генераторов.
-
dis.distb(tb=None, *, file=None)¶ Дисассемблирует функцию, находящуюся на вершине стека traceback; если traceback не передан, используется последний. Указывается инструкция, вызвавшая исключение.
Результат дисассемблирования выводится в виде текста в указанный аргумент file, если он передан, иначе – в
sys.stdout.Изменено в версии 3.4: Добавлен параметр file.
-
dis.disassemble(code, lasti=-1, *, file=None)¶ -
dis.disco(code, lasti=-1, *, file=None)¶ Дисассемблирует объект кода, указывая последнюю инструкцию, если передан lasti. Результат разбит на следующие столбцы:
номер строки для первой инструкции каждой строки
текущая инструкция, помечена как
-->,инструкция с меткой, помечена
>>,адрес инструкции,
название кода операции,
параметры операции и
интерпретация параметров в скобках.
Интерпретация параметров распознаёт имена локальных и глобальных переменных, константные значения, цели переходов и операторы сравнения.
Результат дисассемблирования выводится в виде текста в указанный аргумент file, если он передан, иначе – в
sys.stdout.Изменено в версии 3.4: Добавлен параметр file.
-
dis.get_instructions(x, *, first_line=None)¶ Возвращает итератор по инструкциям в переданной функции, методе, строке исходного кода или объекте кода.
Итератор генерирует последовательность именованных кортежей
Instruction, содержащих сведения о каждой операции в переданном коде.Если first_line не равен
None, он указывает номер строки, который должен быть указан для первой строки исходного кода в дизассемблированном коде. В противном случае информация о строке исходного кода (если есть) берётся непосредственно из дизассемблированного объекта кода.Новое в версии 3.4.
-
dis.findlinestarts(code)¶ Эта функция-генератор использует атрибуты
co_firstlinenoиco_lnotabобъекта кода code для поиска смещений, соответствующих началам строк в исходном коде. Они генерируются как пары(offset, lineno). Описание форматаco_lnotabи способ его декодирования см. в Objects/lnotab_notes.txt.Изменено в версии 3.6: Номера строк могут уменьшаться. Раньше они всегда увеличивались.
-
dis.findlabels(code)¶ Обнаруживает все смещения в сырой скомпилированной строке байткода code, которые являются целями переходов, и возвращает список этих смещений.
-
dis.stack_effect(opcode[, oparg])¶ Вычисляет эффект стека для opcode с аргументом oparg.
Новое в версии 3.4.
Инструкции байткода Python¶Python Bytecode Instructions
Функция get_instructions() и класс Bytecode предоставляют сведения об инструкциях байткода в виде экземпляров Instruction:
-
class
dis.Instruction¶ Подробности об операции байткода
-
opcode¶ Числовой код операции, соответствующий значениям опкодов, перечисленным ниже, и значениям байткода в коллекциях Opcode.
-
opname¶ Человекочитаемое имя операции
-
arg¶ числовой аргумент операции (если есть), иначе
None
-
argval¶ разрешённое значение аргумента (если известно), иначе то же, что и arg
-
argrepr¶ человекочитаемое описание аргумента операции
-
offset¶ начальный индекс операции в последовательности байт-кода
-
starts_line¶ Строка, с которой начинается данный опкод (если есть), иначе
None.
-
is_jump_target¶ True, если другой код переходит сюда, иначеFalse
Новое в версии 3.4.
-
В настоящее время компилятор Python генерирует следующие инструкции байткода.
Общие инструкции
-
NOP¶ Код, который ничего не делает. Используется в качестве заполнителя оптимизатором байт-кода.
-
POP_TOP¶ Удаляет элемент с вершины стека (TOS).
-
ROT_TWO¶ Меняет местами два верхних элемента стека.
-
ROT_THREE¶ Поднимает второй и третий элементы стека на одну позицию вверх, перемещает верхний вниз на третью позицию.
-
DUP_TOP¶ Дублирует ссылку на вершине стека.
Новое в версии 3.2.
-
DUP_TOP_TWO¶ Дублирует две ссылки на вершине стека, сохраняя их порядок.
Новое в версии 3.2.
Унарные операции
Унарные операции берут элемент с вершины стека, применяют операцию и помещают результат обратно на стек.
-
UNARY_POSITIVE¶ Реализует
TOS = +TOS.
-
UNARY_NEGATIVE¶ Реализует
TOS = -TOS.
-
UNARY_NOT¶ Реализует
TOS = not TOS.
-
UNARY_INVERT¶ Реализует
TOS = ~TOS.
-
GET_ITER¶ Реализует
TOS = iter(TOS).
-
GET_YIELD_FROM_ITER¶ Если
TOSявляется объектом генераторный итератор или корутина, он остаётся без изменений. В противном случае реализуетTOS = iter(TOS).Новое в версии 3.5.
Бинарные операции
Бинарные операции удаляют из стека элемент с вершины (TOS) и второй сверху элемент стека (TOS1). Они выполняют операцию и помещают результат обратно в стек.
-
BINARY_POWER¶ Реализует
TOS = TOS1 ** TOS.
-
BINARY_MULTIPLY¶ Реализует
TOS = TOS1 * TOS.
-
BINARY_MATRIX_MULTIPLY¶ Реализует
TOS = TOS1 @ TOS.Новое в версии 3.5.
-
BINARY_FLOOR_DIVIDE¶ Реализует
TOS = TOS1 // TOS.
-
BINARY_TRUE_DIVIDE¶ Реализует
TOS = TOS1 / TOS.
-
BINARY_MODULO¶ Реализует
TOS = TOS1 % TOS.
-
BINARY_ADD¶ Реализует
TOS = TOS1 + TOS.
-
BINARY_SUBTRACT¶ Реализует
TOS = TOS1 - TOS.
-
BINARY_SUBSCR¶ Реализует
TOS = TOS1[TOS].
-
BINARY_LSHIFT¶ Реализует
TOS = TOS1 << TOS.
-
BINARY_RSHIFT¶ Реализует
TOS = TOS1 >> TOS.
-
BINARY_AND¶ Реализует
TOS = TOS1 & TOS.
-
BINARY_XOR¶ Реализует
TOS = TOS1 ^ TOS.
-
BINARY_OR¶ Реализует
TOS = TOS1 | TOS.
Операции на месте
Операции на месте аналогичны бинарным: они также удаляют TOS и TOS1 и помещают результат обратно в стек, но операция выполняется на месте, если TOS1 это поддерживает, и результирующий TOS может (но не обязан) быть исходным TOS1.
-
INPLACE_POWER¶ Реализует операцию на месте
TOS = TOS1 ** TOS.
-
INPLACE_MULTIPLY¶ Реализует операцию на месте
TOS = TOS1 * TOS.
-
INPLACE_MATRIX_MULTIPLY¶ Реализует операцию на месте
TOS = TOS1 @ TOS.Новое в версии 3.5.
-
INPLACE_FLOOR_DIVIDE¶ Реализует операцию на месте
TOS = TOS1 // TOS.
-
INPLACE_TRUE_DIVIDE¶ Реализует операцию на месте
TOS = TOS1 / TOS.
-
INPLACE_MODULO¶ Реализует операцию на месте
TOS = TOS1 % TOS.
-
INPLACE_ADD¶ Реализует операцию на месте
TOS = TOS1 + TOS.
-
INPLACE_SUBTRACT¶ Реализует операцию на месте
TOS = TOS1 - TOS.
-
INPLACE_LSHIFT¶ Реализует операцию на месте
TOS = TOS1 << TOS.
-
INPLACE_RSHIFT¶ Реализует операцию на месте
TOS = TOS1 >> TOS.
-
INPLACE_AND¶ Реализует операцию на месте
TOS = TOS1 & TOS.
-
INPLACE_XOR¶ Реализует операцию на месте
TOS = TOS1 ^ TOS.
-
INPLACE_OR¶ Реализует операцию на месте
TOS = TOS1 | TOS.
-
STORE_SUBSCR¶ Реализует
TOS1[TOS] = TOS2.
-
DELETE_SUBSCR¶ Реализует
del TOS1[TOS].
Коды операций корутин
-
GET_AWAITABLE¶ Реализует
TOS = get_awaitable(TOS), гдеget_awaitable(o)возвращаетo, еслиoявляется объектом корутины или объектом генератора с флагом CO_ITERABLE_COROUTINE, или разрешаетo.__await__.Новое в версии 3.5.
-
GET_AITER¶ Реализует
TOS = TOS.__aiter__().Новое в версии 3.5.
Изменено в версии 3.7: Возврат ожидаемых объектов из
__aiter__больше не поддерживается.
-
GET_ANEXT¶ Реализует
PUSH(get_awaitable(TOS.__anext__())). Подробнее оget_awaitableсм. вGET_AWAITABLE.Новое в версии 3.5.
-
BEFORE_ASYNC_WITH¶ Извлекает
__aenter__и__aexit__из объекта на вершине стека. Помещает__aexit__и результат__aenter__()в стек.Новое в версии 3.5.
-
SETUP_ASYNC_WITH¶ Создаёт новый объект фрейма.
Новое в версии 3.5.
Прочие опкоды
-
PRINT_EXPR¶ Реализует выражение-инструкцию для интерактивного режима. TOS удаляется из стека и выводится на печать. В неинтерактивном режиме выражение-инструкция завершается с помощью
POP_TOP.
-
CONTINUE_LOOP(target)¶ Продолжает цикл при выполнении оператора
continue. target – это адрес, на который нужно перейти (должен быть инструкцияFOR_ITER).
-
SET_ADD(i)¶ Вызывает
set.add(TOS1[-i], TOS). Используется для реализации множественных включений (set comprehensions).
-
LIST_APPEND(i)¶ Вызывает
list.append(TOS[-i], TOS). Используется для реализации списковых включений (list comprehensions).
-
MAP_ADD(i)¶ Вызывает
dict.setitem(TOS1[-i], TOS, TOS1). Используется для реализации словарных включений (dict comprehensions).Новое в версии 3.1.
Для всех инструкций SET_ADD, LIST_APPEND и MAP_ADD, когда добавленное значение или пара ключ/значение извлекаются, объект-контейнер остаётся в стеке, чтобы быть доступным для последующих итераций цикла.
-
RETURN_VALUE¶ Возвращает TOS вызывающей стороне функции.
-
YIELD_VALUE¶ Извлекает TOS и возвращает его из генератора.
-
YIELD_FROM¶ Извлекает TOS и делегирует ему как под-итератор от генератора.
Новое в версии 3.3.
-
SETUP_ANNOTATIONS¶ Проверяет, определён ли
__annotations__вlocals(); если нет, он устанавливается в пустойdict. Этот опкод генерируется, только если тело класса или модуля статически содержит аннотации переменных.Новое в версии 3.6.
-
IMPORT_STAR¶ Загружает все имена, не начинающиеся с
'_', из модуля TOS в локальное пространство имён. Модуль удаляется после загрузки всех имён. Этот опкод реализуетfrom module import *.
-
POP_BLOCK¶ Удаляет один блок из стека блоков. В каждом фрейме есть стек блоков, представляющий вложенные циклы, операторы try и т.п.
-
POP_EXCEPT¶ Удаляет один блок из стека блоков. Извлечённый блок должен быть блоком обработчика исключения, неявно создаваемым при входе в обработчик except. Помимо извлечения лишних значений из стека фрейма, последние три извлечённых значения используются для восстановления состояния исключения.
-
END_FINALLY¶ Завершает предложение
finally. Интерпретатор запоминает, нужно ли повторно возбуждать исключение или функция возвращает значение, и продолжает со следующим внешним блоком.
-
LOAD_BUILD_CLASS¶ Помещает
builtins.__build_class__()в стек. Позже он вызываетсяCALL_FUNCTIONдля создания класса.
-
SETUP_WITH(delta)¶ Эта инструкция выполняет несколько операций перед началом блока with. Во-первых, она загружает
__exit__()из менеджера контекста и помещает его в стек для последующего использованияWITH_CLEANUP. Затем вызывается__enter__(), и в стек помещается блок finally, указывающий на delta. Наконец, результат вызова метода enter помещается в стек. Следующая инструкция либо игнорирует его (POP_TOP), либо сохраняет в переменную(ые) (STORE_FAST,STORE_NAMEилиUNPACK_SEQUENCE).Новое в версии 3.2.
-
WITH_CLEANUP_START¶ Очищает стек при выходе из блока оператора
with. TOS – это привязанный метод__exit__()менеджера контекста. Под TOS находятся 1–3 значения, показывающие, как/почему был выполнен блок finally:SECOND =
None(SECOND, THIRD) = (
WHY_{RETURN,CONTINUE}), retvalSECOND =
WHY_*; no retval below it(SECOND, THIRD, FOURTH) = exc_info()
В последнем случае вызывается
TOS(SECOND, THIRD, FOURTH), иначеTOS(None, None, None). Помещает SECOND и результат вызова в стек.
-
WITH_CLEANUP_FINISH¶ Извлекает из стека тип исключения и результат вызова функции ‘exit’.
Если в стеке представлено исключение и вызов функции возвращает ‘истина’, эта информация «обнуляется» и заменяется одним
WHY_SILENCED, чтобы предотвратить повторное возбуждение исключенияEND_FINALLY. (Но нелокальные переходы всё равно будут возобновлены.)
Все следующие опкоды используют свои аргументы.
-
STORE_NAME(namei)¶ Реализует
name = TOS. namei – это индекс name в атрибутеco_namesобъекта кода. Компилятор пытается использоватьSTORE_FASTилиSTORE_GLOBAL, если это возможно.
-
DELETE_NAME(namei)¶ Реализует
del name, где namei – это индекс в атрибутco_namesобъекта кода.
-
UNPACK_SEQUENCE(count)¶ Распаковывает TOS в count отдельных значений, которые помещаются в стек справа налево.
-
UNPACK_EX(counts)¶ Реализует присваивание со звёздочкой: распаковывает итерируемый объект в TOS на отдельные значения, где общее количество значений может быть меньше количества элементов в итерируемом объекте: одно из новых значений будет списком всех оставшихся элементов.
Младший байт counts – это количество значений до спискового значения, а старший байт counts – количество значений после него. Результирующие значения помещаются в стек справа налево.
-
STORE_ATTR(namei)¶ Реализует
TOS.name = TOS1, где namei – это индекс имени вco_names.
-
DELETE_ATTR(namei)¶ Реализует
del TOS.name, используя namei как индекс вco_names.
-
STORE_GLOBAL(namei)¶ Работает как
STORE_NAME, но сохраняет имя как глобальное.
-
DELETE_GLOBAL(namei)¶ Работает как
DELETE_NAME, но удаляет глобальное имя.
-
LOAD_CONST(consti)¶ Помещает
co_consts[consti]в стек.
-
LOAD_NAME(namei)¶ Помещает значение, связанное с
co_names[namei], в стек.
-
BUILD_TUPLE(count)¶ Создаёт кортеж, потребляя count элементов из стека, и помещает полученный кортеж в стек.
-
BUILD_LIST(count)¶ Работает как
BUILD_TUPLE, но создаёт список.
-
BUILD_SET(count)¶ Работает как
BUILD_TUPLE, но создаёт множество.
-
BUILD_MAP(count)¶ Помещает новый объект словаря в стек. Извлекает
2 * countэлементов так, чтобы словарь содержал count записей:{..., TOS3: TOS2, TOS1: TOS}.Изменено в версии 3.5: Словарь создаётся из элементов стека, а не создаётся пустой словарь, предварительно размещённый для count элементов.
-
BUILD_CONST_KEY_MAP(count)¶ Версия
BUILD_MAP, оптимизированная для константных ключей. Снимает верхний элемент стека, содержащий кортеж ключей, затем, начиная сTOS1, снимает count значений и формирует словарь.Новое в версии 3.6.
-
BUILD_STRING(count)¶ Конкатенирует count строк из стека и помещает результирующую строку в стек.
Новое в версии 3.6.
-
BUILD_TUPLE_UNPACK(count)¶ Извлекает count итерируемых объектов из стека, объединяет их в один кортеж, и помещает результат. Реализует распаковку итерируемого объекта в кортежных литералах
(*x, *y, *z).Новое в версии 3.5.
-
BUILD_TUPLE_UNPACK_WITH_CALL(count)¶ Это похоже на
BUILD_TUPLE_UNPACK, но используется для синтаксиса вызоваf(*x, *y, *z). Элемент стека на позицииcount + 1должен быть соответствующим вызываемым объектомf.Новое в версии 3.6.
-
BUILD_LIST_UNPACK(count)¶ Это похоже на
BUILD_TUPLE_UNPACK, но помещает список, а не кортеж. Реализует распаковку итерируемого объекта в списковых литералах[*x, *y, *z].Новое в версии 3.5.
-
BUILD_SET_UNPACK(count)¶ Это похоже на
BUILD_TUPLE_UNPACK, но помещает множество, а не кортеж. Реализует распаковку итерируемого объекта в множественных литералах{*x, *y, *z}.Новое в версии 3.5.
-
BUILD_MAP_UNPACK(count)¶ Извлекает count отображений из стека, объединяет их в один словарь и помещает результат. Реализует распаковку словаря в словарных литералах
{**x, **y, **z}.Новое в версии 3.5.
-
BUILD_MAP_UNPACK_WITH_CALL(count)¶ Это похоже на
BUILD_MAP_UNPACK, но используется для синтаксиса вызоваf(**x, **y, **z). Элемент стека на позицииcount + 2должен быть соответствующим вызываемым объектомf.Новое в версии 3.5.
Изменено в версии 3.6: Позиция вызываемого объекта определяется прибавлением 2 к аргументу кода операции, а не кодированием её во втором байте аргумента.
-
LOAD_ATTR(namei)¶ Заменяет TOS на
getattr(TOS, co_names[namei]).
-
COMPARE_OP(opname)¶ Выполняет логическую операцию. Имя операции можно найти в
cmp_op[opname].
-
IMPORT_NAME(namei)¶ Импортирует модуль
co_names[namei]. TOS и TOS1 извлекаются и передаются в качестве аргументов fromlist и level для__import__(). Объект модуля помещается в стек. Текущее пространство имён не затрагивается: для корректной инструкции import последующая инструкцияSTORE_FASTизменяет пространство имён.
-
IMPORT_FROM(namei)¶ Загружает атрибут
co_names[namei]из модуля, находящегося в TOS. Полученный объект помещается в стек для последующего сохранения инструкциейSTORE_FAST.
-
JUMP_FORWARD(delta)¶ Увеличивает счётчик байт-кода на delta.
-
POP_JUMP_IF_TRUE(target)¶ Если TOS истинно, устанавливает счётчик байткода в target. TOS извлекается из стека.
Новое в версии 3.1.
-
POP_JUMP_IF_FALSE(target)¶ Если TOS ложно, устанавливает счётчик байткода в target. TOS извлекается из стека.
Новое в версии 3.1.
-
JUMP_IF_TRUE_OR_POP(target)¶ Если TOS истинно, устанавливает счётчик байткода в target и оставляет TOS на стеке. В противном случае (TOS ложно) TOS извлекается.
Новое в версии 3.1.
-
JUMP_IF_FALSE_OR_POP(target)¶ Если TOS ложно, устанавливает счётчик байткода в target и оставляет TOS на стеке. В противном случае (TOS истинно) TOS извлекается.
Новое в версии 3.1.
-
JUMP_ABSOLUTE(target)¶ Устанавливает счётчик байткода в target.
-
FOR_ITER(delta)¶ TOS – это итератор. Вызовите его метод
__next__(). Если он возвращает новое значение, поместите его в стек (итератор остаётся под ним). Если итератор сообщает, что он исчерпан, TOS извлекается из стека, а счётчик байт-кода увеличивается на delta.
-
LOAD_GLOBAL(namei)¶ Загружает глобальную переменную
co_names[namei]в стек.
-
SETUP_LOOP(delta)¶ Помещает блок для цикла в стек блоков. Блок начинается с текущей инструкции и имеет размер delta байт.
-
SETUP_EXCEPT(delta)¶ Помещает блок try из конструкции try-except в стек блоков. delta указывает на первый блок except.
-
SETUP_FINALLY(delta)¶ Pushes a try block from a try-except clause onto the block stack. delta points to the finally block.
-
LOAD_FAST(var_num)¶ Помещает ссылку на локальную переменную
co_varnames[var_num]в стек.
-
STORE_FAST(var_num)¶ Сохраняет TOS в локальную переменную
co_varnames[var_num].
-
DELETE_FAST(var_num)¶ Удаляет локальную переменную
co_varnames[var_num].
-
LOAD_CLOSURE(i)¶ Помещает ссылку на ячейку, содержащуюся в слоте i хранилища ячеек и свободных переменных. Имя переменной –
co_cellvars[i], если i меньше длины co_cellvars. В противном случае –co_freevars[i - len(co_cellvars)].
-
LOAD_DEREF(i)¶ Загружает ячейку, содержащуюся в слоте i хранилища ячеек и свободных переменных. Помещает ссылку на объект, который содержит ячейка, в стек.
-
LOAD_CLASSDEREF(i)¶ Похожа на
LOAD_DEREF, но сначала проверяет словарь локальных переменных, а затем обращается к ячейке. Используется для загрузки свободных переменных в телах классов.Новое в версии 3.4.
-
STORE_DEREF(i)¶ Сохраняет TOS в ячейку, содержащуюся в слоте i хранилища ячеек и свободных переменных.
-
DELETE_DEREF(i)¶ Очищает ячейку, содержащуюся в слоте i хранилища ячеек и свободных переменных. Используется оператором
del.Новое в версии 3.2.
-
RAISE_VARARGS(argc)¶ Вызывает исключение, используя одну из трёх форм оператора
raise, в зависимости от значения argc:0:
raise(повторный вызов предыдущего исключения)1:
raise TOS(вызов экземпляра или типа исключения по адресуTOS)2:
raise TOS1 from TOS(возбуждает экземпляр или тип исключения наTOS1с__cause__установленным вTOS)
-
CALL_FUNCTION(argc)¶ Вызывает вызываемый объект с позиционными аргументами. argc указывает количество позиционных аргументов. Вершина стека содержит позиционные аргументы, причём самый правый аргумент находится на вершине. Под аргументами находится вызываемый объект.
CALL_FUNCTIONизвлекает все аргументы и вызываемый объект из стека, вызывает вызываемый объект с этими аргументами и помещает возвращаемое значение, возвращённое вызываемым объектом, в стек.Изменено в версии 3.6: Эта инструкция используется только для вызовов с позиционными аргументами.
-
CALL_FUNCTION_KW(argc)¶ Вызывает вызываемый объект с позиционными (если есть) и именованными аргументами. argc указывает общее количество позиционных и именованных аргументов. Верхний элемент стека содержит кортеж имён именованных аргументов. Под ним находятся именованные аргументы в порядке, соответствующем кортежу. Под ними – позиционные аргументы, причём самый правый параметр – наверху. Под аргументами находится вызываемый объект.
CALL_FUNCTION_KWизвлекает все аргументы и вызываемый объект из стека, вызывает вызываемый объект с этими аргументами и помещает возвращаемое значение, возвращённое вызываемым объектом, обратно в стек.Изменено в версии 3.6: Именованные аргументы упаковываются в кортеж вместо словаря, argc указывает общее количество аргументов.
-
CALL_FUNCTION_EX(flags)¶ Вызывает вызываемый объект с переменным набором позиционных и именованных аргументов. Если установлен младший бит flags, верхний элемент стека содержит объект отображения (mapping) с дополнительными именованными аргументами. Под ним находится итерируемый объект, содержащий позиционные аргументы и вызываемый объект.
BUILD_MAP_UNPACK_WITH_CALLиBUILD_TUPLE_UNPACK_WITH_CALLможно использовать для объединения нескольких объектов отображения и итерируемых объектов с аргументами. Перед вызовом вызываемого объекта объект отображения и итерируемый объект «распаковываются», и их содержимое передаётся как именованные и позиционные аргументы соответственно.CALL_FUNCTION_EXизвлекает все аргументы и вызываемый объект из стека, вызывает вызываемый объект с этими аргументами и помещает возвращаемое значение, возвращённое вызываемым объектом, обратно в стек.Новое в версии 3.6.
-
LOAD_METHOD(namei)¶ Загружает метод с именем
co_names[namei]из объекта TOS. TOS удаляется из стека. Этот байт-код различает два случая: если TOS имеет метод с правильным именем, он помещает в стек несвязанный метод и TOS. TOS будет использоваться как первый аргумент (self) вCALL_METHODпри вызове несвязанного метода. В противном случае помещаютсяNULLи объект, возвращённый поиском атрибута.Добавлено в версии 3.7.
-
CALL_METHOD(argc)¶ Вызывает метод. argc – количество позиционных аргументов. Именованные аргументы не поддерживаются. Эта инструкция предназначена для использования с
LOAD_METHOD. Позиционные аргументы находятся на вершине стека. Под ними находятся два элемента, описанные вLOAD_METHOD(либоselfи несвязанный метод, либоNULLи произвольный вызываемый объект). Все они извлекаются, и возвращаемое значение помещается в стек.Добавлено в версии 3.7.
-
MAKE_FUNCTION(flags)¶ Помещает новый объект функции в стек. Снизу вверх потребляемый стек должен состоять из значений, если аргумент содержит указанное значение флага.
0x01кортеж значений по умолчанию для только-позиционных и позиционно-именованных параметров в позиционном порядке0x02словарь значений по умолчанию только-именованных параметров0x04словарь аннотаций0x08кортеж, содержащий ячейки для свободных переменных, образующий замыканиекод, связанный с функцией (на TOS1)
полное имя функции (на TOS)
-
BUILD_SLICE(argc)¶ Помещает объект среза в стек. argc должен быть 2 или 3. Если равно 2, помещается
slice(TOS1, TOS); если 3, помещаетсяslice(TOS2, TOS1, TOS). Подробнее см. встроенную функциюslice().
-
EXTENDED_ARG(ext)¶ Является префиксом для любой операции, аргумент которой слишком велик, чтобы поместиться в один байт по умолчанию. ext содержит дополнительный байт, который выступает в качестве старших битов аргумента. Для каждой операции допускается не более трёх префиксов
EXTENDED_ARG, формирующих аргумент от двух до четырёх байт.
-
FORMAT_VALUE(flags)¶ Используется для реализации форматированных строковых литералов (f-строк). Извлекает из стека необязательную спецификацию формата, затем обязательное значение. Флаги интерпретируются следующим образом:
(flags & 0x03) == 0x00: значение форматируется как есть.(flags & 0x03) == 0x01: извлечь спецификацию формата из стека и использовать её, иначе использовать пустую спецификацию формата.(flags & 0x03) == 0x02: извлечь спецификацию формата из стека и использовать её, иначе использовать пустую спецификацию формата.(flags & 0x03) == 0x03: извлечь спецификацию формата из стека и использовать её, иначе использовать пустую спецификацию формата.(flags & 0x04) == 0x04: извлечь fmt_spec из стека и использовать его, иначе использовать пустой fmt_spec.
Форматирование выполняется с помощью
PyObject_Format(). Результат помещается в стек.Новое в версии 3.6.
-
HAVE_ARGUMENT¶ Это не совсем опкод. Он обозначает границу между опкодами, которые не используют свой аргумент, и теми, которые используют (соответственно
< HAVE_ARGUMENTи>= HAVE_ARGUMENT).Изменено в версии 3.6: Теперь каждая инструкция имеет аргумент, но опкоды
< HAVE_ARGUMENTигнорируют его. Раньше аргумент был только у опкодов>= HAVE_ARGUMENT.
Коллекции опкодов¶Opcode collections
Эти коллекции предоставляются для автоматического самоанализа инструкций байткода:
-
dis.opname¶ Последовательность имён операций, индексируемая с помощью байткода.
-
dis.opmap¶ Словарь, сопоставляющий имена операций с байткодами.
-
dis.cmp_op¶ Последовательность всех имён операций сравнения.
-
dis.hasconst¶ Последовательность байткодов, обращающихся к константе.
-
dis.hasfree¶ Последовательность байткодов, которые обращаются к свободной переменной (обратите внимание, что «free» в данном контексте относится к именам в текущей области видимости, на которые ссылаются внутренние области видимости, или к именам во внешних областях видимости, на которые ссылаются из этой области. Она не включает ссылки на глобальные или встроенные области видимости).
-
dis.hasname¶ Последовательность байткодов, обращающихся к атрибуту по имени.
-
dis.hasjrel¶ Последовательность байткодов, имеющих относительную цель перехода.
-
dis.hasjabs¶ Последовательность байткодов, имеющих абсолютную цель перехода.
-
dis.haslocal¶ Последовательность байткодов, обращающихся к локальной переменной.
-
dis.hascompare¶ Последовательность байткодов логических операций.