Example usage for org.objectweb.asm MethodVisitor visitEnd

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

Introduction

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

Prototype

public void visitEnd() 

Source Link

Document

Visits the end of the method.

Usage

From source file:me.themallard.bitmmo.impl.plugin.playerhook.PlayerPlugin.java

License:Open Source License

@Override
public void run(ClassNode cn) {
    MethodVisitor mv = cn.visitMethod(Opcodes.ACC_PUBLIC, "getPosition",
            "()" + "Lme/themallard/bitmmo/impl/plugin/position/IPosition;", null, null);
    mv.visitVarInsn(Opcodes.ALOAD, 0);/*w w w.j ava 2  s.co  m*/
    mv.visitFieldInsn(Opcodes.GETFIELD, "Entity", "position", "LPosition;");
    mv.visitInsn(
            Type.getType("Lme/themallard/bitmmo/impl/plugin/position/IPosition;").getOpcode(Opcodes.IRETURN));
    mv.visitMaxs(0, 0);
    mv.visitEnd();
}

From source file:mt.swift.Deserializer.java

License:Apache License

private void compileBridgeMethod(ClassVisitor writer, String targetClassName, String deserializerClassName) {
    // this method is needed to support the generics-based call 
    MethodVisitor syntheticMethodVisitor = writer.visitMethod(ACC_PUBLIC + ACC_BRIDGE + ACC_SYNTHETIC,
            "deserialize",
            "(L" + org.objectweb.asm.Type.getInternalName(Deserializer.class)
                    + ";Lcom/facebook/thrift/protocol/TProtocol;)Ljava/lang/Object;",
            null, new String[] { "com/facebook/thrift/TException" });
    syntheticMethodVisitor.visitCode();/*from w w w  .  j a v  a  2s.  com*/
    syntheticMethodVisitor.visitVarInsn(ALOAD, 0);
    syntheticMethodVisitor.visitVarInsn(ALOAD, 1);
    syntheticMethodVisitor.visitVarInsn(ALOAD, 2);
    syntheticMethodVisitor.visitMethodInsn(INVOKEVIRTUAL, deserializerClassName, "deserialize",
            "(L" + Util.getInternalName(Deserializer.class) + ";Lcom/facebook/thrift/protocol/TProtocol;)L"
                    + targetClassName + ";");
    syntheticMethodVisitor.visitInsn(ARETURN);
    syntheticMethodVisitor.visitMaxs(3, 3);
    syntheticMethodVisitor.visitEnd();
}

From source file:mt.swift.Deserializer.java

License:Apache License

private void compileDeserializeMethod(StructureType type, ClassVisitor writer, String targetClassName,
        Class targetClass) {/* w  ww  .  j a va2 s. co  m*/
    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 compileConstructor(ClassVisitor writer) {
    // constructor
    MethodVisitor constructorVisitor = writer.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null);
    constructorVisitor.visitCode();/*from www . j a v a 2  s . c om*/
    constructorVisitor.visitVarInsn(ALOAD, 0);
    constructorVisitor.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V");
    constructorVisitor.visitInsn(RETURN);
    constructorVisitor.visitMaxs(1, 1);
    constructorVisitor.visitEnd();
}

From source file:mt.swift.Serializer.java

License:Apache License

private void compileSerializeMethod(StructureType type, ClassVisitor writer, String targetClassName,
        Class clazz) {// w w w.j  av  a2s .  com
    MethodVisitor methodVisitor = writer.visitMethod(ACC_PUBLIC, "serialize",
            "(Ljava/lang/Object;L" + Util.getInternalName(Serializer.class)
                    + ";Lcom/facebook/thrift/protocol/TProtocol;)V",
            null, new String[] { "com/facebook/thrift/TException" });

    FrameRegisterManager context = new FrameRegisterManager();
    context.bindSlot("this", 0);
    context.bindSlot("object", 1);
    context.bindSlot("serializer", 2);
    context.bindSlot("protocol", 3);

    methodVisitor.visitCode();

    // protocol.writeStructBegin(new TStruct("name"))
    methodVisitor.visitVarInsn(ALOAD, context.getSlot("protocol"));

    methodVisitor.visitTypeInsn(NEW, "com/facebook/thrift/protocol/TStruct");
    methodVisitor.visitInsn(DUP);
    methodVisitor.visitLdcInsn(type.getName());
    methodVisitor.visitMethodInsn(INVOKESPECIAL, "com/facebook/thrift/protocol/TStruct", "<init>",
            "(Ljava/lang/String;)V");

    methodVisitor.visitMethodInsn(INVOKEVIRTUAL, "com/facebook/thrift/protocol/TProtocol", "writeStructBegin",
            "(Lcom/facebook/thrift/protocol/TStruct;)V");

    // TField tfield = new TField()
    int fieldSlot = context.newAnonymousSlot();

    methodVisitor.visitTypeInsn(NEW, "com/facebook/thrift/protocol/TField");
    methodVisitor.visitInsn(DUP);
    methodVisitor.visitMethodInsn(INVOKESPECIAL, "com/facebook/thrift/protocol/TField", "<init>", "()V");
    methodVisitor.visitVarInsn(ASTORE, fieldSlot);

    for (Field field : type.getFields()) {
        // tfield.id = ...
        methodVisitor.visitVarInsn(ALOAD, fieldSlot);
        pushValue(methodVisitor, (short) field.getId()); // TODO: field.getId() should return short
        methodVisitor.visitFieldInsn(PUTFIELD, "com/facebook/thrift/protocol/TField", "id", "S");

        // tfield.type = ...
        methodVisitor.visitVarInsn(ALOAD, fieldSlot);
        pushValue(methodVisitor, field.getType().getTType());
        methodVisitor.visitFieldInsn(PUTFIELD, "com/facebook/thrift/protocol/TField", "type", "B");

        // tfield.name = ...
        methodVisitor.visitVarInsn(ALOAD, fieldSlot);
        methodVisitor.visitLdcInsn(field.getName());
        methodVisitor.visitFieldInsn(PUTFIELD, "com/facebook/thrift/protocol/TField", "name",
                "Ljava/lang/String;");

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

        if (Map.class.isAssignableFrom(clazz)) {
            generateGetFromMap(methodVisitor, context, field);
        } else {
            generateGetField(targetClassName, methodVisitor, context, field);
        }
        // protocol.writeXXX(element)
        generateWriteElement(methodVisitor, context, field.getType());

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

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

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

    context.release(fieldSlot);
    methodVisitor.visitInsn(RETURN);
    methodVisitor.visitMaxs(1, 1); // TODO: compute these
    methodVisitor.visitEnd();
}

From source file:net.minecrell.quartz.event.EventHandlerClassFactory.java

License:MIT License

private static byte[] generateClass(String name, Class<?> handle, Method method, Class<?> eventClass) {
    name = name.replace('.', '/');

    final String handleName = Type.getInternalName(handle);
    final String handleDescriptor = Type.getDescriptor(handle);
    final String eventName = Type.getInternalName(eventClass);

    ClassWriter cw = new ClassWriter(0);
    FieldVisitor fv;/*from   ww w .  j a va  2s .c  om*/
    MethodVisitor mv;

    cw.visit(V1_8, ACC_PUBLIC + ACC_FINAL + ACC_SUPER, name, null, "java/lang/Object",
            new String[] { EVENT_HANDLER_CLASS });

    {
        fv = cw.visitField(ACC_PRIVATE + ACC_FINAL, "handle", handleDescriptor, null, null);
        fv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PUBLIC, "<init>", '(' + handleDescriptor + ")V", null, null);
        mv.visitCode();
        mv.visitVarInsn(ALOAD, 0);
        mv.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V", false);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitVarInsn(ALOAD, 1);
        mv.visitFieldInsn(PUTFIELD, name, "handle", handleDescriptor);
        mv.visitInsn(RETURN);
        mv.visitMaxs(2, 2);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PUBLIC, "getHandle", "()Ljava/lang/Object;", null, null);
        mv.visitCode();
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, name, "handle", handleDescriptor);
        mv.visitInsn(ARETURN);
        mv.visitMaxs(1, 1);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PUBLIC, "handle", EVENT_HANDLER_METHOD, null, null);
        mv.visitCode();
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, name, "handle", handleDescriptor);
        mv.visitVarInsn(ALOAD, 1);
        mv.visitTypeInsn(CHECKCAST, eventName);
        mv.visitMethodInsn(INVOKEVIRTUAL, handleName, method.getName(), "(L" + eventName + ";)V", false);
        mv.visitInsn(RETURN);
        mv.visitMaxs(2, 2);
        mv.visitEnd();
    }
    cw.visitEnd();

    return cw.toByteArray();
}

From source file:net.openhft.smoothie.SegmentClassGenerator.java

License:Open Source License

private static byte[] classBytes(String segmentClassName, int allocationCapacity) {
    ClassWriter cw = new ClassWriter(0);
    String segmentClassNameWithSlashes = segmentClassName.replace('.', '/');
    cw.visit(52, ACC_PUBLIC + ACC_SUPER, segmentClassNameWithSlashes + allocationCapacity, null,
            segmentClassNameWithSlashes, null);

    for (int i = 1; i < allocationCapacity; i++) {
        FieldVisitor fv;/*  w  w w .j  a  v  a 2s.c  om*/
        fv = cw.visitField(0, "k" + i, "Ljava/lang/Object;", null, null);
        fv.visitEnd();
        fv = cw.visitField(0, "v" + i, "Ljava/lang/Object;", null, null);
        fv.visitEnd();
    }
    {
        MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null);
        mv.visitCode();
        mv.visitVarInsn(ALOAD, 0);
        mv.visitMethodInsn(INVOKESPECIAL, segmentClassNameWithSlashes, "<init>", "()V", false);
        mv.visitInsn(RETURN);
        mv.visitMaxs(1, 1);
        mv.visitEnd();
    }
    cw.visitEnd();

    return cw.toByteArray();
}

From source file:net.orfjackal.dimdwarf.aop.AddEqualsAndHashCodeMethodsForEntities.java

License:Open Source License

private void addEqualsMethod() {
    MethodVisitor mv = cv.visitMethod(ACC_PUBLIC, "equals", "(Ljava/lang/Object;)Z", null, null);
    mv.visitCode();/*  w w  w. j  av a 2s .c  o m*/
    mv.visitVarInsn(ALOAD, 0);
    mv.visitVarInsn(ALOAD, 1);
    mv.visitMethodInsn(INVOKESTATIC, entityHelperClass, "equals", "(Ljava/lang/Object;Ljava/lang/Object;)Z");
    mv.visitInsn(IRETURN);
    mv.visitMaxs(2, 2);
    mv.visitEnd();
}

From source file:net.orfjackal.dimdwarf.aop.AddEqualsAndHashCodeMethodsForEntities.java

License:Open Source License

private void addHashCodeMethod() {
    MethodVisitor mv = cv.visitMethod(ACC_PUBLIC, "hashCode", "()I", null, null);
    mv.visitCode();//from   ww w.  java2  s  . c  o  m
    mv.visitVarInsn(ALOAD, 0);
    mv.visitMethodInsn(INVOKESTATIC, entityHelperClass, "hashCode", "(Ljava/lang/Object;)I");
    mv.visitInsn(IRETURN);
    mv.visitMaxs(1, 1);
    mv.visitEnd();
}

From source file:net.orfjackal.retrolambda.defaultmethods.ClassModifier.java

License:Open Source License

@Override
public void visitEnd() {
    for (MethodContainer m : defaultMethods) {
        if (visitedMethods.contains(new VisitedMethod(m.methodName, m.methodDesc))) {
            continue;
        }/*from w  w  w  . j a  v  a 2s  . c o  m*/
        System.out.println("VISITEND, CREATING PROXY " + m);
        MethodVisitor tmp = super.visitMethod(ACC_PUBLIC, m.methodName, m.methodDesc, m.signature,
                m.exceptions);
        tmp.visitVarInsn(ALOAD, 0);
        int i = 1;
        for (Type arg : Type.getArgumentTypes(m.methodDesc)) {
            tmp.visitVarInsn(arg.getOpcode(ILOAD), i++);
        }
        String rightInterface = findRightInterace(m, interfaces);
        System.out.println("It thinks that the right interface is " + rightInterface);
        String mDesc = Helpers.addParam(m.methodDesc, rightInterface);
        tmp.visitMethodInsn(INVOKESTATIC, rightInterface + "$helper", m.methodName, mDesc, false);
        tmp.visitInsn(Type.getReturnType(m.methodDesc).getOpcode(IRETURN));
        tmp.visitMaxs(0, 0);
        tmp.visitEnd();
    }
    super.visitEnd();
}