2016-05-18 8 views
6

मैं बाइटकोड उत्पन्न करने के लिए एएसएम लाइब्रेरी सीख रहा हूं। कुछ बिंदु पर मैं बुरा स्थानीय चर प्रकार के साथ कुछ गलती की है और एक त्रुटि मिली:जेवीएम बाइटकोड में स्टैकमैप टेबल क्या है?

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) 

समस्या खोजने के लिए और ठीक करने के लिए मुश्किल नहीं था, लेकिन मैं उत्सुक क्या एक इस stackmap तालिका बात है कर रहा हूँ?

उत्तर

8

StackMapTable जावा 6 या उच्चतर के साथ संकलित कक्षाओं में एक विशेषता है। इसका उपयोग verification by type checking की प्रक्रिया के दौरान जेवीएम द्वारा किया जाता है।

असल में, एक स्टैक नक्शा फ्रेम स्थानीय निष्पादन के अपेक्षित प्रकारों और उसके निष्पादन के दौरान एक विधि के ऑपरेंड स्टैक (यानी फ्रेम की स्थिति) को परिभाषित करता है। रन-टाइम के दौरान, JVM VerifyError फेंकता है यदि अपेक्षित और वास्तविक प्रकार असंगत हैं।

अंतरिक्ष बचाने के लिए, हर निर्देश में एक समान फ्रेम नहीं है। तालिका केवल संभावित कूद लक्ष्य या अपवाद हैंडलर के लिए फ्रेम को परिभाषित करती है। इन फ्रेमों से आसानी से अनुमान लगाया जा सकता है। आप उपरोक्त अपनी तालिका में देख सकते हैं कि फ्रेम केवल कुछ बाइटकोड ऑफसेट के लिए परिभाषित किए गए हैं।

+3

हाँ, मूल रूप से यह एक "विशेषता" है जिसे सूर्य ने जोड़ा क्योंकि उनके सत्यापनकर्ता दर्द से धीमे थे और वे इसे तेज करने के किसी भी अन्य तरीके को देखने के लिए बहुत घने थे। –

संबंधित मुद्दे