バイトコード

バックグラウンド

SpiderMonkey バイトコードは、JavaScript エンジンで使用される標準形式のコード表現です。JavaScript フロントエンドは、ソーステキストから AST を構築してから、その AST から JSScript データ構造の一部としてスタックベースのバイトコードを生成します。バイトコードは、JSScript データ構造にも含まれているアトムとオブジェクトを (通常は配列インデックスで) 参照できます。

エンジン内では、すべてのバイトコードはスタックフレーム内で実行されます。グローバル (最上位) コードでも eval コードでもスタックフレームが関連付けられています。スタック上のフレームには、いくつかの異なるカテゴリの JavaScript 値 (タグ付き値形式) 用のスペースがあります。単一の JavaScript 値のスペースは「スロット」と呼ばれ、カテゴリは次のとおりです。

  • 引数スロット: 現在のフレームに渡される実際の引数を保持します
  • ローカルスロット: 現在のコードで使用されているローカル変数を保持します
  • 式スロット: スタック上で式を計算するために必要な一時スペースを保持します。たとえば、(a + b) + c では、a をプッシュしてから b をプッシュして add をプッシュし、さらに c をプッシュから add のようにします。これには、最大2つの式スロットの深さが必要です

this のような値と呼び出し先/戻り値を保持する、専用の機能のために予約されているいくつかのスロットもあります。

式スタックにプッシュされた最新の値に対応する "Top of Stack" (TOS) が常にあります。すべてのバイトコードは、この場所に関して暗黙的に機能します。

バイトコードリスト

すべてのオペコードには、実行全体のスタック効果を表すために [-popcount, +pushcount] という注釈が付けられています。

バイトコードのリストは SpiderMonkey の内部: バイトコードの説明ページに移動しました。