Wie „Illegal Art in constant pool“ vermeiden „ldc_w “ können Sie in Jasmine?

StackOverflow https://stackoverflow.com/questions/2784791

  •  03-10-2019
  •  | 
  •  

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?

War es hilfreich?

Lösung

Sie müssen sicherstellen, dass die Versionsnummer der Klasse mindestens 49 (siehe visitLdcInsn auf diesem ASM Javadoc ).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top