Example usage for org.objectweb.asm MethodVisitor visitLabel

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

Introduction

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

Prototype

public void visitLabel(final Label label) 

Source Link

Document

Visits a label.

Usage

From source file:ldapbeans.bean.LdapBeanClassManager.java

License:LGPL

/**
 * Generate code to convert ldapAttribute witch is on the to of the stack to
 * Boolean/*  ww  w .j  ava2  s. co  m*/
 * 
 * @param p_MethodVisitor
 *            The {@link MethodVisitor} of the generated method
 * @param p_ClassName
 *            Name of the generated class
 * @param p_LdapAttribute
 *            The LdapAttribute that will be used for generating the method
 * @param p_ReturnType
 *            The type of the result
 * @param p_Object
 *            Index of the object to convert on the stack
 * @param p_Result
 *            Index of the converted object on the stack
 */
private void generateConvertToBoolean(MethodVisitor p_MethodVisitor, String p_ClassName,
        LdapAttribute p_LdapAttribute, Class<?> p_ReturnType, int p_Object, int p_Result) {
    MethodVisitor mv = p_MethodVisitor;
    Label l0 = new Label();
    // return true or false instead of result
    generateConvertToBoolean(mv, p_ReturnType, p_LdapAttribute.trueValue(), true, p_Object, p_Result, l0);
    generateConvertToBoolean(mv, p_ReturnType, p_LdapAttribute.falseValue(), false, p_Object, p_Result, l0);
    // Can't convert attribute to boolean
    // throw new IllegalArgumentException(object +
    // " cannot be converted into boolean");
    mv.visitTypeInsn(NEW, "java/lang/IllegalArgumentException");
    mv.visitInsn(DUP);
    mv.visitTypeInsn(NEW, "java/lang/StringBuilder");
    mv.visitInsn(DUP);
    mv.visitMethodInsn(INVOKESPECIAL, "java/lang/StringBuilder", "<init>", "()V");
    mv.visitVarInsn(ALOAD, p_Object);
    mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append",
            "(Ljava/lang/Object;)Ljava/lang/StringBuilder;");
    mv.visitLdcInsn(" cannot be converted into boolean");
    mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append",
            "(Ljava/lang/String;)Ljava/lang/StringBuilder;");
    mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "toString", "()Ljava/lang/String;");
    mv.visitMethodInsn(INVOKESPECIAL, "java/lang/IllegalArgumentException", "<init>", "(Ljava/lang/String;)V");
    mv.visitInsn(ATHROW);
    mv.visitLabel(l0);
}

From source file:ldapbeans.bean.LdapBeanClassManager.java

License:LGPL

/**
 * Generate code to convert ldapAttribute witch is on the to of the stack to
 * Boolean//from w  w w.jav  a  2  s.  c  o  m
 * 
 * @param p_MethodVisitor
 *            The {@link MethodVisitor} of the generated method
 * @param p_ReturnType
 *            The type of the result
 * @param p_BValues
 *            Possible values for the attribute
 * @param p_BValue
 *            Boolean value
 * @param p_Object
 *            Index of the object to convert on the stack
 * @param p_Result
 *            Index of the converted object on the stack
 * @param p_End
 *            Destination if the conversion success
 */
private void generateConvertToBoolean(MethodVisitor p_MethodVisitor, Class<?> p_ReturnType, String[] p_BValues,
        boolean p_BValue, int p_Object, int p_Result, Label p_End) {
    MethodVisitor mv = p_MethodVisitor;
    {
        // if(trueValue.equals(result))
        Label l0 = new Label();
        for (String bValue : p_BValues) {
            mv.visitLdcInsn(bValue);
            mv.visitVarInsn(ALOAD, p_Object);
            mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Object", "toString", "()Ljava/lang/String;");
            mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/String", "equalsIgnoreCase", "(Ljava/lang/String;)Z");
            mv.visitJumpInsn(IFNE, l0);
        }
        Label l1 = new Label();
        mv.visitJumpInsn(GOTO, l1);
        // {
        mv.visitLabel(l0);
        if (boolean.class.equals(p_ReturnType)) {
            // return true|false;
            mv.visitInsn(p_BValue ? ICONST_1 : ICONST_0);
            mv.visitVarInsn(ISTORE, p_Result);
        } else {
            // return Boolean.TRUE|Boolean.FALSE;
            mv.visitFieldInsn(GETSTATIC, "java/lang/Boolean", p_BValue ? "TRUE" : "FALSE",
                    "Ljava/lang/Boolean;");
            mv.visitVarInsn(ASTORE, p_Result);
        }
        mv.visitJumpInsn(GOTO, p_End);
        // }
        mv.visitLabel(l1);
    }
}

From source file:lombok.patcher.scripts.SetSymbolDuringMethodCallScript.java

License:Open Source License

private void makeWrapperMethod(ClassVisitor cv, WrapperMethodDescriptor wmd) {
    MethodVisitor mv = cv.visitMethod(Opcodes.ACC_SYNTHETIC | Opcodes.ACC_PRIVATE | Opcodes.ACC_STATIC,
            wmd.getWrapperName(), wmd.getWrapperDescriptor(), null, null);

    MethodLogistics logistics = new MethodLogistics(Opcodes.ACC_STATIC, wmd.getWrapperDescriptor());

    mv.visitCode();//from w w  w.  j a  va  2  s .  c  o m
    Label start = new Label();
    Label end = new Label();
    Label handler = new Label();
    mv.visitTryCatchBlock(start, end, handler, null);
    mv.visitLabel(start);
    mv.visitLdcInsn(symbol);
    mv.visitMethodInsn(Opcodes.INVOKESTATIC, "lombok/patcher/Symbols", "push", "(Ljava/lang/String;)V", false);
    for (int i = 0; i < logistics.getParamCount(); i++) {
        logistics.generateLoadOpcodeForParam(i, mv);
    }
    mv.visitMethodInsn(wmd.getOpcode(), wmd.getOwner(), wmd.getName(), wmd.getTargetDescriptor(), wmd.isItf());
    mv.visitLabel(end);
    mv.visitMethodInsn(Opcodes.INVOKESTATIC, "lombok/patcher/Symbols", "pop", "()V", false);
    logistics.generateReturnOpcode(mv);
    mv.visitLabel(handler);
    mv.visitFrame(Opcodes.F_FULL, 0, null, 1, new Object[] { "java/lang/Throwable" });
    mv.visitMethodInsn(Opcodes.INVOKESTATIC, "lombok/patcher/Symbols", "pop", "()V", false);
    mv.visitInsn(Opcodes.ATHROW);
    mv.visitMaxs(Math.max(1, logistics.getParamCount()), logistics.getParamCount());
    mv.visitEnd();
}

From source file:me.rojo8399.placeholderapi.impl.placeholder.gen.ClassPlaceholderFactory.java

License:Open Source License

private static void nullCheck(MethodVisitor mv, boolean nullable, Consumer<MethodVisitor> success,
        boolean throwError) {
    if (nullable) {
        return;//  w ww. j  a  v  a2s.  c o  m
    }
    // assume null check obj already loaded to stack
    Label no = new Label();
    mv.visitJumpInsn(IFNONNULL, no);
    if (throwError) {
        mv.visitTypeInsn(Opcodes.NEW, Type.getInternalName(NoValueException.class));
        mv.visitVarInsn(ASTORE, 7);
        mv.visitVarInsn(ALOAD, 7);
        mv.visitMethodInsn(Opcodes.INVOKESPECIAL, Type.getInternalName(NoValueException.class), "<init>", "()V",
                false);
        mv.visitVarInsn(ALOAD, 7);
        mv.visitInsn(Opcodes.ATHROW);
    } else {
        mv.visitInsn(ACONST_NULL);
        mv.visitInsn(ARETURN);
    }
    mv.visitLabel(no);
    success.accept(mv);
}

From source file:me.rojo8399.placeholderapi.impl.placeholder.gen.ClassPlaceholderFactory.java

License:Open Source License

private static void skipIfNull(MethodVisitor mv, Consumer<MethodVisitor> success) {
    // assume null check obj already loaded to stack
    Label no = new Label();
    mv.visitJumpInsn(IFNULL, no);//from w ww .  jav a2s .c  om
    success.accept(mv);
    mv.visitLabel(no);
}

From source file:me.rojo8399.placeholderapi.impl.placeholder.gen.ClassPlaceholderFactory.java

License:Open Source License

private static void tryCatch(MethodVisitor mv, Consumer<MethodVisitor> t, Consumer<MethodVisitor> c) {
    Label st = new Label(), et = new Label(), sc = new Label(), ec = new Label();
    mv.visitTryCatchBlock(st, et, sc, "java/lang/Exception");
    mv.visitLabel(st);
    t.accept(mv);// w  w w.  j a v a 2s  .  c  om
    mv.visitLabel(et);
    mv.visitJumpInsn(GOTO, ec);
    mv.visitLabel(sc);
    c.accept(mv);
    mv.visitLabel(ec);
}

From source file:mt.swift.Deserializer.java

License:Apache License

private void compileDeserializeMethod(StructureType type, ClassVisitor writer, String targetClassName,
        Class targetClass) {/*from   www.  j av  a2 s  . com*/
    MethodVisitor methodVisitor = writer.visitMethod(
            ACC_PUBLIC, "deserialize", "(L" + Util.getInternalName(Deserializer.class)
                    + ";Lcom/facebook/thrift/protocol/TProtocol;)L" + targetClassName + ";",
            null, new String[] { "com/facebook/thrift/TException" });

    FrameRegisterManager context = new FrameRegisterManager();
    context.bindSlot("this", 0);
    context.bindSlot("deserializer", 1);
    context.bindSlot("protocol", 2);
    context.newSlot("target");
    context.newSlot("tfield");

    methodVisitor.visitCode();

    // <target> result = new <target>()
    methodVisitor.visitTypeInsn(NEW, targetClassName);
    methodVisitor.visitInsn(DUP);
    methodVisitor.visitMethodInsn(INVOKESPECIAL, targetClassName, "<init>", "()V");
    methodVisitor.visitVarInsn(ASTORE, context.getSlot("target"));

    // protocol.readStructBegin()
    methodVisitor.visitVarInsn(ALOAD, context.getSlot("protocol"));
    methodVisitor.visitMethodInsn(INVOKEVIRTUAL, "com/facebook/thrift/protocol/TProtocol", "readStructBegin",
            "()Lcom/facebook/thrift/protocol/TStruct;");
    methodVisitor.visitInsn(POP); // discard return value

    // while (true)
    Label whileLabel = new Label();
    methodVisitor.visitLabel(whileLabel);

    // TField tfield = protocol.readFieldBegin()
    methodVisitor.visitVarInsn(ALOAD, context.getSlot("protocol"));
    methodVisitor.visitMethodInsn(INVOKEVIRTUAL, "com/facebook/thrift/protocol/TProtocol", "readFieldBegin",
            "()Lcom/facebook/thrift/protocol/TField;");
    methodVisitor.visitVarInsn(ASTORE, context.getSlot("tfield"));

    // tfield.type
    methodVisitor.visitVarInsn(ALOAD, context.getSlot("tfield"));
    methodVisitor.visitFieldInsn(GETFIELD, "com/facebook/thrift/protocol/TField", "type", "B");

    methodVisitor.visitFieldInsn(GETSTATIC, "com/facebook/thrift/protocol/TType", "STOP", "B");

    // if (tfield.type == TType.STOP) { break; }
    Label endWhile = new Label();
    methodVisitor.visitJumpInsn(IF_ICMPEQ, endWhile);

    // tfield.id
    methodVisitor.visitVarInsn(ALOAD, context.getSlot("tfield"));
    methodVisitor.visitFieldInsn(GETFIELD, "com/facebook/thrift/protocol/TField", "id", "S");

    List<Field> fields = new ArrayList<Field>(type.getFields());
    int[] ids = new int[fields.size()];
    Label[] labels = new Label[fields.size()];
    for (int i = 0; i < fields.size(); ++i) {
        ids[i] = fields.get(i).getId();
        labels[i] = new Label();
    }

    Label fieldSkipped = new Label();

    methodVisitor.visitLookupSwitchInsn(fieldSkipped, ids, labels);

    for (int i = 0; i < fields.size(); ++i) {
        Field field = fields.get(i);

        methodVisitor.visitLabel(labels[i]);

        // if (tfield.type == ###)
        methodVisitor.visitVarInsn(ALOAD, context.getSlot("tfield"));
        methodVisitor.visitFieldInsn(GETFIELD, "com/facebook/thrift/protocol/TField", "type", "B");
        methodVisitor.visitIntInsn(BIPUSH, field.getType().getTType());
        methodVisitor.visitJumpInsn(IF_ICMPNE, fieldSkipped);

        methodVisitor.visitVarInsn(ALOAD, context.getSlot("target"));
        if (Map.class.isAssignableFrom(targetClass)) {
            methodVisitor.visitLdcInsn(field.getName());
            generateReadElement(methodVisitor, context, field.getType());
            generateAddToMap(targetClassName, methodVisitor, context, field);
        } else {
            generateReadElement(methodVisitor, context, field.getType());
            generateSetTargetField(targetClassName, methodVisitor, context, field);
        }

        methodVisitor.visitJumpInsn(GOTO, whileLabel);
    }

    methodVisitor.visitLabel(fieldSkipped);
    methodVisitor.visitVarInsn(ALOAD, context.getSlot("protocol"));
    methodVisitor.visitVarInsn(ALOAD, context.getSlot("tfield"));
    methodVisitor.visitFieldInsn(GETFIELD, "com/facebook/thrift/protocol/TField", "type", "B");
    methodVisitor.visitMethodInsn(INVOKESTATIC, "com/facebook/thrift/protocol/TProtocolUtil", "skip",
            "(Lcom/facebook/thrift/protocol/TProtocol;B)V");

    // end while
    methodVisitor.visitJumpInsn(GOTO, whileLabel);

    methodVisitor.visitLabel(endWhile);

    // protocol.readStructEnd()
    methodVisitor.visitVarInsn(ALOAD, context.getSlot("protocol"));
    methodVisitor.visitMethodInsn(INVOKEVIRTUAL, "com/facebook/thrift/protocol/TProtocol", "readStructEnd",
            "()V");

    // return result
    methodVisitor.visitVarInsn(ALOAD, context.getSlot("target"));
    methodVisitor.visitInsn(ARETURN);

    methodVisitor.visitMaxs(1, 1); // TODO: what should these be?
    methodVisitor.visitEnd();
}

From source file:mt.swift.Deserializer.java

License:Apache License

private void generateReadList(MethodVisitor methodVisitor, FrameRegisterManager context, ListType listType) {
    // protocol.readListBegin()
    int tlistSizeLocal = context.newAnonymousSlot();
    int loopCounterLocal = context.newAnonymousSlot();

    methodVisitor.visitVarInsn(ALOAD, context.getSlot("protocol"));
    methodVisitor.visitMethodInsn(INVOKEVIRTUAL, "com/facebook/thrift/protocol/TProtocol", "readListBegin",
            "()Lcom/facebook/thrift/protocol/TList;");
    methodVisitor.visitFieldInsn(GETFIELD, "com/facebook/thrift/protocol/TList", "size", "I");
    methodVisitor.visitVarInsn(ISTORE, tlistSizeLocal);

    // result = new ArrayList(tlist.size)
    methodVisitor.visitTypeInsn(NEW, "java/util/ArrayList");
    methodVisitor.visitInsn(DUP);//from  w  ww .ja  v a2 s.c o  m
    methodVisitor.visitVarInsn(ILOAD, tlistSizeLocal);
    methodVisitor.visitMethodInsn(INVOKESPECIAL, "java/util/ArrayList", "<init>", "(I)V");

    // i = 0
    methodVisitor.visitInsn(ICONST_0);
    methodVisitor.visitVarInsn(ISTORE, loopCounterLocal); // #4 = loop counter

    Label done = new Label();
    Label loop = new Label();
    methodVisitor.visitLabel(loop);
    methodVisitor.visitVarInsn(ILOAD, loopCounterLocal);
    methodVisitor.visitVarInsn(ILOAD, tlistSizeLocal);
    methodVisitor.visitJumpInsn(IF_ICMPGE, done);

    methodVisitor.visitInsn(DUP); // ArrayList

    generateReadElement(methodVisitor, context, listType.getValueType());
    generateConvertToObject(methodVisitor, listType.getValueType());

    // entry is left on stack(0). Add to list
    methodVisitor.visitMethodInsn(INVOKEVIRTUAL, "java/util/ArrayList", "add", "(Ljava/lang/Object;)Z");
    methodVisitor.visitInsn(POP);

    methodVisitor.visitIincInsn(loopCounterLocal, 1);
    methodVisitor.visitJumpInsn(GOTO, loop);

    methodVisitor.visitLabel(done);
    methodVisitor.visitVarInsn(ALOAD, context.getSlot("protocol"));
    methodVisitor.visitMethodInsn(INVOKEVIRTUAL, "com/facebook/thrift/protocol/TProtocol", "readListEnd",
            "()V");

    context.release(tlistSizeLocal);
    context.release(loopCounterLocal);
}

From source file:mt.swift.Deserializer.java

License:Apache License

private void generateReadSet(MethodVisitor methodVisitor, FrameRegisterManager context, SetType type) {
    // protocol.readListBegin()
    int tsetSizeLocal = context.newAnonymousSlot();
    int loopCounterLocal = context.newAnonymousSlot();

    methodVisitor.visitVarInsn(ALOAD, context.getSlot("protocol"));
    methodVisitor.visitMethodInsn(INVOKEVIRTUAL, "com/facebook/thrift/protocol/TProtocol", "readSetBegin",
            "()Lcom/facebook/thrift/protocol/TSet;");
    methodVisitor.visitFieldInsn(GETFIELD, "com/facebook/thrift/protocol/TSet", "size", "I");
    methodVisitor.visitVarInsn(ISTORE, tsetSizeLocal);

    // result = new ArrayList(tlist.size)
    methodVisitor.visitTypeInsn(NEW, "java/util/HashSet");
    methodVisitor.visitInsn(DUP);/*from   w  w  w  .  jav a  2 s . c om*/
    methodVisitor.visitVarInsn(ILOAD, tsetSizeLocal);
    methodVisitor.visitMethodInsn(INVOKESPECIAL, "java/util/HashSet", "<init>", "(I)V");

    // i = 0
    methodVisitor.visitInsn(ICONST_0);
    methodVisitor.visitVarInsn(ISTORE, loopCounterLocal); // #4 = loop counter

    Label done = new Label();
    Label loop = new Label();
    methodVisitor.visitLabel(loop);
    methodVisitor.visitVarInsn(ILOAD, loopCounterLocal);
    methodVisitor.visitVarInsn(ILOAD, tsetSizeLocal);
    methodVisitor.visitJumpInsn(IF_ICMPGE, done);

    methodVisitor.visitInsn(DUP); // ArrayList

    generateReadElement(methodVisitor, context, type.getValueType());
    generateConvertToObject(methodVisitor, type.getValueType());

    // entry is left on stack(0). Add to list
    methodVisitor.visitMethodInsn(INVOKEVIRTUAL, "java/util/HashSet", "add", "(Ljava/lang/Object;)Z");
    methodVisitor.visitInsn(POP);

    methodVisitor.visitIincInsn(loopCounterLocal, 1);
    methodVisitor.visitJumpInsn(GOTO, loop);

    methodVisitor.visitLabel(done);
    methodVisitor.visitVarInsn(ALOAD, context.getSlot("protocol"));
    methodVisitor.visitMethodInsn(INVOKEVIRTUAL, "com/facebook/thrift/protocol/TProtocol", "readSetEnd", "()V");

    context.release(tsetSizeLocal);
    context.release(loopCounterLocal);
}

From source file:mt.swift.Deserializer.java

License:Apache License

private void generateReadMap(MethodVisitor methodVisitor, FrameRegisterManager context, MapType type) {
    // protocol.readListBegin()
    int tmapSizeLocal = context.newAnonymousSlot();
    int loopCounterLocal = context.newAnonymousSlot();

    methodVisitor.visitVarInsn(ALOAD, context.getSlot("protocol"));
    methodVisitor.visitMethodInsn(INVOKEVIRTUAL, "com/facebook/thrift/protocol/TProtocol", "readMapBegin",
            "()Lcom/facebook/thrift/protocol/TMap;");
    methodVisitor.visitFieldInsn(GETFIELD, "com/facebook/thrift/protocol/TMap", "size", "I");
    methodVisitor.visitVarInsn(ISTORE, tmapSizeLocal);

    // result = new ArrayList(tlist.size)
    methodVisitor.visitTypeInsn(NEW, "java/util/LinkedHashMap");
    methodVisitor.visitInsn(DUP);/*from w  ww .  j  a va 2  s  . c  o m*/
    methodVisitor.visitVarInsn(ILOAD, tmapSizeLocal);
    methodVisitor.visitInsn(ICONST_2); // allocate 2 * tmap.size to avoid rehashing while building map
    methodVisitor.visitInsn(IMUL);
    methodVisitor.visitMethodInsn(INVOKESPECIAL, "java/util/LinkedHashMap", "<init>", "(I)V");

    // i = 0
    methodVisitor.visitInsn(ICONST_0);
    methodVisitor.visitVarInsn(ISTORE, loopCounterLocal); // #4 = loop counter

    Label done = new Label();
    Label loop = new Label();
    methodVisitor.visitLabel(loop);
    methodVisitor.visitVarInsn(ILOAD, loopCounterLocal);
    methodVisitor.visitVarInsn(ILOAD, tmapSizeLocal);
    methodVisitor.visitJumpInsn(IF_ICMPGE, done);

    methodVisitor.visitInsn(DUP); // Map

    generateReadElement(methodVisitor, context, type.getKeyType());
    generateConvertToObject(methodVisitor, type.getKeyType());
    generateReadElement(methodVisitor, context, type.getValueType());
    generateConvertToObject(methodVisitor, type.getValueType());

    // entry is left on stack(0). Add to list
    methodVisitor.visitMethodInsn(INVOKEVIRTUAL, "java/util/LinkedHashMap", "put",
            "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;");
    methodVisitor.visitInsn(POP);

    methodVisitor.visitIincInsn(loopCounterLocal, 1);
    methodVisitor.visitJumpInsn(GOTO, loop);

    methodVisitor.visitLabel(done);
    methodVisitor.visitVarInsn(ALOAD, context.getSlot("protocol"));
    methodVisitor.visitMethodInsn(INVOKEVIRTUAL, "com/facebook/thrift/protocol/TProtocol", "readMapEnd", "()V");

    context.release(tmapSizeLocal);
    context.release(loopCounterLocal);
}