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

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

======================================================================

"dis" モジュールは、CPython の *bytecode* を逆アセンブルして解析するた
めのものです。 このモジュールが入力として受け取る CPython のバイトコー
ドは "Include/opcode.h" で定義され、コンパイラとインタープリタで使われ
ます。

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

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

バージョン 3.10 で変更: ジャンプ、例外処理、ループ命令の引数が、バイト
オフセットではなく命令のオフセットになりました。

バージョン 3.11 で変更: 一部の命令には、"CACHE" 命令の形をした 1 つ以
上のインラインキャッシュエントリーが付随するようになりました。 これら
の命令はデフォルトでは非表示ですが、"dis" の各ユーティリティに
"show_caches=True" を渡すと表示できます。 また、インタープリタは実行時
の状況に応じてバイトコードを特殊化するようになりました。 この適応的な
バイトコードは "adaptive=True" を渡すと表示できます。

バージョン 3.12 で変更: ジャンプの引数は、ジャンプ命令の "CACHE" エン
トリーの直後にある命令を基準とした、ジャンプ先の命令への相対オフセット
になりました。このため、前方ジャンプでは "CACHE" 命令の存在を意識する
必要はありませんが、後方ジャンプを考える際は考慮する必要があります。

バージョン 3.13 で変更: ジャンプ先と例外ハンドラーの出力に、命令オフセ
ットではなく論理ラベルを表示するようになりました。 "-O" コマンドライン
オプションと "show_offsets" 引数を追加しました。

バージョン 3.14 で変更: "-P" コマンドラインオプションと
"show_positions" 引数を追加しました。"-S" コマンドラインオプションを追
加しました。

例として、次の "myfunc()" 関数があるとします。

   def myfunc(alist):
       return len(alist)

次のコマンドで "myfunc()" の逆アセンブル結果を表示できます:

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

     3           LOAD_GLOBAL              1 (len + NULL)
                 LOAD_FAST_BORROW         0 (alist)
                 CALL                     1
                 RETURN_VALUE

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


コマンドライン・インターフェース
================================

"dis" モジュールはコマンドラインからスクリプトとして実行できます:

   python -m dis [-h] [-C] [-O] [-P] [-S] [infile]

以下のオプションが使用できます:

-h, --help

   使い方を表示して終了します。

-C, --show-caches

   インラインキャッシュを表示します。

   Added in version 3.13.

-O, --show-offsets

   命令のオフセットを表示します。

   Added in version 3.13.

-P, --show-positions

   ソースコード内の命令の位置を表示します。

   Added in version 3.14.

-S, --specialized

   特殊化されたバイトコードを表示します。

   Added in version 3.14.

"infile" を指定すると、その逆アセンブル結果を標準出力に書き出します。
指定しなければ、標準入力から受け取ったソースコードをコンパイルして逆ア
センブルします。


バイトコード解析
================

Added in version 3.4.

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

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

   関数、ジェネレータ、非同期ジェネレータ、コルーチン、メソッド、ソー
   スコード文字列、("compile()" が返すような) コードオブジェクトに対応
   するバイトコードを解析します。

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

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

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

   *show_caches* が "True" なら、"dis()" はインタープリタがバイトコー
   ドの特殊化に使うインラインキャッシュエントリーを表示します。

   *adaptive* が "True" なら、"dis()" は特殊化されたバイトコードを表示
   します。 これは元のバイトコードと異なる場合があります。

   *show_offsets* が "True" なら、"dis()" の出力に命令オフセットを含め
   ます。

   *show_positions* が "True" なら、"dis()" の出力にソースコード内の命
   令の位置を含めます。

   classmethod from_traceback(tb, *, show_caches=False)

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

   codeobj

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

   first_line

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

   dis()

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

   info()

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

   バージョン 3.7 で変更: コルーチンオブジェクトと非同期ジェネレーター
   オブジェクトも扱えるようになりました。

   バージョン 3.11 で変更: *show_caches* と *adaptive* パラメーターを
   追加しました。

   バージョン 3.13 で変更: *show_offsets* パラメーターを追加しました。

   バージョン 3.14 で変更: *show_positions* パラメーターを追加しました
   。

例:

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


解析関数
========

"dis" モジュールは、入力を目的の出力に直接変換する、次の解析関数も定義
しています。 1 つの操作だけを行うなど、中間の解析オブジェクトが不要な
場合に便利です:

dis.code_info(x)

   渡された関数、ジェネレータ、非同期ジェネレータ、コルーチン、メソッ
   ド、ソースコード文字列、コードオブジェクトに対する、詳細なコードオ
   ブジェクトの情報を、整形された複数行の文字列として返します。

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

   Added in version 3.2.

   バージョン 3.7 で変更: コルーチンオブジェクトと非同期ジェネレーター
   オブジェクトも扱えるようになりました。

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

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

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

   Added in version 3.2.

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

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

   オブジェクト *x* を逆アセンブルします。 *x* にはモジュール、クラス
   、メソッド、関数、ジェネレーター、非同期ジェネレーター、コルーチン
   、コードオブジェクト、ソースコード文字列、生のバイトコードのバイト
   列を指定できます。 モジュールの場合はすべての関数を、クラスの場合は
   クラスメソッドと静的メソッドを含むすべてのメソッドを逆アセンブルし
   ます。 コードオブジェクトや生のバイトコードの列の場合は、バイトコー
   ド命令ごとに 1 行を表示します。 入れ子のコードオブジェクトも再帰的
   に逆アセンブルします。 これには、ジェネレーター式、入れ子の関数やク
   ラスの本体、アノテーションスコープ で使うコードオブジェクトなどが含
   まれます。 文字列は、組み込み関数 "compile()" でコードオブジェクト
   にコンパイルしてから逆アセンブルします。 オブジェクトを指定しない場
   合は、最後のトレースバックを逆アセンブルします。

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

   *depth* が "None" でなければ、再帰の最大の深さをその値に制限します
   。 "depth=0" は再帰しないことを意味します。

   *show_caches* が "True" なら、インタープリタがバイトコードの特殊化
   に使うインラインキャッシュエントリーを表示します。

   *adaptive* が "True" なら、特殊化されたバイトコードを表示します。
   これは元のバイトコードと異なる場合があります。

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

   バージョン 3.7 で変更: 再帰的な逆アセンブルを実装し、*depth* パラメ
   ーターを追加しました。

   バージョン 3.7 で変更: コルーチンオブジェクトと非同期ジェネレーター
   オブジェクトも扱えるようになりました。

   バージョン 3.11 で変更: *show_caches* と *adaptive* パラメーターを
   追加しました。

   バージョン 3.13 で変更: *show_offsets* パラメーターを追加しました。

   バージョン 3.14 で変更: *show_positions* パラメーターを追加しました
   。

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

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

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

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

   バージョン 3.11 で変更: *show_caches* と *adaptive* パラメーターを
   追加しました。

   バージョン 3.13 で変更: *show_offsets* パラメーターを追加しました。

   バージョン 3.14 で変更: *show_positions* パラメーターを追加しました
   。

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

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

   1. ソースコード内の命令の位置。 *show_positions* が真なら完全な位置
      情報を表示します。 それ以外 (デフォルト) では行番号だけを表示し
      ます。

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

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

   4. 命令のアドレス。

   5. 命令コード名。

   6. 命令パラメタ。

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

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

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

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

   バージョン 3.11 で変更: *show_caches* と *adaptive* パラメーターを
   追加しました。

   バージョン 3.13 で変更: *show_offsets* パラメーターを追加しました。

   バージョン 3.14 で変更: *show_positions* パラメーターを追加しました
   。

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

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

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

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

   *adaptive* パラメーターは "dis()" のものと同じように動作します。

   Added in version 3.4.

   バージョン 3.11 で変更: *show_caches* と *adaptive* パラメーターを
   追加しました。

   バージョン 3.13 で変更: *show_caches* パラメーターは非推奨となり、
   効果がなくなりました。 イテレーターは、*show_caches* の値にかかわら
   ず *cache_info* フィールドを設定した "Instruction" インスタンスを生
   成し、キャッシュエントリーを個別の項目として生成しなくなりました。

dis.findlinestarts(code)

   このジェネレーター関数は、コードオブジェクト *code* の "co_lines()"
   メソッドを使い、ソースコードの各行が始まるオフセットを調べます。 結
   果は "(offset, lineno)" ペアとして生成されます。

   バージョン 3.6 で変更: 行番号が減少する場合もあるようになりました。
   以前は常に増加していました。

   バージョン 3.10 で変更: コードオブジェクト の "co_firstlineno" と
   "codeobject.co_lnotab" 属性に代わり、**PEP 626** の "co_lines()" メ
   ソッドを使うようになりました。

   バージョン 3.13 で変更: ソース行に対応しないバイトコードでは、行番
   号が "None" になる場合があります。

dis.findlabels(code)

   生のコンパイル済みバイトコード文字列 *code* 内でジャンプ先となるす
   べてのオフセットを検出し、そのリストを返します。

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

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

   命令にジャンプ先があり、*jump* が "True" なら、"stack_effect()" は
   ジャンプした場合のスタックへの影響を返します。 *jump* が "False" な
   ら、ジャンプしない場合の影響を返します。 *jump* が "None" (デフォル
   ト) なら、両者のうち大きい方を返します。

   Added in version 3.4.

   バージョン 3.8 で変更: *jump* パラメーターを追加しました。

   バージョン 3.13 で変更: "oparg" を省略するか "None" にすると、
   "oparg=0" の場合のスタックへの影響を返すようになりました。 以前は、
   引数を使うオペコードに対してはエラーでした。 また、"opcode" が引数
   を使わない場合に整数の "oparg" を渡してもエラーにならず、"oparg" を
   無視するようになりました。


Python バイトコード命令
=======================

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

class dis.Instruction

   バイトコード命令の詳細

   opcode

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

   opname

      人間が読むための命令名

   baseopcode

      特殊化された命令の場合は基となる命令の数値コード。 それ以外は
      "opcode" と同じです。

   baseopname

      特殊化された命令の場合は基となる命令の、人間が読める名前。 それ
      以外は "opname" と同じです。

   arg

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

   oparg

      "arg" の別名

   argval

      解決済みの引数値 (ある場合)。 ない場合は "None"

   argrepr

      命令の引数の、人間が読める説明 (ある場合)。 ない場合は空文字列。

   offset

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

   start_offset

      バイトコード列内で命令が始まるインデックス。 前に "EXTENDED_ARG"
      命令が付く場合はそれを含め、付かない場合は "offset" と同じです。

   cache_offset

      命令に続くキャッシュエントリーの開始インデックス

   end_offset

      命令に続くキャッシュエントリーの終了インデックス

   starts_line

      このオペコードがソース行の先頭なら "True"、それ以外なら "False"

   line_number

      このオペコードに対応するソースの行番号 (ある場合)。 ない場合は
      "None"

   is_jump_target

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

   jump_target

      ジャンプ命令の場合はジャンプ先のバイトコードのインデックス。 そ
      れ以外は "None"

   positions

      この命令が対応する範囲の開始位置と終了位置を保持する
      "dis.Positions" オブジェクト。

   cache_info

      "(name, size, data)" 形式の 3 要素タプルで表した、この命令のキャ
      ッシュエントリーの情報。 "name" と "size" はキャッシュの形式を表
      し、"data" はキャッシュの内容です。 命令にキャッシュがなければ
      "cache_info" は "None" です。

   Added in version 3.4.

   バージョン 3.11 で変更: "positions" フィールドを追加しました。

   バージョン 3.13 で変更: "starts_line" フィールドを変更しました。
   "start_offset"、"cache_offset"、"end_offset"、"baseopname"、
   "baseopcode"、"jump_target"、"oparg"、"line_number"、"cache_info"
   フィールドを追加しました。

class dis.Positions

   情報が取得できない場合、一部のフィールドは "None" になることがあり
   ます。

   lineno

   end_lineno

   col_offset

   end_col_offset

   Added in version 3.11.

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

**一般的な命令**

以下ではインタープリタのスタックを "STACK" と呼び、Python のリストのよ
うに扱って操作を説明します。 この表記ではスタックの先頭は "STACK[-1]"
に相当します。

NOP

   何もしない命令です。 バイトコード最適化器のプレースホルダーや、行ト
   レースイベントの生成に使います。

NOT_TAKEN

   何もしない命令です。 インタープリタが "sys.monitoring" の
   "BRANCH_LEFT" と "BRANCH_RIGHT" イベントを記録するために使います。

   Added in version 3.14.

POP_ITER

   スタックの先頭からイテレーターを取り除きます。

   Added in version 3.14.

POP_TOP

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

      STACK.pop()

END_FOR

   スタックの先頭の要素を取り除きます。 "POP_TOP" と同じです。 ループ
   の終わりの後始末に使うことが名前の由来です。

   Added in version 3.12.

END_SEND

   "del STACK[-2]" を実行します。 ジェネレーターの終了時の後始末に使い
   ます。

   Added in version 3.12.

COPY(i)

   先頭から "i" 番目の要素を元の位置から取り除かず、スタックの先頭にプ
   ッシュします。

      assert i > 0
      STACK.append(STACK[-i])

   Added in version 3.11.

SWAP(i)

   スタックの先頭と、先頭から "i" 番目の要素を交換します。

      STACK[-i], STACK[-1] = STACK[-1], STACK[-i]

   Added in version 3.11.

CACHE

   このオペコードは実際の命令ではなく、インタープリタが有用なデータを
   バイトコード自体にキャッシュするための追加領域を示します。 すべての
   "dis" ユーティリティで自動的に非表示になりますが、
   "show_caches=True" にすると表示できます。

   論理的には、この領域は直前の命令の一部です。 多くのオペコードは決ま
   った数のキャッシュが後続することを想定し、実行時にはインタープリタ
   にそれらを読み飛ばさせます。

   データの入ったキャッシュは任意の命令に見えることがあるため、高速化
   用データを含む生の適応的バイトコードを読み取ったり変更したりすると
   きは、十分な注意が必要です。

   Added in version 3.11.

**1オペランド命令**

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

UNARY_NEGATIVE

   "STACK[-1] = -STACK[-1]" を実行します。

UNARY_NOT

   "STACK[-1] = not STACK[-1]" を実行します。

   バージョン 3.13 で変更: この命令は、厳密に "bool" 型の演算対象を要
   求するようになりました。

UNARY_INVERT

   "STACK[-1] = ~STACK[-1]" を実行します。

GET_ITER

   "STACK[-1] = iter(STACK[-1])" を実行します。

GET_YIELD_FROM_ITER

   "STACK[-1]" が *generator iterator* または *coroutine* オブジェクト
   なら、そのままにします。 それ以外は "STACK[-1] = iter(STACK[-1])"
   を実行します。

   Added in version 3.5.

TO_BOOL

   "STACK[-1] = bool(STACK[-1])" を実行します。

   Added in version 3.13.

**2 オペランド命令とインプレース命令**

2 オペランド命令は、スタックの先頭 2 要素 ("STACK[-1]" と "STACK[-2]")
を取り出し、演算を行って結果をスタックに戻します。

インプレース命令は 2 オペランド命令に似ていますが、"STACK[-2]" が対応
している場合はその場で演算を行います。 結果の "STACK[-1]" は元の
"STACK[-2]" と同じオブジェクトになる場合がありますが、必ずそうなるわけ
ではありません。

BINARY_OP(op)

   *op* の値に応じた 2 オペランド演算子またはインプレース演算子を実装
   します。

      rhs = STACK.pop()
      lhs = STACK.pop()
      STACK.append(lhs op rhs)

   Added in version 3.11.

   バージョン 3.14 で変更: "oparg" が "NB_SUBSCR" の場合は、2 オペラン
   ドの添字参照を実行します (オペコード "BINARY_SUBSCR" に代わるもので
   す)。

STORE_SUBSCR

   次の処理を実行します。

      key = STACK.pop()
      container = STACK.pop()
      value = STACK.pop()
      container[key] = value

DELETE_SUBSCR

   次の処理を実行します。

      key = STACK.pop()
      container = STACK.pop()
      del container[key]

BINARY_SLICE

   次の処理を実行します。

      end = STACK.pop()
      start = STACK.pop()
      container = STACK.pop()
      STACK.append(container[start:end])

   Added in version 3.12.

STORE_SLICE

   次の処理を実行します。

      end = STACK.pop()
      start = STACK.pop()
      container = STACK.pop()
      value = STACK.pop()
      container[start:end] = value

   Added in version 3.12.

**コルーチン命令コード**

GET_AWAITABLE(where)

   "STACK[-1] = get_awaitable(STACK[-1])" を実行します。 ここで
   "get_awaitable(o)" は、"o" がコルーチンオブジェクトか
   "CO_ITERABLE_COROUTINE" フラグのあるジェネレーターオブジェクトなら
   "o" を返し、それ以外は "o.__await__" を解決します。

      "where" オペランドがゼロでなければ、命令が現れる場所を示します:

      * "1": "__aenter__" の呼び出しの後

      * "2": "__aexit__" の呼び出しの後

   Added in version 3.5.

   バージョン 3.11 で変更: 以前は、この命令に "oparg" はありませんでし
   た。

GET_AITER

   "STACK[-1] = STACK[-1].__aiter__()" を実行します。

   Added in version 3.5.

   バージョン 3.7 で変更: "__aiter__" から awaitable オブジェクトを返
   すことは、サポートされなくなりました。

GET_ANEXT

   "STACK.append(get_awaitable(STACK[-1].__anext__()))" を実行してスタ
   ックに追加します。 "get_awaitable" の詳細は "GET_AWAITABLE" を参照
   してください。

   Added in version 3.5.

END_ASYNC_FOR

   "async for" ループを終了します。 次の要素を await するときに送出さ
   れた例外を処理します。 スタックの "STACK[-2]" には非同期イテラブル
   、"STACK[-1]" には送出された例外があり、両方をポップします。 例外が
   "StopAsyncIteration" でなければ再送出します。

   Added in version 3.8.

   バージョン 3.11 で変更: スタック上の例外の表現が、3 要素ではなく 1
   要素になりました。

CLEANUP_THROW

   現在のフレームを通じた "throw()" または "close()" の呼び出し中に送
   出された例外を処理します。 "STACK[-1]" が "StopIteration" のインス
   タンスなら、スタックから 3 つの値をポップして、その "value" メンバ
   ーをプッシュします。 それ以外は "STACK[-1]" を再送出します。

   Added in version 3.12.

**その他の命令コード**

SET_ADD(i)

   次の処理を実行します。

      item = STACK.pop()
      set.add(STACK[-i], item)

   集合内包表記の実装に使います。

LIST_APPEND(i)

   次の処理を実行します。

      item = STACK.pop()
      list.append(STACK[-i], item)

   リスト内包表記の実装に使います。

MAP_ADD(i)

   次の処理を実行します。

      value = STACK.pop()
      key = STACK.pop()
      dict.__setitem__(STACK[-i], key, value)

   辞書内包表記の実装に使います。

   Added in version 3.1.

   バージョン 3.8 で変更: マッピングの値が "STACK[-1]"、キーが
   "STACK[-2]" になりました。 以前は逆でした。

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

RETURN_VALUE

   "STACK[-1]" を返り値として、関数の呼び出し元に戻ります。

YIELD_VALUE

   *generator* から "STACK.pop()" を yield します。

   バージョン 3.11 で変更: "oparg" にスタックの深さを設定するようにな
   りました。

   バージョン 3.12 で変更: ジェネレーターを効率よく閉じるため、"oparg"
   に例外ブロックの深さを設定するようになりました。

   バージョン 3.13 で変更: "oparg" は、この命令が yield from または
   await の一部なら "1"、それ以外は "0" になりました。

SETUP_ANNOTATIONS

   "locals()" に "__annotations__" が定義されているかを確認し、なけれ
   ば空の "dict" に設定します。 このオペコードは、クラスやモジュールの
   本体に *変数アノテーション* が静的に含まれる場合にのみ生成されます
   。

   Added in version 3.6.

POP_EXCEPT

   スタックから値をポップし、例外の状態を復元するために使います。

   バージョン 3.11 で変更: スタック上の例外の表現が、3 要素ではなく 1
   要素になりました。

RERAISE

   現在スタックの先頭にある例外を再送出します。 "oparg" がゼロでなけれ
   ば、さらに値を 1 つポップし、現在のフレームの "f_lasti" を設定する
   ために使います。

   Added in version 3.9.

   バージョン 3.11 で変更: スタック上の例外の表現が、3 要素ではなく 1
   要素になりました。

PUSH_EXC_INFO

   スタックから値を 1 つポップします。 現在の例外をスタックの先頭にプ
   ッシュし、最初にポップした値をスタックに戻します。 例外ハンドラーで
   使います。

   Added in version 3.11.

CHECK_EXC_MATCH

   "except" の例外の照合を行います。 "STACK[-2]" が "STACK[-1]" に一致
   する例外かを調べます。 "STACK[-1]" をポップし、照合結果の真偽値をプ
   ッシュします。

   Added in version 3.11.

CHECK_EG_MATCH

   "except*" の例外の照合を行います。 "STACK[-2]" が表す例外グループに
   "split(STACK[-1])" を適用します。

   一致した場合は、スタックから 2 要素をポップし、一致しないサブグルー
   プ (すべて一致した場合は "None")、一致するサブグループの順にプッシ
   ュします。 一致しない場合は、1 要素 (照合する型) をポップし、"None"
   をプッシュします。

   Added in version 3.11.

WITH_EXCEPT_START

   スタックの先頭から 4 番目にある関数を、先頭の例外を表す引数 (type,
   val, tb) で呼び出します。 "with" 文で例外が起きたときの
   "context_manager.__exit__(*exc_info())" の呼び出しを実装するために
   使います。

   Added in version 3.9.

   バージョン 3.11 で変更: "__exit__" 関数の位置が、スタックの先頭から
   7 番目ではなく 4 番目になりました。 スタック上の例外の表現が、3 要
   素ではなく 1 要素になりました。

LOAD_COMMON_CONSTANT

   よく使う定数をスタックにプッシュします。 インタープリタには、この命
   令がサポートする定数の固定のリストがあります。 "assert" 文で
   "AssertionError" をロードするために使います。

   Added in version 3.14.

LOAD_BUILD_CLASS

   "builtins.__build_class__()" をスタックにプッシュします。 これは後
   でクラスを構築するために呼び出されます。

GET_LEN

   "STACK.append(len(STACK[-1]))" を実行します。 パターンの構造との比
   較が必要な "match" 文で使います。

   Added in version 3.10.

MATCH_MAPPING

   "STACK[-1]" が "collections.abc.Mapping" のインスタンスなら (より厳
   密には、"tp_flags" に "Py_TPFLAGS_MAPPING" フラグが設定されていれば
   )、スタックに "True" をプッシュします。 それ以外は "False" をプッシ
   ュします。

   Added in version 3.10.

MATCH_SEQUENCE

   "STACK[-1]" が "collections.abc.Sequence" のインスタンスで、
   "str"/"bytes"/"bytearray" のインスタンスでは *ない* 場合 (より厳密
   には、"tp_flags" に "Py_TPFLAGS_SEQUENCE" フラグが設定されていれば)
   、スタックに "True" をプッシュします。 それ以外は "False" をプッシ
   ュします。

   Added in version 3.10.

MATCH_KEYS

   "STACK[-1]" はマッピングのキーのタプル、"STACK[-2]" は照合対象です
   。 "STACK[-2]" が "STACK[-1]" のすべてのキーを含んでいれば、対応す
   る値を含む "tuple" をプッシュします。 それ以外は "None" をプッシュ
   します。

   Added in version 3.10.

   バージョン 3.11 で変更: 以前は、成功 ("True") または失敗 ("False")
   を示す真偽値もプッシュしていました。

STORE_NAME(namei)

   "name = STACK.pop()" を実行します。 *namei* は、コードオブジェクト
   の "co_names" 属性内の "name" のインデックスです。 コンパイラは、可
   能なら "STORE_FAST" または "STORE_GLOBAL" を使おうとします。

DELETE_NAME(namei)

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

UNPACK_SEQUENCE(count)

   "STACK[-1]" を *count* 個の値にアンパックし、右から左の順にスタック
   に置きます。 値はちょうど *count* 個でなければなりません。

      assert(len(STACK[-1]) == count)
      STACK.extend(STACK.pop()[:-count-1:-1])

UNPACK_EX(counts)

   星付きの代入先への代入を実装します。 "STACK[-1]" のイテラブルを個別
   の値にアンパックしますが、値の総数はイテラブルの要素数より少なくて
   もかまいません。 新しい値の 1 つは、残りの要素をすべて含むリストに
   なります。

   リストとなる値の前後の値の数は、それぞれ 255 個までに制限されていま
   す。

   リストとなる値より前の値の数はオペコードの引数に符号化されます。 リ
   ストより後にも値がある場合、その数は "EXTENDED_ARG" を使って符号化
   されます。 したがって、引数は 2 バイトの値とみなせます。 *counts*
   の下位バイトがリストより前の値の数、上位バイトがリストより後の値の
   数です。

   The extracted values are put onto the stack right-to-left, i.e. "a,
   *b, c = d" will be stored after execution as "STACK.extend((a, b,
   c))".

STORE_ATTR(namei)

   次の処理を実行します。

      obj = STACK.pop()
      value = STACK.pop()
      obj.name = value

   ここで *namei* は コードオブジェクト の "co_names" 内の "name" のイ
   ンデックスです。

DELETE_ATTR(namei)

   次の処理を実行します。

      obj = STACK.pop()
      del obj.name

   ここで *namei* は コードオブジェクト の "co_names" 内の "name" のイ
   ンデックスです。

STORE_GLOBAL(namei)

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

DELETE_GLOBAL(namei)

   "DELETE_NAME" と同じように動作しますが、グローバルの name を削除し
   ます。

LOAD_CONST(consti)

   "co_consts[consti]" をスタックにプッシュします。

LOAD_SMALL_INT(i)

   整数 "i" をスタックにプッシュします。 "i" は "range(256)" の範囲内
   でなければなりません。

   Added in version 3.14.

LOAD_NAME(namei)

   "co_names[namei]" に対応する値をスタックにプッシュします。 名前はロ
   ーカル、グローバル、組み込みの順に探します。

LOAD_LOCALS

   ローカル変数の辞書への参照をスタックにプッシュします。
   "LOAD_FROM_DICT_OR_DEREF" と "LOAD_FROM_DICT_OR_GLOBALS" に渡す名前
   空間の辞書を準備するために使います。

   Added in version 3.12.

LOAD_FROM_DICT_OR_GLOBALS(i)

   スタックからマッピングをポップし、"co_names[namei]" の値を探します
   。 そこに名前がなければ、"LOAD_GLOBAL" と同様にグローバル、組み込み
   の順に探します。 クラス本体の アノテーションスコープ でグローバル変
   数をロードするために使います。

   Added in version 3.12.

BUILD_TEMPLATE

   文字列のタプルと補間のタプルから、新しい "Template" インスタンスを
   構築し、結果のオブジェクトをスタックにプッシュします。

      interpolations = STACK.pop()
      strings = STACK.pop()
      STACK.append(_build_template(strings, interpolations))

   Added in version 3.14.

BUILD_INTERPOLATION(format)

   値とそのソースの式から新しい "Interpolation" インスタンスを構築し、
   結果のオブジェクトをスタックにプッシュします。

   変換も書式指定もなければ、"format" は "2" に設定されます。

   "format" の最下位ビットが立っていれば、補間に書式指定が含まれること
   を示します。

   "format >> 2" がゼロでなければ、補間に変換が含まれることを示します
   。 "format >> 2" の値は変換の種類を表します ("0" は変換なし、"1" は
   "!s"、"2" は "!r"、"3" は "!a")。

      conversion = format >> 2
      if format & 1:
          format_spec = STACK.pop()
      else:
          format_spec = None
      expression = STACK.pop()
      value = STACK.pop()
      STACK.append(_build_interpolation(value, expression, conversion, format_spec))

   Added in version 3.14.

BUILD_TUPLE(count)

   スタックから *count* 個の要素を取り出してタプルを作り、そのタプルを
   スタックにプッシュします。

      if count == 0:
          value = ()
      else:
          value = tuple(STACK[-count:])
          STACK = STACK[:-count]

      STACK.append(value)

BUILD_LIST(count)

   "BUILD_TUPLE" と同じように動作しますが、この命令はリストを作り出し
   ます。

BUILD_SET(count)

   "BUILD_TUPLE" と同じように動作しますが、この命令は set を作り出しま
   す。

BUILD_MAP(count)

   新しい辞書オブジェクトをスタックにプッシュします。 辞書が "{...,
   STACK[-4]: STACK[-3], STACK[-2]: STACK[-1]}" という *count* 個のエ
   ントリーを持つように、"2 * count" 個の要素をポップします。

   バージョン 3.5 で変更: *count* 個の要素を収容するサイズの空の辞書を
   作るのではなく、スタックの要素から辞書を作るようになりました。

BUILD_STRING(count)

   スタックから *count* 個の文字列を連結し、結果の文字列をスタックにプ
   ッシュします。

   Added in version 3.6.

LIST_EXTEND(i)

   次の処理を実行します。

      seq = STACK.pop()
      list.extend(STACK[-i], seq)

   リストの構築に使います。

   Added in version 3.9.

SET_UPDATE(i)

   次の処理を実行します。

      seq = STACK.pop()
      set.update(STACK[-i], seq)

   集合の構築に使います。

   Added in version 3.9.

DICT_UPDATE(i)

   次の処理を実行します。

      map = STACK.pop()
      dict.update(STACK[-i], map)

   辞書の構築に使います。

   Added in version 3.9.

DICT_MERGE(i)

   "DICT_UPDATE" と同じですが、キーが重複すると例外を送出します。

   Added in version 3.9.

LOAD_ATTR(namei)

   "namei" の最下位ビットが立っていなければ、"STACK[-1]" を
   "getattr(STACK[-1], co_names[namei>>1])" に置き換えます。

   If the low bit of "namei" is set, this will attempt to load a
   method named "co_names[namei>>1]" from the "STACK[-1]" object.
   "STACK[-1]" is popped. This bytecode distinguishes two cases: if
   "STACK[-1]" has a method with the correct name, the bytecode pushes
   the unbound method and "STACK[-1]". "STACK[-1]" will be used as the
   first argument ("self") by "CALL" or "CALL_KW" when calling the
   unbound method. Otherwise, "NULL" and the object returned by the
   attribute lookup are pushed.

   バージョン 3.12 で変更: "namei" の最下位ビットが立っている場合、属
   性または非束縛メソッドより先に、それぞれ "NULL" または "self" をス
   タックにプッシュするようになりました。

LOAD_SUPER_ATTR(namei)

   このオペコードは、引数なしと引数 2 つの両方の "super()" を実装しま
   す (例えば "super().method()"、"super().attr"、"super(cls,
   self).method()"、"super(cls, self).attr")。

   スタックの先頭から順に、次の 3 つの値をポップします:

   * "self": 現在のメソッドの最初の引数

   * "cls": 現在のメソッドを定義したクラス

   * グローバルの "super"

   With respect to its argument, it works similarly to "LOAD_ATTR",
   except that "namei" is shifted left by 2 bits instead of 1.

   The low bit of "namei" signals to attempt a method load, as with
   "LOAD_ATTR", which results in pushing "NULL" and the loaded method.
   When it is unset a single value is pushed to the stack.

   "namei" の下から 2 番目のビットが立っていれば、引数 2 つの
   "super()" 呼び出しであることを示します (立っていなければ引数なしで
   す)。

   Added in version 3.12.

COMPARE_OP(opname)

   Performs a Boolean operation.  The operation name can be found in
   "cmp_op[opname >> 5]". If the fifth-lowest bit of "opname" is set
   ("opname & 16"), the result should be coerced to "bool".

   バージョン 3.13 で変更: "oparg" の下から 5 番目のビットが、"bool"
   への強制変換を表すようになりました。

IS_OP(invert)

   "is" による比較を行います。 "invert" が 1 なら "is not" による比較
   を行います。

   Added in version 3.9.

CONTAINS_OP(invert)

   "in" による比較を行います。 "invert" が 1 なら "not in" による比較
   を行います。

   Added in version 3.9.

IMPORT_NAME(namei)

   モジュール "co_names[namei]" をインポートします。 "STACK[-1]" と
   "STACK[-2]" をポップし、"__import__()" の *fromlist* と *level* 引
   数として使います。 モジュールオブジェクトをスタックにプッシュします
   。 現在の名前空間は変わりません。 通常の import 文では、後続の
   "STORE_FAST" 命令が名前空間を変更します。

IMPORT_FROM(namei)

   "STACK[-1]" にあるモジュールから属性 "co_names[namei]" をロードしま
   す。 結果のオブジェクトをスタックにプッシュし、その後の
   "STORE_FAST" 命令で保存できるようにします。

JUMP_FORWARD(delta)

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

JUMP_BACKWARD(delta)

   バイトコードカウンターを *delta* だけ減らします。 割り込みをチェッ
   クします。

   Added in version 3.11.

JUMP_BACKWARD_NO_INTERRUPT(delta)

   バイトコードカウンターを *delta* だけ減らします。 割り込みはチェッ
   クしません。

   Added in version 3.11.

POP_JUMP_IF_TRUE(delta)

   "STACK[-1]" が真なら、バイトコードカウンターを *delta* だけ増やしま
   す。 "STACK[-1]" はポップします。

   バージョン 3.11 で変更: "oparg" は絶対位置のジャンプ先ではなく、相
   対的な差分になりました。 このオペコードは疑似命令となり、最終的なバ
   イトコードでは方向 (前方/後方) ごとの命令に置き換えられます。

   バージョン 3.12 で変更: 疑似命令ではなくなりました。

   バージョン 3.13 で変更: この命令は、厳密に "bool" 型の演算対象を要
   求するようになりました。

POP_JUMP_IF_FALSE(delta)

   "STACK[-1]" が偽なら、バイトコードカウンターを *delta* だけ増やしま
   す。 "STACK[-1]" はポップします。

   バージョン 3.11 で変更: "oparg" は絶対位置のジャンプ先ではなく、相
   対的な差分になりました。 このオペコードは疑似命令となり、最終的なバ
   イトコードでは方向 (前方/後方) ごとの命令に置き換えられます。

   バージョン 3.12 で変更: 疑似命令ではなくなりました。

   バージョン 3.13 で変更: この命令は、厳密に "bool" 型の演算対象を要
   求するようになりました。

POP_JUMP_IF_NOT_NONE(delta)

   "STACK[-1]" が "None" でなければ、バイトコードカウンターを *delta*
   だけ増やします。 "STACK[-1]" はポップします。

   Added in version 3.11.

   バージョン 3.12 で変更: 疑似命令ではなくなりました。

POP_JUMP_IF_NONE(delta)

   "STACK[-1]" が "None" なら、バイトコードカウンターを *delta* だけ増
   やします。 "STACK[-1]" はポップします。

   Added in version 3.11.

   バージョン 3.12 で変更: 疑似命令ではなくなりました。

FOR_ITER(delta)

   "STACK[-1]" は *iterator* です。 その "__next__()" メソッドを呼び出
   します。 新しい値が得られれば、イテレーターを下に残したまま値をスタ
   ックにプッシュします。 イテレーターが *exhausted* になったことを示
   した場合は、バイトコードカウンターを *delta* だけ増やします。

   バージョン 3.12 で変更: 3.11 までは、要素を使い切るとイテレーターを
   ポップしていました。

LOAD_GLOBAL(namei)

   "co_names[namei>>1]" という名前のグローバル変数をスタックにロードし
   ます。 "namei" の最下位ビットが立っている場合は、グローバル変数の後
   に "NULL" をプッシュします。

   バージョン 3.11 で変更: "namei" の最下位ビットが、"NULL" をプッシュ
   するかどうかを示すようになりました。

   バージョン 3.13 で変更: "NULL" をグローバル変数の前ではなく、後にプ
   ッシュするようになりました。

LOAD_FAST(var_num)

   ローカルな "co_varnames[var_num]" への参照をスタックにプッシュしま
   す。

   バージョン 3.12 で変更: このオペコードは、ローカル変数が初期化され
   ていることが保証される場合にのみ使うようになりました。
   "UnboundLocalError" を送出することはありません。

LOAD_FAST_BORROW(var_num)

   ローカル変数 "co_varnames[var_num]" への借用参照をスタックにプッシ
   ュします。

   Added in version 3.14.

LOAD_FAST_LOAD_FAST(var_nums)

   "co_varnames[var_nums >> 4]" と "co_varnames[var_nums & 15]" への参
   照をスタックにプッシュします。

   Added in version 3.13.

LOAD_FAST_BORROW_LOAD_FAST_BORROW(var_nums)

   "co_varnames[var_nums >> 4]" と "co_varnames[var_nums & 15]" への借
   用参照をスタックにプッシュします。

   Added in version 3.14.

LOAD_FAST_CHECK(var_num)

   ローカル変数 "co_varnames[var_num]" への参照をスタックにプッシュし
   ます。 変数が初期化されていなければ "UnboundLocalError" を送出しま
   す。

   Added in version 3.12.

LOAD_FAST_AND_CLEAR(var_num)

   ローカル変数 "co_varnames[var_num]" への参照をスタックにプッシュし
   ます (変数が初期化されていなければ "NULL" をプッシュします)。 そし
   て "co_varnames[var_num]" を "NULL" に設定します。

   Added in version 3.12.

STORE_FAST(var_num)

   "STACK.pop()" をローカル変数 "co_varnames[var_num]" に保存します。

STORE_FAST_STORE_FAST(var_nums)

   "STACK[-1]" を "co_varnames[var_nums >> 4]" に、"STACK[-2]" を
   "co_varnames[var_nums & 15]" に保存します。

   Added in version 3.13.

STORE_FAST_LOAD_FAST(var_nums)

   "STACK.pop()" をローカル変数 "co_varnames[var_nums >> 4]" に保存し
   、ローカル変数 "co_varnames[var_nums & 15]" への参照をスタックにプ
   ッシュします。

   Added in version 3.13.

DELETE_FAST(var_num)

   ローカルな "co_varnames[var_num]" を削除します。

MAKE_CELL(i)

   スロット "i" に新しいセルを作ります。 スロットが空でなければ、その
   値を新しいセルに保存します。

   Added in version 3.11.

LOAD_DEREF(i)

   "fast locals" 領域のスロット "i" にあるセルをロードします。 セルに
   入っているオブジェクトへの参照をスタックにプッシュします。

   バージョン 3.11 で変更: "i" に "co_varnames" の長さをオフセットとし
   て加えなくなりました。

LOAD_FROM_DICT_OR_DEREF(i)

   スタックからマッピングをポップし、その中で "fast locals" 領域のスロ
   ット "i" に対応する名前を探します。 名前がなければ、"LOAD_DEREF" と
   同様にスロット "i" のセルからロードします。 クラス本体 (以前は
   "LOAD_CLASSDEREF" を使用) や、クラス本体の アノテーションスコープ
   で *クロージャ変数* をロードするために使います。

   Added in version 3.12.

STORE_DEREF(i)

   "STACK.pop()" を "fast locals" 領域のスロット "i" にあるセルに保存
   します。

   バージョン 3.11 で変更: "i" に "co_varnames" の長さをオフセットとし
   て加えなくなりました。

DELETE_DEREF(i)

   "fast locals" 領域のスロット "i" にあるセルを空にします。 "del" 文
   で使います。

   Added in version 3.2.

   バージョン 3.11 で変更: "i" に "co_varnames" の長さをオフセットとし
   て加えなくなりました。

COPY_FREE_VARS(n)

   クロージャからフレームへ、"n" 個の *自由 (クロージャ) 変数* をコピ
   ーします。 これにより、クロージャの呼び出し元で特別なコードを用意す
   る必要がなくなります。

   Added in version 3.11.

RAISE_VARARGS(argc)

   *argc* の値に応じて、"raise" 文の 3 つの形式のいずれかで例外を送出
   します:

   * 0: "raise" (直前の例外を再送出)

   * 1: "raise STACK[-1]" ("STACK[-1]" の例外インスタンスまたは例外型
     を送出)

   * 2: "raise STACK[-2] from STACK[-1]" ("__cause__" を "STACK[-1]"
     に設定し、"STACK[-2]" の例外インスタンスまたは例外型を送出)

CALL(argc)

   "argc" で指定した数の引数で呼び出し可能オブジェクトを呼び出します。
   スタックには下から上の順に次のものがあります:

   * 呼び出し可能オブジェクト

   * "self" または "NULL"

   * 残りの位置引数

   "argc" は "self" を除いた位置引数の総数です。

   "CALL" はすべての引数と呼び出し可能オブジェクトをスタックからポップ
   し、それらの引数でオブジェクトを呼び出して、その返り値をスタックに
   プッシュします。

   Added in version 3.11.

   バージョン 3.13 で変更: 呼び出し可能オブジェクトが、常にスタック上
   の同じ位置に現れるようになりました。

   バージョン 3.13 で変更: キーワード引数のある呼び出しは "CALL_KW" で
   処理するようになりました。

CALL_KW(argc)

   1 つ以上の名前付き引数を含む、"argc" で指定した数の引数で呼び出し可
   能オブジェクトを呼び出します。 スタックには下から上の順に次のものが
   あります:

   * 呼び出し可能オブジェクト

   * "self" または "NULL"

   * 残りの位置引数

   * 名前付き引数

   * キーワード引数名の "tuple"

   "argc" は "self" を除いた位置引数と名前付き引数の総数です。 キーワ
   ード引数名のタプルの長さが、名前付き引数の数です。

   "CALL_KW" はすべての引数、キーワード名、呼び出し可能オブジェクトを
   スタックからポップし、それらの引数でオブジェクトを呼び出して、その
   返り値をスタックにプッシュします。

   Added in version 3.13.

CALL_FUNCTION_EX(flags)

   可変個の位置引数とキーワード引数で呼び出し可能オブジェクトを呼び出
   します。 *flags* の最下位ビットが立っている場合、スタックの先頭には
   追加のキーワード引数を含むマッピングオブジェクトがあります。 呼び出
   し前に、マッピングオブジェクトとイテラブルをそれぞれアンパックし、
   内容をキーワード引数と位置引数として渡します。 "CALL_FUNCTION_EX"
   はすべての引数と呼び出し可能オブジェクトをスタックからポップし、そ
   れらの引数でオブジェクトを呼び出して、その返り値をスタックにプッシ
   ュします。

   Added in version 3.6.

PUSH_NULL

   スタックに "NULL" をプッシュします。 メソッド以外の呼び出しで
   "LOAD_ATTR" がプッシュする "NULL" と呼び出し手順を揃えるために使い
   ます。

   Added in version 3.11.

MAKE_FUNCTION

   "STACK[-1]" にあるコードオブジェクトから新しい関数オブジェクトを作
   り、スタックにプッシュします。

   バージョン 3.10 で変更: フラグ値 "0x04" は、辞書ではなく文字列のタ
   プルになりました。

   バージョン 3.11 で変更: "STACK[-1]" にあった修飾名を取り除きました
   。

   バージョン 3.13 で変更: "oparg" のフラグで指定していた、スタック上
   の追加の関数属性を取り除きました。 これらには
   "SET_FUNCTION_ATTRIBUTE" を使うようになりました。

SET_FUNCTION_ATTRIBUTE(flag)

   関数オブジェクトの属性を設定します。 "STACK[-1]" に関数、
   "STACK[-2]" に設定する属性値があることを想定し、両方を取り出して関
   数を "STACK[-1]" に残します。 設定する属性はフラグで決まります:

   * "0x01" 位置専用パラメーターと位置またはキーワードのパラメーターの
     デフォルト値を、位置の順に並べたタプル

   * "0x02" キーワード専用パラメーターのデフォルト値の辞書

   * "0x04" a tuple of strings containing parameters' annotations

   * "0x08" 自由変数のセルを含み、クロージャを構成するタプル

   * "0x10" 関数オブジェクトの *annotate function*

   Added in version 3.13.

   バージョン 3.14 で変更: 関数オブジェクトのアノテーション関数を示す
   "0x10" を追加しました。

BUILD_SLICE(argc)

   スライスオブジェクトをスタックにプッシュします。 *argc* は 2 または
   3 でなければなりません。 2 の場合は次の処理を行います。

      end = STACK.pop()
      start = STACK.pop()
      STACK.append(slice(start, end))

   3 の場合は次の処理を行います。

      step = STACK.pop()
      end = STACK.pop()
      start = STACK.pop()
      STACK.append(slice(start, end, step))

   詳しくは組み込み関数 "slice()" を参照してください。

EXTENDED_ARG(ext)

   デフォルトの 1 バイトに収まらない大きさの引数を持つオペコードの前に
   付けます。 *ext* は、引数の上位ビットとなる追加の 1 バイトを保持し
   ます。 各オペコードの前には最大 3 つの "EXTENDED_ARG" を付けられ、2
   バイトから 4 バイトの引数を構成できます。

CONVERT_VALUE(oparg)

   "oparg" に応じて値を文字列に変換します。

      value = STACK.pop()
      result = func(value)
      STACK.append(result)

   * "oparg == 1": *value* に "str()" を適用します

   * "oparg == 2": *value* に "repr()" を適用します

   * "oparg == 3": *value* に "ascii()" を適用します

   フォーマット済み文字列リテラル (f-string) の実装に使います。

   Added in version 3.13.

FORMAT_SIMPLE

   スタックの先頭の値を書式化します。

      value = STACK.pop()
      result = value.__format__("")
      STACK.append(result)

   フォーマット済み文字列リテラル (f-string) の実装に使います。

   Added in version 3.13.

FORMAT_WITH_SPEC

   指定された値を、指定された書式指定で書式化します。

      spec = STACK.pop()
      value = STACK.pop()
      result = value.__format__(spec)
      STACK.append(result)

   フォーマット済み文字列リテラル (f-string) の実装に使います。

   Added in version 3.13.

MATCH_CLASS(count)

   "STACK[-1]" はキーワード属性名のタプル、"STACK[-2]" は照合に使うク
   ラス、"STACK[-3]" は照合対象です。 *count* は位置によるサブパターン
   の数です。

   "STACK[-1]"、"STACK[-2]"、"STACK[-3]" をポップします。 "STACK[-3]"
   が "STACK[-2]" のインスタンスで、*count* と "STACK[-1]" が要求する
   位置属性とキーワード属性を持っていれば、取り出した属性のタプルをプ
   ッシュします。 それ以外は "None" をプッシュします。

   Added in version 3.10.

   バージョン 3.11 で変更: 以前は、成功 ("True") または失敗 ("False")
   を示す真偽値もプッシュしていました。

RESUME(context)

   何もしない命令です。 内部のトレース、デバッグ、最適化のためのチェッ
   クを行います。

   "context" オペランドは 2 つの部分で構成されます。 下位 2 ビットは
   "RESUME" が現れる位置を示します:

   * "0" ジェネレーター、コルーチン、非同期ジェネレーターのいずれでも
     ない関数の開始位置

   * "1" "yield" 式の後

   * "2" "yield from" 式の後

   * "3" "await" 式の後

   その次のビットは、RESUME の例外処理の深さが "1" なら "1"、それ以外
   なら "0" です。

   Added in version 3.11.

   バージョン 3.13 で変更: "oparg" の値に例外処理の深さの情報を含める
   ようになりました。

RETURN_GENERATOR

   現在のフレームからジェネレーター、コルーチン、非同期ジェネレーター
   を作成します。 これらの呼び出し可能オブジェクトのコードオブジェクト
   で、最初のオペコードとして使います。 現在のフレームをクリアし、新し
   く作ったジェネレーターを返します。

   Added in version 3.11.

SEND(delta)

   "STACK[-1] = STACK[-2].send(STACK[-1])" と同じです。 "yield from"
   と "await" 文で使います。

   呼び出しが "StopIteration" を送出した場合、スタックの先頭の値をポッ
   プし、例外の "value" 属性をプッシュして、バイトコードカウンターを
   *delta* だけ増やします。

   Added in version 3.11.

HAVE_ARGUMENT

   これは実際にはオペコードではありません。 [0,255] の範囲のオペコード
   について、引数を使わないもの ("< HAVE_ARGUMENT") と使うもの (">=
   HAVE_ARGUMENT") の境界を示します。

   アプリケーションで疑似命令や特殊化された命令を扱う場合は、代わりに
   "hasarg" コレクションを使ってください。

   バージョン 3.6 で変更: すべての命令が引数を持つようになりましたが、
   "< HAVE_ARGUMENT" のオペコードは引数を無視します。 以前は ">=
   HAVE_ARGUMENT" のオペコードだけが引数を持っていました。

   バージョン 3.12 で変更: "dis" モジュールに疑似命令を追加しました。
   疑似命令では、"HAVE_ARGUMENT" との比較で引数を使うかどうかを判定す
   ることはできません。

   バージョン 3.13 で非推奨: 代わりに "hasarg" を使ってください。

CALL_INTRINSIC_1

   引数を 1 つ取る内部関数を呼び出します。 "STACK[-1]" を引数として渡
   し、結果を "STACK[-1]" に設定します。 性能が重要ではない機能の実装
   に使います。

   どの内部関数を呼び出すかはオペランドで決まります:

   +-------------------------------------+-------------------------------------+
   | オペランド                          | 説明                                |
   |=====================================|=====================================|
   | "INTRINSIC_1_INVALID"               | 無効                                |
   +-------------------------------------+-------------------------------------+
   | "INTRINSIC_PRINT"                   | 引数を標準出力に表示します。 REPL   |
   |                                     | で使います。                        |
   +-------------------------------------+-------------------------------------+
   | "INTRINSIC_IMPORT_STAR"             | 指定された名前のモジュールに対して  |
   |                                     | "import *" を実行します。           |
   +-------------------------------------+-------------------------------------+
   | "INTRINSIC_STOPITERATION_ERROR"     | Extracts the return value from a    |
   |                                     | "StopIteration" exception.          |
   +-------------------------------------+-------------------------------------+
   | "INTRINSIC_ASYNC_GEN_WRAP"          | 非同期ジェネレーターの値をラップし  |
   |                                     | ます                                |
   +-------------------------------------+-------------------------------------+
   | "INTRINSIC_UNARY_POSITIVE"          | 単項 "+" 演算を行います             |
   +-------------------------------------+-------------------------------------+
   | "INTRINSIC_LIST_TO_TUPLE"           | リストをタプルに変換します          |
   +-------------------------------------+-------------------------------------+
   | "INTRINSIC_TYPEVAR"                 | "typing.TypeVar" を作成します       |
   +-------------------------------------+-------------------------------------+
   | "INTRINSIC_PARAMSPEC"               | "typing.ParamSpec" を作成します     |
   +-------------------------------------+-------------------------------------+
   | "INTRINSIC_TYPEVARTUPLE"            | "typing.TypeVarTuple" を作成します  |
   +-------------------------------------+-------------------------------------+
   | "INTRINSIC_SUBSCRIPT_GENERIC"       | 引数を添字とした "typing.Generic"   |
   |                                     | を返します                          |
   +-------------------------------------+-------------------------------------+
   | "INTRINSIC_TYPEALIAS"               | "typing.TypeAliasType" を作成します |
   |                                     | 。 "type" 文で使います。 引数は 、  |
   |                                     | 型エイリアスの名前、型パラメーター  |
   |                                     | 、値のタプルです。                  |
   +-------------------------------------+-------------------------------------+

   Added in version 3.12.

CALL_INTRINSIC_2

   引数を 2 つ取る内部関数を呼び出します。 性能が重要ではない機能の実
   装に使います。

      arg2 = STACK.pop()
      arg1 = STACK.pop()
      result = intrinsic2(arg1, arg2)
      STACK.append(result)

   どの内部関数を呼び出すかはオペランドで決まります:

   +------------------------------------------+-------------------------------------+
   | オペランド                               | 説明                                |
   |==========================================|=====================================|
   | "INTRINSIC_2_INVALID"                    | 無効                                |
   +------------------------------------------+-------------------------------------+
   | "INTRINSIC_PREP_RERAISE_STAR"            | "try-except*" から送出する          |
   |                                          | "ExceptionGroup" を計算します。     |
   +------------------------------------------+-------------------------------------+
   | "INTRINSIC_TYPEVAR_WITH_BOUND"           | 上限付きの "typing.TypeVar" を作成  |
   |                                          | します。                            |
   +------------------------------------------+-------------------------------------+
   | "INTRINSIC_TYPEVAR_WITH_CONSTRAINTS"     | 制約付きの "typing.TypeVar" を作成  |
   |                                          | します。                            |
   +------------------------------------------+-------------------------------------+
   | "INTRINSIC_SET_FUNCTION_TYPE_PARAMS"     | 関数の "__type_params__" 属性を設定 |
   |                                          | します。                            |
   +------------------------------------------+-------------------------------------+

   Added in version 3.12.

LOAD_SPECIAL

   "STACK[-1]" の特殊メソッドを検索します。 "type(STACK[-1]).__xxx__"
   がメソッドなら、"type(STACK[-1]).__xxx__; STACK[-1]" をスタックに残
   します。 メソッドでなければ、"STACK[-1].__xxx__; NULL" をスタックに
   残します。

   Added in version 3.14.

**疑似命令**

これらのオペコードは Python のバイトコードには現れません。 コンパイラ
が使用しますが、バイトコードを生成する前に実際のオペコードに置き換えら
れるか、取り除かれます。

SETUP_FINALLY(target)

   後続のコードブロックの例外ハンドラーを設定します。 例外が発生すると
   、値スタックの深さを現在の状態に戻し、"target" の例外ハンドラーに制
   御を移します。

SETUP_CLEANUP(target)

   "SETUP_FINALLY" と同じですが、例外発生時に最後の命令 ("lasti") もス
   タックにプッシュし、"RERAISE" で復元できるようにします。 例外が発生
   すると、値スタックの深さとフレーム内の最後の命令を現在の状態に戻し
   、"target" の例外ハンドラーに制御を移します。

SETUP_WITH(target)

   "SETUP_CLEANUP" と同じですが、例外発生時にスタックからさらに 1 要素
   をポップしてから、"target" の例外ハンドラーに制御を移します。

   この変種は "with" と "async with" で使います。 これらの構文は、コン
   テキストマネージャの "__enter__()" または "__aenter__()" の返り値を
   スタックにプッシュします。

POP_BLOCK

   直前の "SETUP_FINALLY"、"SETUP_CLEANUP"、"SETUP_WITH" に対応するコ
   ードブロックの終わりを示します。

JUMP
JUMP_NO_INTERRUPT

   方向の指定のない相対ジャンプ命令です。 アセンブラーが、対応する方向
   (前方/後方) の命令に置き換えます。

JUMP_IF_TRUE
JUMP_IF_FALSE

   スタックを変更しない条件付きジャンプです。 "COPY 1"、"TO_BOOL"、
   "POP_JUMP_IF_TRUE/FALSE" の並びに置き換えます。

LOAD_CLOSURE(i)

   "fast locals" 領域のスロット "i" にあるセルへの参照をスタックにプッ
   シュします。

   "LOAD_CLOSURE" はアセンブラーで "LOAD_FAST" に置き換えられます。

   バージョン 3.13 で変更: このオペコードは疑似命令になりました。


命令コードコレクション
======================

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

バージョン 3.12 で変更: これらのコレクションは、疑似命令と計測用命令も
含むようになりました。 これらは、それぞれ ">= MIN_PSEUDO_OPCODE" と
">= MIN_INSTRUMENTED_OPCODE" の値を持つオペコードです。

dis.opname

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

dis.opmap

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

dis.cmp_op

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

dis.hasarg

   引数を使うバイトコードのシーケンス。

   Added in version 3.12.

dis.hasconst

   定数にアクセスするバイトコードのリスト。

dis.hasfree

   *自由 (クロージャ) 変数* にアクセスするバイトコードのシーケンス。
   ここで「自由」とは、内側のスコープから参照される現在のスコープの名
   前、または現在のスコープから参照される外側のスコープの名前を指しま
   す。 グローバルや組み込みのスコープへの参照は *含みません*。

dis.hasname

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

dis.hasjump

   ジャンプ先を持つバイトコードのシーケンス。 ジャンプはすべて相対ジャ
   ンプです。

   Added in version 3.13.

dis.haslocal

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

dis.hascompare

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

dis.hasexc

   例外ハンドラーを設定するバイトコードのシーケンス。

   Added in version 3.12.

dis.hasjrel

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

   バージョン 3.13 で非推奨: すべてのジャンプが相対ジャンプになりまし
   た。 "hasjump" を使ってください。

dis.hasjabs

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

   バージョン 3.13 で非推奨: すべてのジャンプが相対ジャンプになりまし
   た。 このリストは空です。
