Example usage for org.objectweb.asm MethodVisitor visitFrame

List of usage examples for org.objectweb.asm MethodVisitor visitFrame

Introduction

In this page you can find the example usage for org.objectweb.asm MethodVisitor visitFrame.

Prototype

public void visitFrame(final int type, final int numLocal, final Object[] local, final int numStack,
        final Object[] stack) 

Source Link

Document

Visits the current state of the local variables and operand stack elements.

Usage

From source file:org.yx.asm.ProxyMethodWritor.java

License:Apache License

public static void writeWithReturn(MethodVisitor mv, AsmMethod asmMethod) {
    Box db = asmMethod.method.getAnnotation(Box.class);
    if (db == null) {
        return;/*from  www.j ava 2 s  .c o m*/
    }
    String superowener = Type.getInternalName(asmMethod.superClz);
    String currentClz = asmMethod.currentClz.replace('.', '/');
    List<Object> argTypes = AsmUtils.getImplicitFrame(
            asmMethod.desc.substring(asmMethod.desc.indexOf("(") + 1, asmMethod.desc.indexOf(")")));
    Object returnType = AsmUtils.getImplicitFrame(asmMethod.desc.substring(asmMethod.desc.indexOf(")") + 1))
            .get(0);
    int localVariableIndex = argLength(argTypes);

    mv.visitCode();
    Label l0 = new Label();
    Label l1 = new Label();
    Label l2 = new Label();
    mv.visitTryCatchBlock(l0, l1, l2, "java/lang/Exception");
    Label l3 = new Label();
    mv.visitTryCatchBlock(l0, l1, l3, null);
    Label l4 = new Label();
    mv.visitTryCatchBlock(l2, l4, l3, null);
    mv.visitTypeInsn(NEW, AOPEXCUTOR);
    mv.visitInsn(DUP);
    mv.visitInsn(db.embed() ? ICONST_1 : ICONST_0);
    mv.visitMethodInsn(INVOKESPECIAL, AOPEXCUTOR, "<init>", "(Z)V", false);
    mv.visitVarInsn(ASTORE, localVariableIndex + 1);
    mv.visitLabel(l0);
    mv.visitVarInsn(ALOAD, localVariableIndex + 1);
    mv.visitLdcInsn(db.dbName());
    mv.visitFieldInsn(GETSTATIC, "org/yx/db/DBType", db.dbType().toString(), "Lorg/yx/db/DBType;");
    mv.visitMethodInsn(INVOKEVIRTUAL, AOPEXCUTOR, "begin", "(Ljava/lang/String;Lorg/yx/db/DBType;)V", false);
    mv.visitVarInsn(ALOAD, 0);

    loadArgs(mv, argTypes, 0);
    mv.visitMethodInsn(INVOKESPECIAL, superowener, asmMethod.name, asmMethod.desc, false);
    int methodReturnFrameIndex = localVariableIndex + 2;
    store(mv, returnType, methodReturnFrameIndex);
    mv.visitVarInsn(ALOAD, localVariableIndex + 1);
    mv.visitMethodInsn(INVOKEVIRTUAL, AOPEXCUTOR, "commit", "()V", false);

    mv.visitLabel(l1);
    mv.visitVarInsn(ALOAD, localVariableIndex + 1);
    mv.visitMethodInsn(INVOKEVIRTUAL, AOPEXCUTOR, "close", "()V", false);
    load(mv, returnType, methodReturnFrameIndex);
    jReturn(mv, returnType);
    mv.visitLabel(l2);

    List<Object> list = new ArrayList<Object>();
    list.add(currentClz);
    list.addAll(argTypes);
    list.add(AOPEXCUTOR);
    Object[] frames = list.toArray(new Object[list.size()]);

    mv.visitFrame(Opcodes.F_FULL, frames.length, frames, 1, new Object[] { "java/lang/Exception" });
    mv.visitVarInsn(ASTORE, localVariableIndex + 2);
    mv.visitVarInsn(ALOAD, localVariableIndex + 1);
    mv.visitVarInsn(ALOAD, localVariableIndex + 2);
    mv.visitMethodInsn(INVOKEVIRTUAL, AOPEXCUTOR, "rollback", "(Ljava/lang/Throwable;)V", false);
    mv.visitLabel(l4);
    mv.visitVarInsn(ALOAD, localVariableIndex + 1);
    mv.visitMethodInsn(INVOKEVIRTUAL, AOPEXCUTOR, "close", "()V", false);
    Label l5 = new Label();
    mv.visitJumpInsn(GOTO, l5);
    mv.visitLabel(l3);
    mv.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] { "java/lang/Throwable" });
    mv.visitVarInsn(ASTORE, localVariableIndex + 3);
    mv.visitVarInsn(ALOAD, localVariableIndex + 1);
    mv.visitMethodInsn(INVOKEVIRTUAL, AOPEXCUTOR, "close", "()V", false);
    mv.visitVarInsn(ALOAD, localVariableIndex + 3);
    mv.visitInsn(ATHROW);
    mv.visitLabel(l5);
    mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
    mv.visitTypeInsn(NEW, "org/yx/exception/SumkException");
    mv.visitInsn(DUP);
    mv.visitLdcInsn(new Integer(-364533425));
    mv.visitLdcInsn("you are locky to see me^_^");
    mv.visitMethodInsn(INVOKESPECIAL, "org/yx/exception/SumkException", "<init>", "(ILjava/lang/String;)V",
            false);
    mv.visitInsn(ATHROW);
    mv.visitMaxs(Math.max(4, localVariableIndex + 1), 4 + localVariableIndex);
    mv.visitEnd();
}

From source file:uk.co.unclealex.executable.generator.ScripterImplTest.java

License:Apache License

protected void generateCommandClass(String classPrefixName, boolean reverse, Path targetDirectory)
        throws IOException {
    ClassWriter cw = new ClassWriter(0);
    FieldVisitor fv;//from ww w .  ja v  a 2s.  co m
    MethodVisitor mv;

    cw.visit(V1_7, ACC_PUBLIC + ACC_SUPER, "scripter/" + classPrefixName + "Command", null, "java/lang/Object",
            new String[] { "uk/co/unclealex/executable/streams/HasStdout" });
    fv = cw.visitField(ACC_PRIVATE, "stdout", "Ljava/io/PrintStream;", null, null);
    fv.visitEnd();
    mv = cw.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null);
    mv.visitCode();
    mv.visitVarInsn(ALOAD, 0);
    mv.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V");
    mv.visitInsn(RETURN);
    mv.visitMaxs(1, 1);
    mv.visitEnd();
    mv = cw.visitMethod(ACC_PUBLIC, "run", "(Lscripter/" + classPrefixName + "CommandLine;)V", null, null);
    AnnotationVisitor av0 = mv.visitAnnotation("Luk/co/unclealex/executable/Executable;", true);
    av0.visitEnd();
    mv.visitCode();
    mv.visitVarInsn(ALOAD, 1);
    mv.visitMethodInsn(INVOKEINTERFACE, "scripter/" + classPrefixName + "CommandLine", "getArguments",
            "()Ljava/util/List;");
    mv.visitMethodInsn(INVOKESTATIC, "com/google/common/collect/Lists", "newArrayList",
            "(Ljava/lang/Iterable;)Ljava/util/ArrayList;");
    mv.visitVarInsn(ASTORE, 2);
    mv.visitVarInsn(ALOAD, 0);
    mv.visitMethodInsn(INVOKEVIRTUAL, "scripter/" + classPrefixName + "Command", "reverse", "()Z");
    Label l0 = new Label();
    mv.visitJumpInsn(IFEQ, l0);
    mv.visitVarInsn(ALOAD, 2);
    mv.visitMethodInsn(INVOKESTATIC, "java/util/Collections", "reverse", "(Ljava/util/List;)V");
    mv.visitLabel(l0);
    mv.visitFrame(Opcodes.F_APPEND, 1, new Object[] { "java/util/List" }, 0, null);
    mv.visitVarInsn(ALOAD, 0);
    mv.visitFieldInsn(GETFIELD, "scripter/" + classPrefixName + "Command", "stdout", "Ljava/io/PrintStream;");
    mv.visitVarInsn(ALOAD, 2);
    mv.visitMethodInsn(INVOKEVIRTUAL, "java/io/PrintStream", "print", "(Ljava/lang/Object;)V");
    mv.visitInsn(RETURN);
    mv.visitMaxs(2, 3);
    mv.visitEnd();
    mv = cw.visitMethod(ACC_PROTECTED, "reverse", "()Z", null, null);
    mv.visitCode();
    mv.visitInsn(reverse ? ICONST_1 : ICONST_0);
    mv.visitInsn(IRETURN);
    mv.visitMaxs(1, 1);
    mv.visitEnd();
    mv = cw.visitMethod(ACC_PUBLIC, "getStdout", "()Ljava/io/PrintStream;", null, null);
    mv.visitCode();
    mv.visitVarInsn(ALOAD, 0);
    mv.visitFieldInsn(GETFIELD, "scripter/" + classPrefixName + "Command", "stdout", "Ljava/io/PrintStream;");
    mv.visitInsn(ARETURN);
    mv.visitMaxs(1, 1);
    mv.visitEnd();
    mv = cw.visitMethod(ACC_PUBLIC, "setStdout", "(Ljava/io/PrintStream;)V", null, null);
    mv.visitCode();
    mv.visitVarInsn(ALOAD, 0);
    mv.visitVarInsn(ALOAD, 1);
    mv.visitFieldInsn(PUTFIELD, "scripter/" + classPrefixName + "Command", "stdout", "Ljava/io/PrintStream;");
    mv.visitInsn(RETURN);
    mv.visitMaxs(2, 2);
    mv.visitEnd();
    cw.visitEnd();

    Files.write(targetDirectory.resolve(classPrefixName + "Command.class"), cw.toByteArray());
}