jou4のブログスマートフォン用の表示で見るjou4のブログこの広告は、90日以上更新していないブログに表示しています。frameについては以下を読みました。Overflowこれらを読んで、次のように理解しました。frameとは、バイトコードのある位置におけるローカル変数とスタックの型の状態を示すもので、VMの各命令が扱う値が正しい型かを検証するために使われます。全ての型を推論することは難しく、クラスローディングを遅くしてしまうため、その解決のために導入されたようです。クラスファイルのサイズが大きくなりすぎないようフレームで型を明示する位置はジャンプのターゲットに絞っており、またフレームの差分で指定できるようにしています。offset)における型の状態を表します。frameはoffset_deltaという値を持ちます。offset+offset_delta+1で求められます。offsetになります。frameの種類についてです。same_frameframeの種類を示すframe_typeの値が[0-63]のものがこれに該当します。このframeは1つ前のframeとローカル変数が同じでスタックが空であることを意味します。offset_deltaはframe_typeと同じ値になります。(frame_type=0ならoffset_delat=0)same_locals_1_stack_item_frameframe_typeの値が[64-127]のものがこれに該当します。このframeは1つ前のframeとローカル変数が同じでスタックに1つ値が積まれていることを意味します。offset_deltaはframe_type-64になります。(frame_type=64ならoffset_delat=0)same_locals_1_stack_item_frame_extendedframe_typeの値が247のものがこれに該当します。このframeはsame_locals_1_stack_item_frameと同じで、1つ前のframeとローカル変数が同じでスタックに1つ値が積まれていることを意味します。明示的にoffset_deltaを与える必要がある点がsame_locals_1_stack_item_frameと異なります。chop_frameframe_typeの値が[248-250]のものがこれに該当します。このframeはスタックが空で、1つ前のframeからいくつかのローカル変数が削除されていることを意味します。削除されているローカル変数の数は、251-frame_typeで求められます。明示的にoffset_deltaを与える必要があります。same_frame_extendedframe_typeの値が251のものがこれに該当します。意味するところはsame_frameと同じですが、明示的にoffset_deltaを与える必要がある点で異なります。append_frameframe_typeの値が[252-254]のものがこれに該当します。このframeはスタックが空で、1つ前のframeからいくつかのローカル変数が追加されていることを意味します。追加されているローカル変数の数は、frame_type-251で求められます。明示的にoffset_deltaを与える必要があります。full_frameframe_typeの値が255のものがこれに該当します。ローカル変数、スタックの状態を全て明示的に示す必要があります。offset_deltaも明示します。frameを確認します。javaコードは以下です。System.out.println("z");}これは以下のバイトコードになります。frameを見ていきます。offsetはoffset_deltaである14。14からのジャンプのターゲットと一致します。iload_1においてローカル変数にintが1つ(252-251)増えていることを示します。offsetは31(14+16+1)です。#31においてローカル変数に前のframeから変化がないことを示します。offsetは46(31+14+1)です。#15においてローカル変数にlongが1つ(252-251)増えていることを示します。offsetは54(46+7+1)です。returnにおいてローカル変数が1つ(251-250)減っていることを示します。frameをASMで指定するにはMethodVisitor.visitFrameを用います。F_CHOPを指定できます。前述のframe_typeとは若干異なりますが、名前から対応付けはわかります。F_NEWはClassReaderで使うもののようなのでClassWriterでは不要。nLocal以降はtypeに応じてスタックとローカル変数の内容を指定します。このvisitFrameを使ってFizzBuzzを書き直してみました。(条件分岐と繰り返し)月別アーカイブはてなブログをはじめよう!jou4さんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。