1

Я использую ASM4 для некоторых манипуляций с байт-кодом Java. Я хочу скопировать код из одного метода в другой. Последний имеет некоторый дополнительный код, и из-за этого каждый LabelNode из первого метода должен быть переназначен.Редактирование этикеток с ASM4

Проблема возникает, когда необходимо вставить локальные переменные. Я следовал этому шаблону: получить локальные переменные из первого метода, создать его копию с индексом и начальным ярлыком, а конечные метки узлов изменены. Посетитель используется для получения локальных переменного имеет такой вид:

public void visitLocalVariable(String name, String desc, String signature, Label start, Label end, int index) 

и код, который необходимо вставить новый переменный вид локальный так:

localVariableList.add(new LocalVariableNode((String name, String desc, String signature, LabelNode start, LabelNode end, int index))) 

Проблемы есть, info поля от Label объекта является null, поэтому я не могу получить ссылку на старый LabelNode, чтобы я мог переназначить свои новые узлы.

Я также пытался получить смещение от кода с label.getOffset() и затем переназначить смещение в список смещений, связанных с моим новым списком LabelNode, но я получаю исключение:

java.lang.IllegalStateException: Label offset position has not been resolved yet 
at org.objectweb.asm.Label.getOffset(Unknown Source) 

Если какой-либо из вас имеет представление о том, как я могу получить соответствующий LabelNode от Label, будет очень признателен. Или, может быть, есть лучший подход при копировании кода из одного метода в другой и разрешении проблемы с метками, lablenode и localvariables.

Большую часть времени я использую API дерева из-за его простоты.

Благодарим за помощь.

+1

Если вы копируете один 'InsnList' в другой, вы можете использовать' resetLabels() ', чтобы смещения метки и позиции правильно перестраивались. – Vulcan

ответ

2

В моем разделе AOSD'07 paper приведен пример аналогичного преобразования в разделе «Встроенный метод».