Как продублировать параметры метода в стеке JVM с помощью ASM? - PullRequest
1 голос
/ 09 марта 2020

Я использую ASM для вставки метода после специального метода. Например, метод выглядит следующим образом:

a.doSomeThing(p1, p2, p3, p4, p5, p6)

Я хочу вставить метод, следующий за ним, вот так:

a.doSomeThing(p1, p2, p3, p4, p5, p6)
MyClass.myMethod(a, p1, p2, p3, p4, p5, p6) //insert a static method

Метод вставки имеет те же параметры, что и предыдущий .

Я знаю, что при вызове виртуального doSomeThing значения находятся наверху стека. Как я могу продублировать их и использовать для myMethod?

Ответы [ 2 ]

1 голос
/ 11 марта 2020

Наконец-то я это решаю. При вызове a.doSomeThing(p1, p2, p3, p4, p5, p6), порядок кадров стека операнда в стеке равен a p1 p2 p3 p4 p5 p6, поэтому мне просто нужно сохранить их в локальных переменных как p6 p5 p4 p3 p2 p1 a, теперь я загружаю их из локальных переменных для повторного стека и вызовите a.doSomeThing(p1, p2, p3, p4, p5, p6), затем снова загрузите локальные переменные и вызовите MyClass.myMethod(a, p1, p2, p3, p4, p5, p6).
. Таким образом, я вставляю свои коды, которые имеют те же параметры, что и предыдущий метод.

0 голосов
/ 09 марта 2020

Если имеется только один параметр или только два параметра, которые не являются длинными или двойными, вы можете использовать инструкции DUP или DUP2 соответственно. Если имеется более двух параметров, невозможно скопировать их напрямую с помощью байт-кода. Вместо этого вам нужно сохранить их в локальные переменные и затем прочитать их обратно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...