2016-05-18 15 views
6

私は、バイトコードを生成するためのASMライブラリを学んでいます。私が悪いのローカル変数の型と、いくつかのミスを犯し、エラーを得たいくつかの点で: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) 

問題が見つけて修正することは困難ではなかったが、私は、このスタックマップテーブルの事は何か興味が?

答えて

8

StackMapTableは、Java 6以降でコンパイルされたクラスの属性です。 verification by type checkingの処理中にJVMによって使用されます。

基本的に、スタックマップフレームは、実行中のメソッドの期待されるローカル変数とオペランドスタック(つまりフレームの状態)を定義します。実行時に、期待どおりにJVMがVerifyErrorをスローし、実際の型は互換性がありません。

スペースを節約するために、すべての命令に対応するフレームがあるわけではありません。表は潜在的なジャンプターゲットまたは例外ハンドラのフレームのみを定義します。他のフレームは、これらのフレームから容易に推測できます。上記の表では、フレームは一部のバイトコードオフセットに対してのみ定義されています。

+3

基本的には、検証者が痛いほど遅く、スピードを上げるには他の方法も見えないため、Sunが追加した「機能」です。 –

関連する問題