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 ファイルを調べてみましたが、定数プールがダンプされません。
次に試すことができるアイデアはありますか?