2

バイトコード インストルメンテーションを使用して呼び出される前に、メソッドに渡された引数を記録しようとしています。

現在、Javaコードを使用して計測している間、最初にすべての引数をローカルにポップし、次にそれらを2回プッシュする必要があります(1回は記録するメソッド用で、この場合はすべてのプリミティブ型をボックス化された型に変換する必要があります)実際のメソッド呼び出し)。

私が理想的にやりたいことは、メソッド呼び出しのためにプッシュされた引数の数に対してスタック全体を複製することです。ただし、jvm バイトコードの dup() 命令は、スタックの最上位の値の複製のみを許可します。JNI を使用してスタック全体を一度に複製することは可能ですか?

4

1 に答える 1

1

いいえ。メソッドがコンパイルされると、スタックは実質的になくなります。JVM には、ネイティブ コードをコンパイルする方法がありません。したがって、スタックを直接操作しようとしても、その場でフォーマットが変更されます (そしてレジスタが使用されます)。

スタックの上位 4 つのスロットを (dup2_x2 を使用して) かなり簡単に複製できますが、それ以上の場合は、おそらくローカル変数を使用する必要があります。

于 2008-12-04T14:09:33.893 に答える