3

Jasmin コードを生成するコンパイラを作成しており、クラスをパラメーターとして受け取るメソッドを呼び出したいと考えています。

public class CTest
{
    public static void main(String[] args)
        throws Exception
    {
        java.lang.reflect.Array.newInstance(CTest.class, 0);
    }
}

したがって、ジャスミンでは、次のようにする必要があると思います。

.class public CTest2
.super java/lang/Object

.method public static main([Ljava/lang/String;)V
    .limit stack 2
    .limit locals 1
    ldc_w CTest2
    iconst_0
    invokestatic java/lang/reflect/Array/newInstance(Ljava/lang/Class;I)Ljava/lang/Object;
    pop
    return
.end method

組み立てて実行すると、次のようになります。

スレッド「メイン」での例外 java.lang.VerifyError: (クラス: CTest2、メソッド: メイン シグネチャ: ([Ljava/lang/String;)V) 定数プールの不正な型

「javap -c -verbose」を使用して CTest.class (Java バージョン) と CTest2.class (Jasmin バージョン) の両方の逆アセンブル コードを見ると、どちらも同じ方法で定数プールを設定しているように見えます。

const #2 = class        #16;    //  CTest
const #16 = Asciz       CTest;

  0:   ldc_w   #2; //class CTest

const #14 = Asciz       CTest2;
const #17 = class       #14;    //  CTest2

  0:   ldc_w   #17; //class CTest2

Jasmin の 2 つのバグは既に修正しましたが、"ldc_w" の定数プールにクラスを配置すると、クラスが "new" や "anewarray 「正しく。

ASM で TraceClassVisitor を使用して .class ファイルを調べてみましたが、定数プールがダンプされません。

次に試すことができるアイデアはありますか?

4

1 に答える 1

4

クラスのバージョン番号が少なくとも 49 であることを確認する必要があります (このASM Javadoc ページの visitLdcInsn を参照してください)。

于 2010-05-19T22:35:08.417 に答える