2016-05-18 11 views
6

Uczę się biblioteki ASM do generowania kodu bajtowego. W pewnym momencie zrobiłem jakiś błąd ze złym lokalnego typu zmiennej i dostaje błąd:Co to jest tabela stackmap w kodzie bajtowym jvm?

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) 

Problemem nie było trudno znaleźć i naprawić, ale jestem ciekaw co jest to stackmap stół rzecz?

Odpowiedz

8

StackMapTable to atrybut w klasach skompilowanych przy użyciu środowiska Java 6 lub nowszego. Jest używany przez maszynę JVM podczas procesu verification by type checking.

Zasadniczo, ramka mapy stosu określa oczekiwane typy zmiennych lokalnych i stos argumentu (to znaczy stan ramki) metody podczas jej wykonywania. Podczas wykonywania JVM rzuca VerifyError, jeśli oczekiwane i rzeczywiste typy są niekompatybilne.

Aby zaoszczędzić miejsce, nie każda instrukcja ma odpowiednią ramkę. Tabela definiuje tylko ramki dla potencjalnych obiektów skoku lub procedur obsługi wyjątków. Inne ramki można łatwo wywnioskować z tych. Możesz zobaczyć w powyższej tabeli, że ramki są zdefiniowane tylko dla niektórych przesunięć kodu bajtowego.

+3

Tak, w zasadzie jest to "funkcja", którą Sun dodał, ponieważ ich weryfikator był boleśnie powolny i byli zbyt gęste, aby zobaczyć jakikolwiek inny sposób na przyspieszenie. –