2016-05-18 6 views
6

Ich lerne ASM-Bibliothek für die Generierung von Bytecode. Irgendwann machte ich einige Fehler mit schlechten lokalem Variablentyp und bekam einen Fehler:Was ist Stackmap-Tabelle in JVM-Bytecode?

Exception in thread "main" java.lang.VerifyError: Bad local variable type 
Exception Details: 
    Location: 
    Loops.start()V @56: aload_1 
    Reason: 
    Type top (current frame, locals[1]) is not assignable to reference type 


    Stackmap Table: 
    full_frame(@24,{Object[#2],Object[#9]},{Integer}) 
    full_frame(@25,{Object[#2],Object[#9]},{Integer,Integer}) 
    same_locals_1_stack_item_frame(@44,Integer) 
    full_frame(@45,{Object[#2],Object[#9]},{Integer,Integer}) 
    full_frame(@48,{Object[#2]},{Integer}) 
    full_frame(@80,{Object[#2],Integer},{Integer}) 
    full_frame(@81,{Object[#2],Integer},{Integer,Integer}) 
    full_frame(@87,{Object[#2]},{Integer}) 
    full_frame(@119,{Object[#2],Integer},{Integer}) 
    full_frame(@120,{Object[#2],Integer},{Integer,Integer}) 
    same_locals_1_stack_item_frame(@123,Integer) 

Das Problem war nicht schwer zu finden und zu beheben, aber ich bin gespannt, was eine ist dieses stackmap Tisch Ding?

Antwort

8

StackMapTable ist ein Attribut in Klassen, die mit Java 6 oder höher kompiliert wurden. Es wird von der JVM während des Prozesses verification by type checking verwendet.

Grundsätzlich definiert ein Stapel-Map-Frame die erwarteten Typen von lokalen Variablen und den Operandenstapel (d. H. Den Zustand des Frames) einer Methode während ihrer Ausführung. Während der Laufzeit gibt die JVM den Wert VerifyError aus, wenn erwartete und tatsächliche Typen nicht kompatibel sind.

Um Platz zu sparen, hat nicht jede Anweisung einen entsprechenden Rahmen. Die Tabelle definiert nur Frames für potenzielle Sprungziele oder Ausnahme-Handler. Andere Rahmen können leicht von diesen abgeleitet werden. Sie können in Ihrer obigen Tabelle sehen, dass Frames nur für einige Bytecode-Offsets definiert sind.

+3

Ja, im Grunde ist es ein "Feature", das Sun hinzugefügt hat, weil ihr Verifier schmerzhaft langsam war und sie zu dicht waren, um eine andere Möglichkeit zu sehen, es zu beschleunigen. –