2016-05-18 29 views
6

Bayt kodu oluşturmak için ASM kitaplığını öğreniyorum. Bir noktada ben kötü yerel değişken türü ile bazı hata yaptı ve bir hata var:JVM bayt kodunda stackmap tablosu nedir?

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) 

sorun bulmak ve gidermek için zor değildi ama bu stackmap masa şey nedir merak ediyorum? Java 6 veya üstü ile derlenen sınıflardaki bir öznitelik

cevap

8

StackMapTable. verification by type checking işlemi sırasında JVM tarafından kullanılır. Temel olarak, bir yığın eşleme çerçevesi, yürütülmesi sırasında beklenen bir yerel değişken türünü ve işlenecek yığını (yani çerçevenin durumunu) tanımlar. Çalışma zamanı boyunca, JVM beklenildiği takdirde VerifyError'u atar ve gerçek türler uyumsuzdur.

Yer kazanmak için, her komutun karşılık gelen bir karesi yoktur. Tablo, yalnızca potansiyel atlama hedefleri veya istisna işleyicileri için çerçeveler tanımlar. Diğer çerçeveler bunlardan kolayca çıkarılabilir. Yukarıdaki tabloda, çerçevelerin yalnızca bazı baytkod ofsetleri için tanımlandığını görebilirsiniz.

+3

Evet, temelde Sun'ın eklediği bir "özellik", çünkü doğrulayıcıları ağrılı bir şekilde yavaştı ve hızlandırmak için başka bir yol görmek için çok yoğundu. –