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 に答える