java.lang.VerifyError :(类:Main,方法:主签名:([Ljava / lang / String;)V)堆栈大小太大

时间:2010-12-05 08:00:17

标签: java assembly jython java-bytecode-asm

我一直在研究ASM库。首先,我编写了一个程序来构建一个hello world类,然后我想我会尝试一些更多的东西,构建一个创建PythonInterpreter(Jython库的一部分)的类并执行一个python文件。结果如下,不幸的是,当我尝试执行结果类时,我得到了异常,我将这个问题命名为。

public class Main {
public static void main(String[] args) {
    String mainFile = "main.py";

    ClassWriter mainClass = new ClassWriter(ClassWriter.COMPUTE_MAXS);
    mainClass.visit(Opcodes.V1_5, Opcodes.ACC_PUBLIC, "Main", null, "java/lang/Object", null);
    MethodVisitor mainMethod = mainClass.visitMethod(Opcodes.ACC_PUBLIC + Opcodes.ACC_STATIC, "main", "([Ljava/lang/String;)V", null, null);

    mainMethod.visitTypeInsn(Opcodes.NEW, "org/python/util/PythonInterpreter");
    mainMethod.visitMethodInsn(Opcodes.INVOKESPECIAL, "org/python/util/PythonInterpreter", "<init>", "()V");

    mainMethod.visitFieldInsn(Opcodes.GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
    mainMethod.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "org/python/util/PythonInterpreter", "setOut", "(Ljava/io/PrintStream;)V");
    mainMethod.visitFieldInsn(Opcodes.GETSTATIC, "java/lang/System", "err", "Ljava/io/PrintStream;");
    mainMethod.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "org/python/util/PythonInterpreter", "setErr", "(Ljava/io/PrintStream;)V");

    mainMethod.visitLdcInsn(mainFile);
    mainMethod.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "org/python/util/PythonInterpreter", "execFile", "(Ljava/lang/String;)V");
    mainMethod.visitInsn(Opcodes.RETURN);

    mainMethod.visitEnd();
    mainClass.visitEnd();

    try{
        byte[] b = mainClass.toByteArray();
        FileOutputStream writer = new FileOutputStream("Main.class");
        writer.write(b);
        writer.close();
    }catch(IOException e){
        e.printStackTrace();
    }
}

}

1 个答案:

答案 0 :(得分:1)

当您使用setOutsetErr方法时,您只有一个参数,并且没有对象可以调用该方法。 (对<init>的调用“消耗了”它初始化的对象!)

同样适用于对execFile的调用。你有一个参数(mainFile),但没有对象可以调用execFile

尝试在DUP之后立即添加三个NEW个instructinos。 (为要对该对象执行的三个方法调用保存足够的引用。)