2016-04-29 32 views
1

どのようにフレームノードをバイトコードに挿入しますか?ASMを使用してFrameNodeを挿入

mn.instructions.insertBefore(random, new FrameNode(Opcodes.F_FULL, 1 /**IDK**/, 
    new Object[]{ "java/lang/String", "[C", "java/lang/String", "T", "I", "I", "[C]" }, 
    1/**IDK**/, new Object[] { "[C]","[]" })); 

うまく機能しなかったこと:

FRAME FULL [java/lang/String [C java/lang/String T I I [C] [] 

私の最初の試みは、ということでした。出力:

FRAME FULL [[java/lang/String] [java/lang/String] 

答えて

3

スタックフレームは、いくつかのローカル変数とオペランドスタック上のいくつかの値で構成されています。あなたが、再現しようとしていることは明らかフォーム

FRAME FULL [list of local variables types] [list of operand stack time types]

あなたがしなければならない最初の事の人間が読める文字列にその状態の変換の結果である、出力からブラケットを特定することです形式は、含まれる型シグネチャの理解を必要とし、[Cのような開始括弧で始まる署名として、配列型、つまり文字配列を表します。言い換えると、いくつかの開始括弧は型シグネチャの一部であり、その他は出力書式の一部ですが、閉じ括弧は常に出力書式の一部であり、型シグネチャには現れません。

次に、2つのグループ内でタイプシグネチャを識別したら、ローカル変数とオペランドスタックアイテムの適切な数を指定します。

FRAME FULL // frame type 
[   // start local variables 
    java/lang/String 
    [C 
    java/lang/String 
    T 
    I 
    I 
    [C 
] // seven local variables specified 
[ // start of operand stack 
] // empty operand stack 

をしかし、その後、あなたは印刷出力から導出残念ながらないですし、ちょうど必ずしも正しい意味するものではありません同じ印刷物を再現意味タイプ項目の、について考え始める必要があります:あなたのケースでは、あなたは持っていますコード。

すなわち、アイテムTIFrameNode"T""I"を通過その場合、正しいであろう、完全修飾名をそれぞれTIを有するクラスを参照することができます。

new FrameNode(Opcodes.F_FULL, 7, new Object[] { 
    "java/lang/String", "[C", "java/lang/String", 
    Opcodes.TOP, Opcodes.INTEGER, Opcodes.INTEGER, "[C" }, 0, new Object[0]); 
:しかし、それは彼らがASMで事前に定義された Integer定数を使用して参照する必要があります非クラスのスタックフレームタイプ <トップ>intを参照している可能性が高いです
関連する問題