dis --- Python バイトコードの逆アセンブラ

ソースコード: Lib/dis.py


dis モジュールは CPython バイトコード bytecode を逆アセンブルすることでバイトコードの解析をサポートします。 このモジュールが入力として受け取る CPython バイトコードはファイル Include/opcode.h に定義されており、 コンパイラとインタプリタが使用しています。

CPython implementation detail: バイトコードは CPython インタプリタの実装詳細です。Python のバージョン間でバイトコードの追加や、削除、変更がないという保証はありません。このモジュールを使用することによって Python の異なる VM または異なるリリースの間で動作すると考えるべきではありません。

バージョン 3.6 で変更: 従来は使用されるバイト数は命令ごとに異なりましたが、このモジュールでは各々一つの命令につき2バイト使用することとなっています。

バージョン 3.11 で変更: Some instructions are accompanied by one or more inline cache entries, which take the form of CACHE instructions. These instructions are hidden by default, but can be shown by passing show_caches=True to any dis utility.

例: 以下の関数 myfunc() を考えると

def myfunc(alist):
    return len(alist)

the following command can be used to display the disassembly of myfunc():

>>> dis.dis(myfunc)
  2           0 RESUME                   0

  3           2 LOAD_GLOBAL              1 (NULL + len)
             14 LOAD_FAST                0 (alist)
             16 PRECALL                  1
             20 CALL                     1
             30 RETURN_VALUE

("2" は行番号です)。

バイトコード解析

バージョン 3.4 で追加.

バイトコード解析の API を使うと、 Python のコード片を Bytecode オブジェクトでラップでき、コンパイルされたコードの細かいところに簡単にアクセスできます。

class dis.Bytecode(x, *, first_line=None, current_offset=None, show_caches=False)

Analyse the bytecode corresponding to a function, generator, asynchronous generator, coroutine, method, string of source code, or a code object (as returned by compile()).

これは、下で並べられている関数の多くのものをまとめた便利なラッパーです。 とりわけ目立つのは get_instructions() で、 Bytecode インスタンスに対し反復処理をしながら、バイトコード命令を Instruction インスタンスとして返します。

first_lineNone でない場合は、それを逆アセンブルしたコードのソースの最初の行に表示する行番号とします。 そうでない場合は、ソースの行の情報 (もしあれば) を逆アセンブルされたコードオブジェクトから直接取得します。

current_offsetNone でない場合は、逆アセンブルされたコードでのあるインストラクションのオフセット位置を示します。 これを設定すると、 dis() の出力において、指定された命令コード (opcode) に "現在の命令 (instruction)" を表す印が表示されます。

classmethod from_traceback(tb, *, show_caches=False)

与えられたトレースバックから Bytecode インスタンスを構築し、 current_offset がその例外の原因となった命令となるよう設定します。

codeobj

コンパイルされたコードオブジェクト。

first_line

コードオブジェクトのソースの最初の行 (利用可能であれば)

dis()

バイトコード命令の整形された表示を返します (dis.dis() と同じ出力になりますが、複数行文字列として返されます)。

info()

code_info() のようなコードオブジェクトの詳細を含んだ整形された複数行文字列を返します。

バージョン 3.7 で変更: This can now handle coroutine and asynchronous generator objects.

バージョン 3.11 で変更: Added the show_caches parameter.

Example:

>>> bytecode = dis.Bytecode(myfunc)
>>> for instr in bytecode:
...     print(instr.opname)
...
RESUME
LOAD_GLOBAL
LOAD_FAST
PRECALL
CALL
RETURN_VALUE

解析関数

dis モジュールには、以下に挙げる入力を直接欲しい出力に変換する解析関数も定義してあります。 1つの命令だけが実行されている場合は、解析オブジェクトをいったん作るよりはこちらの方が便利です:

dis.code_info(x)

Return a formatted multi-line string with detailed code object information for the supplied function, generator, asynchronous generator, coroutine, method, source code string or code object.

この結果は実装に強く依存しており、Python VM や Python のバージョンによって異なることがあります。

バージョン 3.2 で追加.

バージョン 3.7 で変更: This can now handle coroutine and asynchronous generator objects.

dis.show_code(x, *, file=None)

渡された関数、メソッド、ソースコード文字列、コードオブジェクトに対する、詳細なコードオブジェクトの情報を、file (または file が指定されていなければ sys.stdout) に表示します。

これは、インタラクティブシェル上で使うことを想定した、print(code_info(x), file=file) の便利なショートカットです。

バージョン 3.2 で追加.

バージョン 3.4 で変更: file 引数が追加されました。

dis.dis(x=None, *, file=None, depth=None, show_caches=False)

Disassemble the x object. x can denote either a module, a class, a method, a function, a generator, an asynchronous generator, a coroutine, a code object, a string of source code or a byte sequence of raw bytecode. For a module, it disassembles all functions. For a class, it disassembles all methods (including class and static methods). For a code object or sequence of raw bytecode, it prints one line per bytecode instruction. It also recursively disassembles nested code objects (the code of comprehensions, generator expressions and nested functions, and the code used for building nested classes). Strings are first compiled to code objects with the compile() built-in function before being disassembled. If no object is provided, this function disassembles the last traceback.

file 引数が渡された場合は、アセンブリをそこに書き込みます。 そうでない場合は sys.stdout に出力します。

The maximal depth of recursion is limited by depth unless it is None. depth=0 means no recursion.

バージョン 3.4 で変更: file 引数が追加されました。

バージョン 3.7 で変更: Implemented recursive disassembling and added depth parameter.

バージョン 3.7 で変更: This can now handle coroutine and asynchronous generator objects.

バージョン 3.11 で変更: Added the show_caches parameter.

dis.distb(tb=None, *, file=None, show_caches=False)

トレースバックのスタックの先頭の関数を逆アセンブルします。Noneが渡された場合は最後のトレースバックを使います。例外を引き起こした命令が表示されます。

file 引数が渡された場合は、アセンブリをそこに書き込みます。 そうでない場合は sys.stdout に出力します。

バージョン 3.4 で変更: file 引数が追加されました。

バージョン 3.11 で変更: Added the show_caches parameter.

dis.disassemble(code, lasti=- 1, *, file=None, show_caches=False)
dis.disco(code, lasti=- 1, *, file=None, show_caches=False)

コードオブジェクトを逆アセンブルします。lasti が与えられた場合は、最後の命令を示します。出力は次のようなカラムに分割されます:

  1. 各行の最初の命令に対する行番号。

  2. 現在の命令。 --> として示されます。

  3. ラベル付けされた命令。 >> とともに表示されます。

  4. 命令のアドレス。

  5. 命令コード名。

  6. 命令パラメタ。

  7. パラメタの解釈を括弧で囲んだもの。

パラメタの解釈は、ローカル変数とグローバル変数の名前、定数の値、 分岐先、比較命令を認識します。

file 引数が渡された場合は、アセンブリをそこに書き込みます。 そうでない場合は sys.stdout に出力します。

バージョン 3.4 で変更: file 引数が追加されました。

バージョン 3.11 で変更: Added the show_caches parameter.

dis.get_instructions(x, *, first_line=None, show_caches=False)

渡された関数、メソッド、ソースコード文字列、コードオブジェクトにある命令のイテレータを返します。

イテレータは、与えられたコードの各命令の詳細情報を保持する名前付きタプル Instruction からなる列を生成します。

first_lineNone でない場合は、それを逆アセンブルしたコードのソースの最初の行に表示する行番号とします。 そうでない場合は、ソースの行の情報 (もしあれば) を逆アセンブルされたコードオブジェクトから直接取得します。

バージョン 3.4 で追加.

バージョン 3.11 で変更: Added the show_caches parameter.

dis.findlinestarts(code)

This generator function uses the co_lines method of the code object code to find the offsets which are starts of lines in the source code. They are generated as (offset, lineno) pairs.

バージョン 3.6 で変更: Line numbers can be decreasing. Before, they were always increasing.

バージョン 3.10 で変更: The PEP 626 co_lines method is used instead of the co_firstlineno and co_lnotab attributes of the code object.

dis.findlabels(code)

Detect all offsets in the raw compiled bytecode string code which are jump targets, and return a list of these offsets.

dis.stack_effect(opcode, oparg=None, *, jump=None)

opcode と引数 oparg がスタックに与える影響を計算します。

If the code has a jump target and jump is True, stack_effect() will return the stack effect of jumping. If jump is False, it will return the stack effect of not jumping. And if jump is None (default), it will return the maximal stack effect of both cases.

バージョン 3.4 で追加.

バージョン 3.8 で変更: Added jump parameter.

Python バイトコード命令

get_instructions() 関数と Bytecode クラスはバイトコード命令の詳細を Instruction インスタンスの形で提供します:

class dis.Instruction

バイトコード命令の詳細

opcode

以下の命令コードの値と 命令コードコレクション のバイトコードの値に対応する、命令の数値コードです。

opname

人間が読むための命令名

arg

(ある場合は) 命令の数値引数、無ければ None

argval

resolved arg value (if any), otherwise None

argrepr

human readable description of operation argument (if any), otherwise an empty string.

offset

バイトコード列の中での命令の開始位置

starts_line

(ある場合は) この命令コードが始まる行、無ければ None

is_jump_target

他のコードからここへジャンプする場合は True 、そうでない場合は False

positions

dis.Positions object holding the start and end locations that are covered by this instruction.

バージョン 3.4 で追加.

バージョン 3.11 で変更: Field positions is added.

class dis.Positions

In case the information is not available, some fields might be None.

lineno
end_lineno
col_offset
end_col_offset

バージョン 3.11 で追加.

現在 Python コンパイラは次のバイトコード命令を生成します。

一般的な命令

NOP

Do nothing code. Used as a placeholder by the bytecode optimizer, and to generate line tracing events.

POP_TOP

スタックの先頭 (TOS) の要素を取り除きます。

COPY(i)

Push the i-th item to the top of the stack. The item is not removed from its original location.

バージョン 3.11 で追加.

SWAP(i)

Swap TOS with the item at position i.

バージョン 3.11 で追加.

1オペランド命令

1オペランド命令はスタックの先頭を取り出して操作を適用し、結果をスタックへプッシュし戻します。

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

TOSgenerator iterator もしくは coroutine オブジェクトの場合は、そのままにしておきます。 そうでない場合は TOS = iter(TOS) を実行します。

バージョン 3.5 で追加.

Binary and in-place operations

二項命令はスタックの先頭 (TOS) と先頭から二番目の要素をスタックから取り除きます。 命令を実行し、スタックへ結果をプッシュし戻します。

インプレース命令は TOS と TOS1 を取り除いて結果をスタックへプッシュするという点で二項命令と似ています。 しかし、TOS1 がインプレース命令をサポートしている場合には操作が直接 TOS1 に行われます。 また、操作結果の TOS は (常に同じというわけではありませんが) 元の TOS1 と同じオブジェクトになることが多いです。

BINARY_OP(op)

Implements the binary and in-place operators (depending on the value of op).

バージョン 3.11 で追加.

BINARY_SUBSCR

TOS = TOS1[TOS] を実行します。

STORE_SUBSCR

TOS1[TOS] = TOS2 を実行します。

DELETE_SUBSCR

del TOS1[TOS] を実行します。

コルーチン命令コード

GET_AWAITABLE(where)

TOS = get_awaitable(TOS) を実行します。 get_awaitable(o) は、 o がコルーチンオブジェクトもしくは CO_ITERABLE_COROUTINE フラグの付いたジェネレータオブジェクトの場合に o を返し、そうでない場合は o.__await__ を解決します。

If the where operand is nonzero, it indicates where the instruction occurs:

  • 1 After a call to __aenter__

  • 2 After a call to __aexit__

バージョン 3.5 で追加.

バージョン 3.11 で変更: Previously, this instruction did not have an oparg.

GET_AITER

Implements TOS = TOS.__aiter__().

バージョン 3.5 で追加.

バージョン 3.7 で変更: Returning awaitable objects from __aiter__ is no longer supported.

GET_ANEXT

Pushes get_awaitable(TOS.__anext__()) to the stack. See GET_AWAITABLE for details about get_awaitable.

バージョン 3.5 で追加.

END_ASYNC_FOR

Terminates an async for loop. Handles an exception raised when awaiting a next item. If TOS is StopAsyncIteration pop 3 values from the stack and restore the exception state using the second of them. Otherwise re-raise the exception using the value from the stack. An exception handler block is removed from the block stack.

バージョン 3.8 で追加:

バージョン 3.11 で変更: Exception representation on the stack now consist of one, not three, items.

BEFORE_ASYNC_WITH

スタックの先頭にあるオブジェクトの __aenter____aexit__ を解決します。 __aexit____aenter__() の結果をスタックに積みます。

バージョン 3.5 で追加.

その他の命令コード

PRINT_EXPR

対話モードのための式文を実行します。TOS はスタックから取り除かれ表示されます。 非対話モードにおいては、式文は POP_TOP で終了しています。

SET_ADD(i)

set.add(TOS1[-i], TOS) を呼び出します。集合内包表記の実装に使われます。

LIST_APPEND(i)

Calls list.append(TOS1[-i], TOS). Used to implement list comprehensions.

MAP_ADD(i)

Calls dict.__setitem__(TOS1[-i], TOS1, TOS). Used to implement dict comprehensions.

バージョン 3.1 で追加.

バージョン 3.8 で変更: Map value is TOS and map key is TOS1. Before, those were reversed.

SET_ADD, LIST_APPEND, MAP_ADD は、追加した値または key/value ペアをスタックから取り除きますが、コンテナオブジェクトはループの次のイテレーションで利用できるようにスタックに残しておきます。

RETURN_VALUE

関数の呼び出し元へ TOS を返します。

YIELD_VALUE

TOS をポップし、それを ジェネレータ から yield します。

SETUP_ANNOTATIONS

Checks whether __annotations__ is defined in locals(), if not it is set up to an empty dict. This opcode is only emitted if a class or module body contains variable annotations statically.

バージョン 3.6 で追加.

IMPORT_STAR

'_' で始まっていないすべてのシンボルをモジュール TOS から直接ローカル名前空間へロードします。 モジュールはすべての名前をロードした後にポップされます。 この命令コードは from module import * を実行します。

POP_EXCEPT

Pops a value from the stack, which is used to restore the exception state.

バージョン 3.11 で変更: Exception representation on the stack now consist of one, not three, items.

RERAISE

Re-raises the exception currently on top of the stack. If oparg is non-zero, pops an additional value from the stack which is used to set f_lasti of the current frame.

バージョン 3.9 で追加.

バージョン 3.11 で変更: Exception representation on the stack now consist of one, not three, items.

PUSH_EXC_INFO

Pops a value from the stack. Pushes the current exception to the top of the stack. Pushes the value originally popped back to the stack. Used in exception handlers.

バージョン 3.11 で追加.

CHECK_EXC_MATCH

Performs exception matching for except. Tests whether the TOS1 is an exception matching TOS. Pops TOS and pushes the boolean result of the test.

バージョン 3.11 で追加.

CHECK_EG_MATCH

Performs exception matching for except*. Applies split(TOS) on the exception group representing TOS1.

In case of a match, pops two items from the stack and pushes the non-matching subgroup (None in case of full match) followed by the matching subgroup. When there is no match, pops one item (the match type) and pushes None.

バージョン 3.11 で追加.

PREP_RERAISE_STAR

Combines the raised and reraised exceptions list from TOS, into an exception group to propagate from a try-except* block. Uses the original exception group from TOS1 to reconstruct the structure of reraised exceptions. Pops two items from the stack and pushes the exception to reraise or None if there isn't one.

バージョン 3.11 で追加.

WITH_EXCEPT_START

Calls the function in position 4 on the stack with arguments (type, val, tb) representing the exception at the top of the stack. Used to implement the call context_manager.__exit__(*exc_info()) when an exception has occurred in a with statement.

バージョン 3.9 で追加.

バージョン 3.11 で変更: The __exit__ function is in position 4 of the stack rather than 7. Exception representation on the stack now consist of one, not three, items.

LOAD_ASSERTION_ERROR

Pushes AssertionError onto the stack. Used by the assert statement.

バージョン 3.9 で追加.

LOAD_BUILD_CLASS

Pushes builtins.__build_class__() onto the stack. It is later called to construct a class.

BEFORE_WITH(delta)

This opcode performs several operations before a with block starts. First, it loads __exit__() from the context manager and pushes it onto the stack for later use by WITH_EXCEPT_START. Then, __enter__() is called. Finally, the result of calling the __enter__() method is pushed onto the stack.

バージョン 3.11 で追加.

GET_LEN

Push len(TOS) onto the stack.

バージョン 3.10 で追加.

MATCH_MAPPING

If TOS is an instance of collections.abc.Mapping (or, more technically: if it has the Py_TPFLAGS_MAPPING flag set in its tp_flags), push True onto the stack. Otherwise, push False.

バージョン 3.10 で追加.

MATCH_SEQUENCE

If TOS is an instance of collections.abc.Sequence and is not an instance of str/bytes/bytearray (or, more technically: if it has the Py_TPFLAGS_SEQUENCE flag set in its tp_flags), push True onto the stack. Otherwise, push False.

バージョン 3.10 で追加.

MATCH_KEYS

TOS is a tuple of mapping keys, and TOS1 is the match subject. If TOS1 contains all of the keys in TOS, push a tuple containing the corresponding values. Otherwise, push None.

バージョン 3.10 で追加.

バージョン 3.11 で変更: Previously, this instruction also pushed a boolean value indicating success (True) or failure (False).

STORE_NAME(namei)

name = TOS を実行します。 namei はコードオブジェクトの属性 co_names における name のインデックスです。 コンパイラは可能ならば STORE_FAST または STORE_GLOBAL を使おうとします。

DELETE_NAME(namei)

del name を実行します。 namei はコードオブジェクトの co_names 属性へのインデックスです。

UNPACK_SEQUENCE(count)

TOS を count 個の個別の値にアンパックして、右から左の順にスタックに積みます。

UNPACK_EX(counts)

星付きの対象ありの代入を実行します: TOS にあるイテラブルを個別の値にばらしますが、ばらした値の総数はイテラブルの要素数より小さくなることがあります: そのときは、値の1つはばらされずに残った要素からなるリストです。

counts の下位バイトはそのリスト値より前にある値の個数で、 counts の上位バイトはそれより後ろにある値の個数です。 そうしてできた値は右から左の順でスタックに積まれます。

STORE_ATTR(namei)

TOS.name = TOS1 を実行します。 nameico_names における名前のインデックスです。

DELETE_ATTR(namei)

del TOS.name を実行します。 co_names へのインデックスとして namei を使います。

STORE_GLOBAL(namei)

STORE_NAME と同じように動作しますが、 name をグローバルとして保存します。

DELETE_GLOBAL(namei)

DELETE_NAME と同じように動作しますが、グローバルの 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 と同じように動作しますが、この命令は set を作り出します。

BUILD_MAP(count)

Pushes a new dictionary object onto the stack. Pops 2 * count items so that the dictionary holds count entries: {..., TOS3: TOS2, TOS1: TOS}.

バージョン 3.5 で変更: The dictionary is created from stack items instead of creating an empty dictionary pre-sized to hold count items.

BUILD_CONST_KEY_MAP(count)

The version of BUILD_MAP specialized for constant keys. Pops the top element on the stack which contains a tuple of keys, then starting from TOS1, pops count values to form values in the built dictionary.

バージョン 3.6 で追加.

BUILD_STRING(count)

Concatenates count strings from the stack and pushes the resulting string onto the stack.

バージョン 3.6 で追加.

LIST_TO_TUPLE

Pops a list from the stack and pushes a tuple containing the same values.

バージョン 3.9 で追加.

LIST_EXTEND(i)

Calls list.extend(TOS1[-i], TOS). Used to build lists.

バージョン 3.9 で追加.

SET_UPDATE(i)

Calls set.update(TOS1[-i], TOS). Used to build sets.

バージョン 3.9 で追加.

DICT_UPDATE(i)

Calls dict.update(TOS1[-i], TOS). Used to build dicts.

バージョン 3.9 で追加.

DICT_MERGE(i)

Like DICT_UPDATE but raises an exception for duplicate keys.

バージョン 3.9 で追加.

LOAD_ATTR(namei)

TOS を getattr(TOS, co_names[namei]) と入れ替えます。

COMPARE_OP(opname)

ブール命令を実行します。命令名は cmp_op[opname] にあります。

IS_OP(invert)

Performs is comparison, or is not if invert is 1.

バージョン 3.9 で追加.

CONTAINS_OP(invert)

Performs in comparison, or not in if invert is 1.

バージョン 3.9 で追加.

IMPORT_NAME(namei)

モジュール co_names[namei] をインポートします。 TOS と TOS1 がポップされ、 __import__()fromlistlevel 引数になります。モジュールオブジェクトはスタックへプッシュされます。現在の名前空間は影響されません: 適切な import 文のためには、後続の STORE_FAST 命令が名前空間を変更します。

IMPORT_FROM(namei)

TOS にあるモジュールから属性 co_names[namei] をロードします。作成されたオブジェクトはスタックにプッシュされ、後続の STORE_FAST 命令によって保存されます。

JUMP_FORWARD(delta)

バイトコードカウンタを delta だけ増加させます。

JUMP_BACKWARD(delta)

Decrements bytecode counter by delta. Checks for interrupts.

バージョン 3.11 で追加.

JUMP_BACKWARD_NO_INTERRUPT(delta)

Decrements bytecode counter by delta. Does not check for interrupts.

バージョン 3.11 で追加.

POP_JUMP_FORWARD_IF_TRUE(delta)

If TOS is true, increments the bytecode counter by delta. TOS is popped.

バージョン 3.11 で追加.

POP_JUMP_BACKWARD_IF_TRUE(delta)

If TOS is true, decrements the bytecode counter by delta. TOS is popped.

バージョン 3.11 で追加.

POP_JUMP_FORWARD_IF_FALSE(delta)

If TOS is false, increments the bytecode counter by delta. TOS is popped.

バージョン 3.11 で追加.

POP_JUMP_BACKWARD_IF_FALSE(delta)

If TOS is false, decrements the bytecode counter by delta. TOS is popped.

バージョン 3.11 で追加.

POP_JUMP_FORWARD_IF_NOT_NONE(delta)

If TOS is not None, increments the bytecode counter by delta. TOS is popped.

バージョン 3.11 で追加.

POP_JUMP_BACKWARD_IF_NOT_NONE(delta)

If TOS is not None, decrements the bytecode counter by delta. TOS is popped.

バージョン 3.11 で追加.

POP_JUMP_FORWARD_IF_NONE(delta)

If TOS is None, increments the bytecode counter by delta. TOS is popped.

バージョン 3.11 で追加.

POP_JUMP_BACKWARD_IF_NONE(delta)

If TOS is None, decrements the bytecode counter by delta. TOS is popped.

バージョン 3.11 で追加.

JUMP_IF_TRUE_OR_POP(delta)

If TOS is true, increments the bytecode counter by delta and leaves TOS on the stack. Otherwise (TOS is false), TOS is popped.

バージョン 3.1 で追加.

バージョン 3.11 で変更: The oparg is now a relative delta rather than an absolute target.

JUMP_IF_FALSE_OR_POP(delta)

If TOS is false, increments the bytecode counter by delta and leaves TOS on the stack. Otherwise (TOS is true), TOS is popped.

バージョン 3.1 で追加.

バージョン 3.11 で変更: The oparg is now a relative delta rather than an absolute target.

FOR_ITER(delta)

TOS is an iterator. Call its __next__() method. If this yields a new value, push it on the stack (leaving the iterator below it). If the iterator indicates it is exhausted, TOS is popped, and the byte code counter is incremented by delta.

LOAD_GLOBAL(namei)

Loads the global named co_names[namei>>1] onto the stack.

バージョン 3.11 で変更: If the low bit of namei is set, then a NULL is pushed to the stack before the global variable.

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] を削除します。

MAKE_CELL(i)

Creates a new cell in slot i. If that slot is empty then that value is stored into the new cell.

バージョン 3.11 で追加.

LOAD_CLOSURE(i)

Pushes a reference to the cell contained in slot i of the "fast locals" storage. The name of the variable is co_fastlocalnames[i].

Note that LOAD_CLOSURE is effectively an alias for LOAD_FAST. It exists to keep bytecode a little more readable.

バージョン 3.11 で変更: i is no longer offset by the length of co_varnames.

LOAD_DEREF(i)

Loads the cell contained in slot i of the "fast locals" storage. Pushes a reference to the object the cell contains on the stack.

バージョン 3.11 で変更: i is no longer offset by the length of co_varnames.

LOAD_CLASSDEREF(i)

LOAD_DEREF とほぼ同じですが、セルを調べる前にまずローカルの辞書を確認します。 これはクラス本体に自由変数を読み込むために使います。

バージョン 3.4 で追加.

バージョン 3.11 で変更: i is no longer offset by the length of co_varnames.

STORE_DEREF(i)

Stores TOS into the cell contained in slot i of the "fast locals" storage.

バージョン 3.11 で変更: i is no longer offset by the length of co_varnames.

DELETE_DEREF(i)

Empties the cell contained in slot i of the "fast locals" storage. Used by the del statement.

バージョン 3.2 で追加.

バージョン 3.11 で変更: i is no longer offset by the length of co_varnames.

COPY_FREE_VARS(n)

Copies the n free variables from the closure into the frame. Removes the need for special code on the caller's side when calling closures.

バージョン 3.11 で追加.

RAISE_VARARGS(argc)

Raises an exception using one of the 3 forms of the raise statement, depending on the value of argc:

  • 0: raise (re-raise previous exception)

  • 1: raise TOS (raise exception instance or type at TOS)

  • 2: raise TOS1 from TOS (raise exception instance or type at TOS1 with __cause__ set to TOS)

CALL(argc)

Calls a callable object with the number of arguments specified by argc, including the named arguments specified by the preceding KW_NAMES, if any. On the stack are (in ascending order), either:

  • NULL

  • The callable

  • The positional arguments

  • The named arguments

or:

  • The callable

  • self

  • The remaining positional arguments

  • The named arguments

argc is the total of the positional and named arguments, excluding self when a NULL is not present.

CALL pops all arguments and the callable object off the stack, calls the callable object with those arguments, and pushes the return value returned by the callable object.

バージョン 3.11 で追加.

CALL_FUNCTION_EX(flags)

Calls a callable object with variable set of positional and keyword arguments. If the lowest bit of flags is set, the top of the stack contains a mapping object containing additional keyword arguments. Before the callable is called, the mapping object and iterable object are each "unpacked" and their contents passed in as keyword and positional arguments respectively. CALL_FUNCTION_EX pops all arguments and the callable object off the stack, calls the callable object with those arguments, and pushes the return value returned by the callable object.

バージョン 3.6 で追加.

LOAD_METHOD(namei)

Loads a method named co_names[namei] from the TOS object. TOS is popped. This bytecode distinguishes two cases: if TOS has a method with the correct name, the bytecode pushes the unbound method and TOS. TOS will be used as the first argument (self) by CALL when calling the unbound method. Otherwise, NULL and the object return by the attribute lookup are pushed.

バージョン 3.7 で追加.

PRECALL(argc)

Prefixes CALL. Logically this is a no op. It exists to enable effective specialization of calls. argc is the number of arguments as described in CALL.

バージョン 3.11 で追加.

PUSH_NULL

Pushes a NULL to the stack. Used in the call sequence to match the NULL pushed by LOAD_METHOD for non-method calls.

バージョン 3.11 で追加.

KW_NAMES(i)

Prefixes PRECALL. Stores a reference to co_consts[consti] into an internal variable for use by CALL. co_consts[consti] must be a tuple of strings.

バージョン 3.11 で追加.

MAKE_FUNCTION(flags)

Pushes a new function object on the stack. From bottom to top, the consumed stack must consist of values if the argument carries a specified flag value

  • 0x01 a tuple of default values for positional-only and positional-or-keyword parameters in positional order

  • 0x02 a dictionary of keyword-only parameters' default values

  • 0x04 a tuple of strings containing parameters' annotations

  • 0x08 a tuple containing cells for free variables, making a closure

  • 関数に関連付けられたコード (TOS1の位置)

  • 関数の qualified name (TOSの位置)

バージョン 3.10 で変更: Flag value 0x04 is a tuple of strings instead of dictionary

BUILD_SLICE(argc)

スライスオブジェクトをスタックにプッシュします。 argc は2あるいは3でなければなりません。 2 ならば slice(TOS1, TOS) がプッシュされます。 3 ならば slice(TOS2, TOS1, TOS) がプッシュされます。 これ以上の情報については、 slice() 組み込み関数を参照してください。

EXTENDED_ARG(ext)

Prefixes any opcode which has an argument too big to fit into the default one byte. ext holds an additional byte which act as higher bits in the argument. For each opcode, at most three prefixal EXTENDED_ARG are allowed, forming an argument from two-byte to four-byte.

FORMAT_VALUE(flags)

Used for implementing formatted literal strings (f-strings). Pops an optional fmt_spec from the stack, then a required value. flags is interpreted as follows:

  • (flags & 0x03) == 0x00: value is formatted as-is.

  • (flags & 0x03) == 0x01: call str() on value before formatting it.

  • (flags & 0x03) == 0x02: call repr() on value before formatting it.

  • (flags & 0x03) == 0x03: call ascii() on value before formatting it.

  • (flags & 0x04) == 0x04: pop fmt_spec from the stack and use it, else use an empty fmt_spec.

Formatting is performed using PyObject_Format(). The result is pushed on the stack.

バージョン 3.6 で追加.

MATCH_CLASS(count)

TOS is a tuple of keyword attribute names, TOS1 is the class being matched against, and TOS2 is the match subject. count is the number of positional sub-patterns.

Pop TOS, TOS1, and TOS2. If TOS2 is an instance of TOS1 and has the positional and keyword attributes required by count and TOS, push a tuple of extracted attributes. Otherwise, push None.

バージョン 3.10 で追加.

バージョン 3.11 で変更: Previously, this instruction also pushed a boolean value indicating success (True) or failure (False).

RESUME(where)

A no-op. Performs internal tracing, debugging and optimization checks.

The where operand marks where the RESUME occurs:

  • 0 The start of a function

  • 1 After a yield expression

  • 2 After a yield from expression

  • 3 After an await expression

バージョン 3.11 で追加.

RETURN_GENERATOR

Create a generator, coroutine, or async generator from the current frame. Clear the current frame and return the newly created generator.

バージョン 3.11 で追加.

SEND

Sends None to the sub-generator of this generator. Used in yield from and await statements.

バージョン 3.11 で追加.

ASYNC_GEN_WRAP

Wraps the value on top of the stack in an async_generator_wrapped_value. Used to yield in async generators.

バージョン 3.11 で追加.

HAVE_ARGUMENT

This is not really an opcode. It identifies the dividing line between opcodes which don't use their argument and those that do (< HAVE_ARGUMENT and >= HAVE_ARGUMENT, respectively).

バージョン 3.6 で変更: Now every instruction has an argument, but opcodes < HAVE_ARGUMENT ignore it. Before, only opcodes >= HAVE_ARGUMENT had an argument.

命令コードコレクション

これらのコレクションは、自動でバイトコード命令を解析するために提供されています:

dis.opname

命令コード名のリスト。 バイトコードをインデックスに使って参照できます。

dis.opmap

命令コード名をバイトコードに対応づける辞書。

dis.cmp_op

すべての比較命令の名前のリスト。

dis.hasconst

Sequence of bytecodes that access a constant.

dis.hasfree

自由変数にアクセスするバイトコードのリスト (この文脈での '自由' とは、現在のスコープにある名前で内側のスコープから参照されているもの、もしくは外側のスコープにある名前で現在のスコープから参照しているものを指します。グローバルスコープや組み込みのスコープへの参照は含み ません)。

dis.hasname

名前によって属性にアクセスするバイトコードのリスト。

dis.hasjrel

相対ジャンプ先を持つバイトコードのリスト。

dis.hasjabs

絶対ジャンプ先を持つバイトコードのリスト。

dis.haslocal

ローカル変数にアクセスするバイトコードのリスト。

dis.hascompare

ブール命令のバイトコードのリスト。