Wie „Illegal Art in constant pool“ vermeiden „ldc_w “ können Sie in Jasmine?
Frage
Ich schreibe einen Compiler, der Jasmin-Code generiert und wollen eine Methode aufzurufen, die eine Klasse als Parameter annimmt.
public class CTest
{
public static void main(String[] args)
throws Exception
{
java.lang.reflect.Array.newInstance(CTest.class, 0);
}
}
So in Jasmin, denke ich, dass sein sollte:
.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
Wenn ich es zusammenstellen und führen Sie es erhalte ich:
Ausnahme im Thread "main" java.lang.VerifyError: (Klasse: CTest2, Methode: Haupt Unterschrift: ([Ljava / lang / String;) V) Illegal-Typ in Konstantenpool
an dem demontierten Code der Suche nach sowohl CTest.class (die Java-Version) und CTest2.class (die Jasmin-Version) mit "javap -c -verbose" sie beide erscheinen die Konstanten-Pool die gleiche Art und Weise einzurichten:
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
Ich habe schon in Jasmin zwei Bugs behoben, aber ich kann nicht sehen, was es falsch machen, wenn die Klasse im konstanten Pool für „ldc_w“ setzen es setzt Klassen im konstanten Pool für andere Befehle, wie "Neu" und "anewarray" richtig.
Ich habe in den .class-Dateien mit TraceClassVisitor in ASM versucht, Blick, aber nicht die Konstanten-Pool-Dump.
Alle Ideen, was ich kann nächstes versuchen?
Lösung
Sie müssen sicherstellen, dass die Versionsnummer der Klasse mindestens 49 (siehe visitLdcInsn auf diesem ASM Javadoc ).