0

文章底部是测试用例。它给出了以下错误。但是我已经设置new ClassWriter(ClassWriter.COMPUTE_MAXS)了,所以它不应该自动计算最大堆栈并正确设置吗?

Exception in thread "main" java.lang.RuntimeException: Error at instruction 2: Insufficient maximum stack size. testMethod()Ljava/lang/Object;
00000  :  :    L0
00001  :  :     LINENUMBER 22 L0
00002  :  :     ACONST_NULL
00003 ? :     ARETURN

测试用例:

public static void main(String[] args) {
    ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
    CheckClassAdapter cv = new CheckClassAdapter(cw);
    cv.visit(V1_7, ACC_PUBLIC + ACC_SUPER, "path/Cls", null, "java/lang/Object", null);
    {
        MethodVisitor mv = cv.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null);
        mv.visitCode();
        Label l0 = new Label();
        mv.visitLabel(l0);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V");
        mv.visitInsn(RETURN);
        Label l1 = new Label();
        mv.visitLabel(l1);
        mv.visitLocalVariable("this", "L" + "path/Cls" + ";", null, l0, l1, 0);
        mv.visitMaxs(1, 1);
        mv.visitEnd();
    }
    {
        MethodVisitor mv = cv
                .visitMethod(ACC_PUBLIC + ACC_STATIC, "testMethod", "()Ljava/lang/Object;", null, null);
        mv.visitCode();
        Label l0 = new Label();
        mv.visitLabel(l0);
        mv.visitLineNumber(22, l0);
        mv.visitInsn(ACONST_NULL);
        mv.visitInsn(ARETURN);
        mv.visitMaxs(0, 0); // Same error even if this is commented out
        mv.visitEnd();
    }

    byte[] byteArray = cw.toByteArray();
}
4

2 回答 2

4

问题不在于 ASM,而在于您的测试。基本上 CheckClassAdapter 在计算最大堆栈和 var 值之前会看到字节码。

您可以将代码更改为以下内容:

  ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
  cw.visit...

  byte[] byteArray = cw.toByteArray();
  ClassReader cr = new ClassReader(byteArray);
  cr.accept(new CheckClassAdapter(new ClassWriter(0)), 0);
于 2012-05-20T12:39:16.983 回答
0

您可以将 CheckClassAdapter 配置为不检查堆栈大小:

CheckClassAdapter cv = new CheckClassAdapter(cw, false);
于 2012-11-03T13:53:43.777 回答