This code:
public Object call(Object self, Object... args) {
return null;
}
run through Bytecode Outline, and then edited slightly to get:
import org.objectweb.asm.*;
import org.objectweb.asm.util.CheckClassAdapter;
public class TestAsm implements Opcodes {
public static void main(String[] args) throws Exception {
ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES);
ClassVisitor cv = new CheckClassAdapter(cw);
MethodVisitor mv;
cv.visit(V1_6, ACC_PUBLIC + ACC_SUPER, "suneido/language/SampleFunction",
null, "suneido/language/SuFunction", null);
mv = cv.visitMethod(ACC_PUBLIC + ACC_VARARGS, "call",
"(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;", null, null);
mv.visitCode();
Label l0 = new Label();
mv.visitLabel(l0);
mv.visitInsn(ACONST_NULL);
mv.visitInsn(ARETURN);
Label l3 = new Label();
mv.visitLabel(l3);
mv.visitLocalVariable("this", "Lsuneido/language/SampleFunction;", null, l0, l3, 0);
mv.visitLocalVariable("self", "Ljava/lang/Object;", null, l0, l3, 1);
mv.visitLocalVariable("args", "[Ljava/lang/Object;", null, l0, l3, 2);
mv.visitMaxs(0, 0);
mv.visitEnd();
cv.visitEnd();
}
}
gives:
java.lang.IndexOutOfBoundsException: Trying to access an inexistant local variable 0
at org.objectweb.asm.tree.analysis.Frame.setLocal(Unknown Source)
at org.objectweb.asm.tree.analysis.Analyzer.analyze(Unknown Source)
at org.objectweb.asm.util.CheckMethodAdapter$1.visitEnd(Unknown Source)
at org.objectweb.asm.util.CheckMethodAdapter.visitEnd(Unknown Source)
at suneido.language.TestAsm.main(TestAsm.java:29)
Exception in thread "main" java.lang.RuntimeException: Trying to access an inexistant local variable 0
call(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;
00000 ? : L0
00001 ? : ACONST_NULL
00002 ? : ARETURN
00003 ? : L1
at org.objectweb.asm.util.CheckMethodAdapter$1.visitEnd(Unknown Source)
at org.objectweb.asm.util.CheckMethodAdapter.visitEnd(Unknown Source)
at suneido.language.TestAsm.main(TestAsm.java:29)
If I turn off data flow checking it works.
With visitMaxs(1, 3) or visitMaxs(99, 99) it works (with or without COMPUTE_FRAMES)
Is it possible to use CheckClassAdapter with COMPUTE_FRAMES?
My apologies in advance if I'm doing something stupid. I've searched but couldn't find an answer.