2

私は ASM 4.1 を使用してコンパイラーを作成するのに忙しいです。中間言語を Java バイトコードにコンパイルする必要があります。ASM 4.1 API には、「実際、これらのノードは (*) GOTO や THROW などの無条件分岐命令に続く命令ノード i の直前に挿入する必要があります。これはジャンプ命令のターゲットです。例外ハンドラ ブロック. "しかし、ASM ガイド (「ASM 4.0 A Java バイトコード エンジニアリング ライブラリ」) でフレームの使用法を見つけることができません。フレームの使用法を知っているのは誰ですか? visitFrame/FrameNode のすべてのパラメータの意味は何ですか? ASMifier を使用すると、ある時点で「visitFrame(Opcodes.F_APPEND,...)」を取得し、別の時点で「visitFrame(Opcodes.F_SAME,...)」を取得するのはなぜですか? 理解できません!!たとえば、以下のようなコード:

    int a = 2;
    int b = 3;
    if(a == 3){
        System.out.println("hello");
    }else{
        System.out.println(a);

        if(b == 23){
            System.out.println("world");
        }else{
            System.out.println(b);
        }
    }

ASMifier を使用すると、結果を取得できます (申し訳ありませんが、評判が悪いため画像を添付できません)、次のような命令があります:"visitFrame(Opcodes.F_APPEND,2, new Object[]{Opcodes.INTEGER , Opcodes.INTEGER}, 0, null)" . パラメータの意味を教えてください。

どうもありがとう。

4

2 に答える 2

2

以下のリンクで詳細な回答を見つけることができます。

スタック マップ フレームのより良い説明はありますか

Java 1.7 では、クラスの検証を高速化するためにこのオプションが導入されました。フレームには、変数タイプとスタック タイプの 2 つの部分があります。最初のフレームは、メソッド タイプの説明、最初の ?STORE 呼び出し、およびメソッドの戻り値のタイプによって決定されます。

各 GOTO / JUMP 呼び出しの後、スタック マップ フレームの最新の説明を提供する必要があります。スペースを節約するために、SAME、APPEND などのオプションを使用するか、変数タイプの FULL 配列を指定してすべての変数を再度記述することができます。

たとえば、CATCH セクションでは、Retrun Stack Type がメソッドの戻り値の型からキャッチされた例外の Exception クラスの型に変更されます。

goto コマンドを使用して異なるループ ブロック間をジャンプする場合、各ループの実行ブロックは、ループ内で使用される変数に対して異なるフレーム記述を使用する場合があります。

于 2015-11-09T08:34:57.040 に答える
0

フレームは、スコープが限定された特定の型のローカル変数のようなものです。ローカル変数には番号が付けられていますが、デバッグ情報をデコードすると、与えられた名前を確認できます。

于 2013-07-18T15:25:22.013 に答える