2011-01-12 16 views
4

にスタックオペランドの配列リファレンスを取得する私は、JavaバイトコードinstrumantationのためのASMのAPIと連携し、私は、任意の配列にそれぞれアクセスして(配列の名前で)アクセスされる配列を決定することができるようにしたいと思います。は、Javaバイトコード

は、私はそれには二つの問題があります。 を - のは、例えばiastoreのinstrutionてみましょう。配列参照は、2つの他の変数(valueとindex)の下のオペランドスタックに置かれます。スタックを破壊することなくarrayrefを取得するにはどうすればよいですか(スタック内に2つ以上の上位変数を複製することはできません) 私がスタックからポップインデックスと値から考えて、配列リファレンスを取得するにはどこかにし、それらを保存し、最終的に戻ってスタックへのインデックスと値をプッシュしますが、私は本当にこれを行う方法がわからない...

  • 私はarrayref(一度持っていれば)配列の名前(ユーザーが配列を呼び出すと宣言した名前)から取得したいと思います。事前に

感謝。

+1

「アレイの名前」とはどういう意味ですか? –

+0

クラスファイルから変数名を取得できます。しかし、多くの変数(ローカルとメンバ)は同じ配列オブジェクトを指すことができるので、どの変数名を使用したいでしょうか? – Anon

+0

私は元のJavaプログラムのこの配列の名前を意味します。おかげで – Roi

答えて

0

dup2_x1, pop2, dup_x2これでスタックの先頭に配列参照があります。しかし、一般的には、ローカル変数を使用する方が簡単であり、JITの後も最終結果が変わらないはずです。

他の人がコメントしたように、質問の第2部分はあまり意味がありません。変数にはオブジェクトは必要ではなく、配列に変数を格納することなく配列を割り当てて使用することができます。

しかし、私はあなたの意図がx[0]=1のようなアクセスを追跡し、Xにそれを属性することであり、それはデータフロー解析によって達成することができると思います。 aloadとその値がどこで使われているのかを追跡し、arrayrefがaloadから真っ直ぐであることが判明した場合、その配列は変数から来たものです。

+0

ありがとう!これは本当に私の意図ですが、私はあなたが何を意味するのか見ていません: "あなたのarrayrefがaloadからまっすぐであることが判明したら"。それを説明していただけますか? – Roi

関連する問題