2012-12-10 3 views
0

Я пытаюсь реализовать преобразование в ASM, которое требует двух проходов по каждому методу. Первый должен собрать информацию о том, где необходима аппаратура (имеет отношение к цели перехода, поэтому мне нужны два прохода), а вторая заполняет собранную информацию и добавляет прибор. Это также означает, что я должен выполнить первый проход (т. Е. Обработать все инструкции), прежде чем начать второй проход. Вот почему нормальная схема цепочки, описанная в руководстве, не работает.Как связать ASM MethodVisitors от конца до конца

Мой вопрос: есть ли элегантный и удобный способ сделать это?

Единственное решение, с которым я мог придумать, - это позвонить второму посетителю с посещенияEnd() у первого посетителя. Схема выглядит следующим образом

public class Pass1Visitor extends MethodVisitor { 
    ... 
    public void visitEnd() { 
    //do stuff the call the second visitor 
    thisMethodNode.accept(new Pass2Visitor()); 
    } 
} 

Мне не нравится это решение слишком много, потому что я подозреваю, что в будущем мне придется цепными больше посетителей, и я, возможно, захотите, чтобы иметь возможность выбрать и выбрать. Что с этим действительно невозможно.

ответ

0

Если вам нужны два прохода через байт-код, так вы делаете это с ASM. Пакет дерева (т. Е. MethodNode) сохранит все события посещения и может воспроизвести их обратно при вызове метода accept(). Плохая идея создать следующего посетителя, но нет ничего плохого в прохождении посетителя. См. Реализацию JSRInlinerAdapter или пример из раздела «Встроенный метод» в разделе AOSD.07 paper о ASM.

Итак, ваш пример будет выглядеть примерно так:

public class Pass1Visitor extends MethodNode { 
    MethodVisitor nextVisitor; 

    public Pass1Visitor(MethodVisitor nextVisitor) { 
    this.nextVisitor= nextVisitor; 
    } 

    ... 

    public void visitEnd() { 
    //do stuff the call the second visitor 
    thisMethodNode.accept(nextVisitor); 
    } 
} 
+0

Это довольно много, что я имел. Я надеялся, что будет более простой способ. (Это требует прохождения вокруг посетителей и MethodNode в дополнение ко всему тому, что мне нужно в любом случае). – Jochen

+0

Я обновил свой ответ несколькими подробностями и примерами. Обход посетителей - основная идея дизайна ASM API. –

+0

Хорошо, тогда, наверное, мне придется это сделать ... :) – Jochen

Смежные вопросы