ASM не сообщает постоянные инструкции - PullRequest
0 голосов
/ 23 января 2020

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

public static double square(double a) {
    return a * a;
}

, который компилируется в этот байт-код:

public static double square(double);
Code:
   0: dload_0
   1: dload_0
   2: dmul
   3: dreturn

, используя этот MethodVisitor для чтения кода:

    return new MethodVisitor(ASM7) {
        @Override
        public void visitInsn(int opcode) {
            System.out.println(String.format("%02x", opcode));
        }

        @Override
        public void visitLdcInsn(Object value) {
            System.out.println(value);
        }
    };

Я получаю следующий вывод:

6b
af

Это коды операций для dmul и dreturn соответственно, поэтому он обходит код, но не сообщает инструкции dload_0, либо visitInsn или visitLdcInsn.

Что я делаю не так?

1 Ответ

3 голосов
/ 23 января 2020

ASM увеличивается dload_0 до dload 0. В то же время при записи ASM оптимизирует инструкцию байтового кода обратно в константу быстрого доступа при записи в ClassWriter. Переопределите visitVarInsn, и вы увидите выход с байт-кодом в качестве первого и индекс переменной в качестве второго аргумента.

(отредактировано после комментария Хольгера.)

...