Example usage for org.objectweb.asm MethodVisitor visitVarInsn

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

Introduction

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

Prototype

public void visitVarInsn(final int opcode, final int var) 

Source Link

Document

Visits a local variable instruction.

Usage

From source file:erjang.ETuple.java

License:Apache License

private static void create_constructor(ClassAdapter cw, String super_class_name) {
    MethodVisitor mv = cw.visitMethod(Opcodes.ACC_PUBLIC, "<init>", "()V", null, null);
    mv.visitCode();/*from  w  w  w . ja v  a2 s.  c o m*/
    mv.visitVarInsn(Opcodes.ALOAD, 0); // load this
    mv.visitMethodInsn(Opcodes.INVOKESPECIAL, super_class_name, "<init>", "()V");
    mv.visitInsn(Opcodes.RETURN);
    mv.visitMaxs(1, 1);
    mv.visitEnd();
}

From source file:formatasm.FormatASM.java

License:Open Source License

public static byte[] generateBytes(String klazz, String subklazz, List<Spec> specs) {
    klazz = klazz.replace('.', '/');
    subklazz = subklazz.replace('.', '/');

    ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
    MethodVisitor mv;

    cw.visit(V1_7, ACC_PUBLIC + ACC_SUPER, subklazz, null, klazz, null);

    {/*from   w ww  . j  ava  2s . c  o  m*/
        mv = cw.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null);
        mv.visitCode();
        mv.visitVarInsn(ALOAD, 0);
        mv.visitMethodInsn(INVOKESPECIAL, klazz, "<init>", "()V");
        mv.visitInsn(RETURN);
        mv.visitMaxs(0, 0);
        mv.visitEnd();
    }

    {
        mv = cw.visitMethod(ACC_PUBLIC + ACC_VARARGS, "format", "([Ljava/lang/Object;)Ljava/lang/String;", null,
                null);

        /// StringBuilder sb = new StringBuilder();
        mv.visitCode();
        mv.visitTypeInsn(NEW, "java/lang/StringBuilder");
        mv.visitInsn(DUP);
        mv.visitMethodInsn(INVOKESPECIAL, "java/lang/StringBuilder", "<init>", "()V");
        mv.visitVarInsn(ASTORE, 2);

        for (Spec spec : specs) {
            switch (spec.type) {
            case CONTENT:
                copyTemplateASM(klazz, mv, spec.begin, spec.end);
                // Skip further processing
                continue;

            case PERCENT:
                mv.visitVarInsn(ALOAD, 2);
                mv.visitIntInsn(BIPUSH, '%');
                mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append",
                        "(C)Ljava/lang/StringBuilder;");
                mv.visitInsn(POP);
                // Skip further processing
                continue;

            case INT:
                formatIntegerASM(mv, spec);
                break;

            case INT_HEX:
                formatHexidecimalASM(mv, spec);
                break;

            case OCTAL:
                formatOctalASM(mv, spec);
                break;

            case BOOL:
            case CHAR:
                // text = args[?].toString();
                mv.visitVarInsn(ALOAD, 1);
                mv.visitIntInsn(BIPUSH, spec.index);
                mv.visitInsn(AALOAD);
                mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Object", "toString", "()Ljava/lang/String;");
                mv.visitVarInsn(ASTORE, 3);
                break;

            case STRING:
                // text = (String) args[?]
                mv.visitVarInsn(ALOAD, 1);
                mv.visitIntInsn(BIPUSH, spec.index);
                mv.visitInsn(AALOAD);
                mv.visitTypeInsn(CHECKCAST, "java/lang/String");
                mv.visitVarInsn(ASTORE, 3);
                break;

            case DATETIME:
                formatDateTimeASM(mv, spec);
                break;

            default:
                break;
            }

            if (spec.upper && spec.type != Type.DATETIME) {
                toUpperCaseASM(mv);
            }

            if (spec.width > 0 && !spec.leftFlag) {
                addWidthASM(mv, spec);
            }

            appendTextASM(mv);

            if (spec.width > 0 && spec.leftFlag) {
                addWidthASM(mv, spec);
            }
        }

        /// return sb.toString();
        mv.visitVarInsn(ALOAD, 2);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "toString", "()Ljava/lang/String;");
        mv.visitInsn(ARETURN);

        mv.visitMaxs(0, 0);
        mv.visitEnd();
    }
    cw.visitEnd();

    return cw.toByteArray();
}

From source file:formatasm.FormatASM.java

License:Open Source License

public static void copyTemplateASM(String klazz, MethodVisitor mv, int begin, int end) {
    mv.visitVarInsn(ALOAD, 2);
    mv.visitVarInsn(ALOAD, 0);//  w  w w .jav a  2s.  co  m
    mv.visitFieldInsn(GETFIELD, klazz, "template", "Ljava/lang/String;");
    mv.visitIntInsn(BIPUSH, begin);
    mv.visitIntInsn(BIPUSH, end);
    mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/String", "substring", "(II)Ljava/lang/String;");
    mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append",
            "(Ljava/lang/String;)Ljava/lang/StringBuilder;");
    mv.visitInsn(POP);
}

From source file:formatasm.FormatASM.java

License:Open Source License

public static void formatIntegerASM(MethodVisitor mv, Spec spec) {
    mv.visitVarInsn(ALOAD, 1);
    mv.visitIntInsn(BIPUSH, spec.index);
    mv.visitInsn(AALOAD);/*from  www. ja v a 2 s .  c  om*/
    mv.visitTypeInsn(CHECKCAST, "java/lang/Integer");
    mv.visitInsn(spec.parensFlag ? ICONST_1 : ICONST_0);
    mv.visitInsn(spec.groupFlag ? ICONST_1 : ICONST_0);
    mv.visitInsn(spec.plusFlag ? ICONST_1 : ICONST_0);
    mv.visitInsn(spec.spaceFlag ? ICONST_1 : ICONST_0);
    mv.visitMethodInsn(INVOKESTATIC, "formatasm/FormatASM", "formatInteger",
            "(Ljava/lang/Integer;ZZZZ)Ljava/lang/String;");
    mv.visitVarInsn(ASTORE, 3);
}

From source file:formatasm.FormatASM.java

License:Open Source License

public static void formatDateTimeASM(MethodVisitor mv, Spec spec) {
    mv.visitVarInsn(ALOAD, 1);
    mv.visitIntInsn(BIPUSH, spec.index);
    mv.visitInsn(AALOAD);//from   w  w  w.j ava 2 s .  c om
    mv.visitInsn(spec.upper ? ICONST_1 : ICONST_0);
    mv.visitIntInsn(BIPUSH, spec.datetime);
    mv.visitMethodInsn(INVOKESTATIC, "formatasm/FormatASM", "formatDateTime",
            "(Ljava/lang/Object;ZC)Ljava/lang/String;");
    mv.visitVarInsn(ASTORE, 3);
}

From source file:formatasm.FormatASM.java

License:Open Source License

public static void formatHexidecimalASM(MethodVisitor mv, Spec spec) {
    mv.visitVarInsn(ALOAD, 1);
    mv.visitIntInsn(BIPUSH, spec.index);
    mv.visitInsn(AALOAD);//from   w w w.  j av a2s.  c  o  m
    mv.visitTypeInsn(CHECKCAST, "java/lang/Integer");
    mv.visitMethodInsn(INVOKESTATIC, "formatasm/FormatASM", "formatHexidecimal",
            "(Ljava/lang/Integer;)Ljava/lang/String;");
    mv.visitVarInsn(ASTORE, 3);
}

From source file:formatasm.FormatASM.java

License:Open Source License

public static void formatOctalASM(MethodVisitor mv, Spec spec) {
    mv.visitVarInsn(ALOAD, 1);
    mv.visitIntInsn(BIPUSH, spec.index);
    mv.visitInsn(AALOAD);//ww w .  j  a va2s . co m
    mv.visitTypeInsn(CHECKCAST, "java/lang/Integer");
    mv.visitMethodInsn(INVOKESTATIC, "formatasm/FormatASM", "formatOctal",
            "(Ljava/lang/Integer;)Ljava/lang/String;");
    mv.visitVarInsn(ASTORE, 3);
}

From source file:formatasm.FormatASM.java

License:Open Source License

public static void appendTextASM(MethodVisitor mv) {
    mv.visitVarInsn(ALOAD, 2);
    mv.visitVarInsn(ALOAD, 3);//from www. ja va2  s  .  co m
    mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append",
            "(Ljava/lang/String;)Ljava/lang/StringBuilder;");
    mv.visitInsn(POP);
}

From source file:formatasm.FormatASM.java

License:Open Source License

public static void toUpperCaseASM(MethodVisitor mv) {
    mv.visitVarInsn(ALOAD, 3);
    mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/String", "toUpperCase", "()Ljava/lang/String;");
    mv.visitVarInsn(ASTORE, 3);/*from  ww w .  ja v a 2s .c  o m*/
}

From source file:formatasm.FormatASM.java

License:Open Source License

public static void addWidthASM(MethodVisitor mv, Spec spec) {
    mv.visitVarInsn(ALOAD, 2);
    mv.visitIntInsn(BIPUSH, spec.width);
    mv.visitVarInsn(ALOAD, 3);//  ww  w  . ja  v a  2  s .  c  o  m
    mv.visitMethodInsn(INVOKESTATIC, "formatasm/FormatASM", "addWidth",
            "(Ljava/lang/StringBuilder;ILjava/lang/String;)V");
}