Я тестировал фреймворк ASM, и я почти не могу понять, почему этот фрагмент кода дает значение int 10
. Для получения дополнительной информации: метод возвращает int, и я распечатал int обратно.
// This is the complete ASM visit of this method
// ...
MethodVisitor mv = cw.visitMethod(Opcodes.ACC_PUBLIC, method.getName(), Type.getMethodDescriptor(method), null, null);
mv.visitCode();
mv.visitIntInsn(Opcodes.BIPUSH, 0);
mv.visitIntInsn(Opcodes.BIPUSH , 0);
mv.visitIntInsn(Opcodes.ISTORE, 2);
mv.visitIntInsn(Opcodes.ILOAD, 1);
mv.visitInsn(Opcodes.IRETURN);
mv.visitMaxs(0, 0);
mv.visitEnd();
// ...
Декомпилятор показывает даже какой-то странный код. Вывод декомпилятора :
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//
public class HelloWorld implements Add {
public HelloWorld() {
}
public int add(int var1, int var2) {
boolean var3 = false;
return var1;
}
}
Почему функция возвращает 10
? Это ошибка? Вызывает ли это своего рода «неопределенное поведение», потому что переменные загружаются в «self», потому что отталкиваются?
Как JVM обрабатывает переменные и как их выделять, это стек исходя из ? Если так, то aload
будет просто pu sh дублировать значение данных
stack before aload: var1 var2 var3
stack after aload_1: var1 var2 var3 var1
Или я совершенно не прав? Похоже, что вместо использования реестров немного переработали.