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: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();//  ww  w  .ja  v  a 2s.c  om
    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:lucee.transformer.bytecode.Page.java

License:Open Source License

public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) {

    if (!name.equals("getSourceLastModified"))
        return super.visitMethod(access, name, desc, signature, exceptions);

    MethodVisitor mv = cv.visitMethod(access, name, desc, signature, exceptions);
    mv.visitCode();/*from   ww  w  .j  a va  2  s  .  c  o  m*/
    mv.visitLdcInsn(Long.valueOf(lastModified));
    mv.visitInsn(Opcodes.LRETURN);
    mv.visitEnd();
    return mv;
}

From source file:lucee.transformer.bytecode.util.MethodCleaner.java

License:Open Source License

public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) {
    if (name.equals(methodName) && desc.equals(strArgs)) {

        MethodVisitor mv = cv.visitMethod(access, name, desc, signature, exceptions);
        mv.visitCode();//from   ww w. j av a2  s .co  m

        if (msg == null)
            empty(mv);
        else
            exception(mv);

        mv.visitEnd();
        return mv;
    }
    return super.visitMethod(access, name, desc, signature, exceptions);

}

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

License:Open Source License

private byte[] generateClass(String name, Class<?> handle, Method method) {
    name = name.replace(".", "/");
    final String handleName = Type.getInternalName(handle);
    final String handleDescriptor = Type.getDescriptor(handle);
    List<Parameter> pm = Arrays.asList(method.getParameters());
    boolean token = pm.stream().anyMatch(p -> p.isAnnotationPresent(Token.class));
    final boolean source = pm.stream().anyMatch(p -> p.isAnnotationPresent(Source.class));
    final boolean observer = pm.stream().anyMatch(p -> p.isAnnotationPresent(Observer.class));
    final boolean srcNullable = pm.stream().filter(p -> p.isAnnotationPresent(Source.class))
            .anyMatch(p -> p.isAnnotationPresent(Nullable.class));
    final boolean optionalTokenType = token && pm.stream().anyMatch(p -> p.getType().equals(Optional.class));
    final Optional<Class<?>> tokenClass = token
            ? pm.stream().filter(p -> p.isAnnotationPresent(Token.class)).findAny().map(pr -> {
                if (optionalTokenType) {
                    return (Class<?>) ((ParameterizedType) pr.getParameterizedType())
                            .getActualTypeArguments()[0];
                } else {
                    return pr.getType();
                }//from  www .  j a va  2 s  .com
            })
            : Optional.empty();
    token = token && tokenClass.isPresent();
    final boolean obsNullable = pm.stream().filter(p -> p.isAnnotationPresent(Observer.class))
            .anyMatch(p -> p.isAnnotationPresent(Nullable.class));
    final boolean tokNullable = token && !optionalTokenType
            && pm.stream().filter(p -> p.isAnnotationPresent(Token.class))
                    .anyMatch(p -> p.isAnnotationPresent(Nullable.class));
    final boolean fixToken = token && pm.stream().filter(p -> p.isAnnotationPresent(Token.class))
            .map(p -> p.getAnnotation(Token.class)).anyMatch(Token::fix);
    final Optional<Class<?>> sourceType = pm.stream().filter(p -> p.isAnnotationPresent(Source.class))
            .findFirst().map(Parameter::getType);
    final Optional<Class<?>> observerType = pm.stream().filter(p -> p.isAnnotationPresent(Observer.class))
            .findFirst().map(Parameter::getType);
    Class<?> returnType = method.getReturnType();
    if (returnType.equals(Void.TYPE)) {
        returnType = Object.class;
    }
    String retString = Type.getDescriptor(returnType);
    String parseMethodDescriptor = "(L" + Type.getInternalName(sourceType.orElse(Locatable.class)) + ";L"
            + Type.getInternalName(observerType.orElse(Locatable.class)) + ";L" + OPT_NAME + ";)" + retString;
    String externalParseDescriptor = "(Ljava/lang/Object;Ljava/lang/Object;Ljava/util/Optional;)Ljava/lang/Object;";
    String methodDescriptor = Type.getMethodDescriptor(method);
    ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES | ClassWriter.COMPUTE_MAXS);
    MethodVisitor mv;
    cw.visit(V1_8, ACC_PUBLIC + ACC_FINAL + ACC_SUPER, name, null, PLACEHOLDER_NAME, null);
    {
        mv = cw.visitMethod(ACC_PUBLIC, "<init>", '(' + handleDescriptor + ")V", null, null);
        mv.visitCode();
        mv.visitVarInsn(ALOAD, 0);
        mv.visitLdcInsn(method.getAnnotation(Placeholder.class).id());
        mv.visitVarInsn(ALOAD, 1);
        mv.visitMethodInsn(INVOKESPECIAL, PLACEHOLDER_NAME, "<init>",
                "(L" + STRING_NAME + ";L" + OBJECT_NAME + ";)V", false);
        mv.visitInsn(RETURN);
        mv.visitMaxs(0, 0);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PUBLIC, "parse", parseMethodDescriptor, null,
                new String[] { "java/lang/Exception" });
        mv.visitCode();
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, name, "handle", "L" + OBJECT_NAME + ";");
        mv.visitTypeInsn(CHECKCAST, handleName);
        if (token) {
            if (!String.class.isAssignableFrom(tokenClass.get()) || (tokenClass.get().isArray()
                    && String.class.isAssignableFrom(tokenClass.get().getComponentType()))) {
                mv.visitVarInsn(ALOAD, 3);
                mv.visitInsn(ACONST_NULL);
                mv.visitMethodInsn(INVOKEVIRTUAL, OPT_NAME, "orElse", "(Ljava/lang/Object;)Ljava/lang/Object;",
                        false);
                if (optionalTokenType) {
                    utilsTryCast(mv, boxedPrim(tokenClass.get()), false);
                    mv.visitVarInsn(ASTORE, 3);
                } else {
                    mv.visitVarInsn(ASTORE, 4);
                    mv.visitVarInsn(ALOAD, 4);
                    skipIfNull(mv, mv2 -> {
                        mv2.visitVarInsn(ALOAD, 4);
                        utilsTryCast(mv2, boxedPrim(tokenClass.get()), true);
                        mv2.visitVarInsn(ASTORE, 4);
                    });
                }
            } else {
                if (!optionalTokenType) {
                    mv.visitVarInsn(ALOAD, 3);
                    mv.visitInsn(ACONST_NULL);
                    mv.visitMethodInsn(INVOKEVIRTUAL, OPT_NAME, "orElse",
                            "(Ljava/lang/Object;)Ljava/lang/Object;", false);
                    mv.visitVarInsn(ASTORE, 4);
                    if (fixToken) {
                        mv.visitVarInsn(ALOAD, 4);
                        skipIfNull(mv, mv2 -> {
                            mv2.visitVarInsn(ALOAD, 4);
                            mv2.visitTypeInsn(CHECKCAST, STRING_NAME);
                            mv2.visitMethodInsn(INVOKEVIRTUAL, STRING_NAME, "toLowerCase", TLC_SIG, false);
                            mv2.visitMethodInsn(INVOKEVIRTUAL, STRING_NAME, "trim", TRIM_SIG, false);
                            mv2.visitVarInsn(ASTORE, 4);
                        });
                    }
                }
            }
        }
        for (int i = 0; i < method.getParameterCount(); i++) {
            int x;
            Parameter p = method.getParameters()[i];
            x = getOrder(p);
            if (x == 2 && !optionalTokenType) {
                x = 3;
            }
            mv.visitVarInsn(ALOAD, x + 1);
            boolean nullable = false;
            switch (x) {
            case 0:
                nullable = srcNullable;
                break;
            case 1:
                nullable = obsNullable;
                break;
            case 3:
                nullable = tokNullable;
                break;
            }
            final int x1 = x;
            nullCheck(mv, nullable, mv2 -> mv2.visitVarInsn(ALOAD, x1 + 1), x == 3 && token);
            mv.visitTypeInsn(CHECKCAST, Type.getInternalName(boxedPrim(p.getType())));
            boxToPrim(mv, p.getType(), x1 + 1);
        }
        mv.visitMethodInsn(INVOKEVIRTUAL, handleName, method.getName(), methodDescriptor, false);
        if (method.getReturnType().equals(Void.TYPE)) {
            mv.visitLdcInsn("");
        }
        if (!retString.startsWith("L")) {
            returnInsn(mv, returnType);
        } else {
            mv.visitInsn(ARETURN);
        }
        mv.visitMaxs(10, 10);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PUBLIC, "parse", externalParseDescriptor, null,
                new String[] { "java/lang/Exception" });
        mv.visitCode();
        mv.visitVarInsn(ALOAD, 0);
        if (sourceType.isPresent() && source) {
            mv.visitVarInsn(ALOAD, 1);
            tryCatch(mv, mv2 -> mv2.visitTypeInsn(CHECKCAST, Type.getInternalName(sourceType.get())), mv2 -> {
                mv2.visitLdcInsn("");
                mv2.visitInsn(ARETURN);
            });
        } else {
            mv.visitInsn(ACONST_NULL);
        }
        if (observerType.isPresent() && observer) {
            mv.visitVarInsn(ALOAD, 2);
            tryCatch(mv, mv2 -> mv2.visitTypeInsn(CHECKCAST, Type.getInternalName(observerType.get())), mv2 -> {
                mv2.visitLdcInsn("");
                mv2.visitInsn(ARETURN);
            });
        } else {
            mv.visitInsn(ACONST_NULL);
        }
        mv.visitVarInsn(ALOAD, 3);
        mv.visitMethodInsn(INVOKEVIRTUAL, name, "parse", parseMethodDescriptor, false);
        unboxFromPrim(mv, returnType);
        mv.visitInsn(ARETURN);
        mv.visitMaxs(0, 0);
        mv.visitEnd();
    }
    cw.visitEnd();
    return cw.toByteArray();
}

From source file:me.themallard.bitmmo.api.transformer.Transformer.java

License:Open Source License

protected final void createGetter(ClassNode cn, FieldNode fn, String name) {
    MethodVisitor mv = cn.visitMethod(Opcodes.ACC_PUBLIC, name, "()" + fn.desc, null, null);
    mv.visitVarInsn(Opcodes.ALOAD, 0);/*w w w  .j  av  a2  s .c o  m*/
    mv.visitFieldInsn(Opcodes.GETFIELD, cn.name, fn.name, fn.desc);
    mv.visitInsn(Type.getType(fn.desc).getOpcode(Opcodes.IRETURN));
    mv.visitMaxs(0, 0);
    mv.visitEnd();
}

From source file:me.themallard.bitmmo.api.transformer.Transformer.java

License:Open Source License

protected final void createSetter(ClassNode cn, FieldNode fn, String name) {
    MethodVisitor mv = cn.visitMethod(Opcodes.ACC_PUBLIC, name, "(" + fn.desc + ")V", null, null);
    mv.visitVarInsn(Opcodes.ALOAD, 0);//from  w w  w .  j  ava2 s  .com
    mv.visitVarInsn(Type.getType(fn.desc).getOpcode(Opcodes.ILOAD), 1);
    mv.visitFieldInsn(Opcodes.PUTFIELD, cn.name, fn.name, fn.desc);
    mv.visitInsn(Opcodes.RETURN);
    mv.visitMaxs(0, 0);
    mv.visitEnd();
}

From source file:me.themallard.bitmmo.impl.plugin.chathook.ChatHook.java

License:Open Source License

private void createSendMessage(ClassNode cn) {
    Pattern p = new PatternBuilder().add(new InstructionElement(INVOKESTATIC), new AnyElement(),
            new LdcElement(new LdcInsnNode("Chat")), new InstructionElement(INVOKEVIRTUAL)).build();

    MethodInsnNode newBuilder = null;/* w w  w  .j  a va2s.  com*/
    MethodInsnNode setChatText = null;
    MethodInsnNode ebola1 = null;
    MethodInsnNode ebola2 = null;
    MethodInsnNode ebola3 = null;
    MethodInsnNode ebola4 = null;
    MethodInsnNode ebola5 = null;
    MethodInsnNode ebola6 = null;
    MethodInsnNode ebola7 = null;

    for (MethodNode mn : cn.methods) {
        if (!p.contains(mn.instructions))
            continue;

        int offset = p.getOffset(mn.instructions);

        newBuilder = (MethodInsnNode) mn.instructions.get(offset - 9); // newbuilder
        // then var insn of parameter, ldc or w/e
        setChatText = (MethodInsnNode) mn.instructions.get(offset - 7); // setchattext
        ebola1 = (MethodInsnNode) mn.instructions.get(offset - 6); // U a
        ebola2 = (MethodInsnNode) mn.instructions.get(offset - 5); // U p
        ebola3 = (MethodInsnNode) mn.instructions.get(offset - 4); // Player
        // r
        ebola4 = (MethodInsnNode) mn.instructions.get(offset - 3); // setMapID
        ebola5 = (MethodInsnNode) mn.instructions.get(offset - 2); // build
        // store that crap
        ebola6 = (MethodInsnNode) mn.instructions.get(offset); // i e
        // load crap again
        // LDC "Chat"
        ebola7 = (MethodInsnNode) mn.instructions.get(offset + 3); // i a
    }

    {
        MethodVisitor mv = cn.visitMethod(ACC_PUBLIC, "sendChatMessage", "(Ljava/lang/String;)V", null, null);
        mv.visitMethodInsn(INVOKESTATIC, newBuilder.owner, newBuilder.name, newBuilder.desc, newBuilder.itf);
        mv.visitVarInsn(ALOAD, 1);
        mv.visitMethodInsn(INVOKEVIRTUAL, setChatText.owner, setChatText.name, setChatText.desc,
                setChatText.itf);
        mv.visitMethodInsn(INVOKESTATIC, ebola1.owner, ebola1.name, ebola1.desc, ebola1.itf);
        mv.visitMethodInsn(INVOKEVIRTUAL, ebola2.owner, ebola2.name, ebola2.desc, ebola2.itf);
        mv.visitMethodInsn(INVOKEVIRTUAL, ebola3.owner, ebola3.name, ebola3.desc, ebola3.itf);
        mv.visitMethodInsn(INVOKEVIRTUAL, ebola4.owner, ebola4.name, ebola4.desc, ebola4.itf);
        mv.visitMethodInsn(INVOKEVIRTUAL, ebola5.owner, ebola5.name, ebola5.desc, ebola5.itf);
        mv.visitVarInsn(ASTORE, 2);
        mv.visitMethodInsn(INVOKESTATIC, ebola6.owner, ebola6.name, ebola6.desc, ebola6.itf);
        mv.visitVarInsn(ALOAD, 2);
        mv.visitLdcInsn("Chat");
        mv.visitMethodInsn(INVOKEVIRTUAL, ebola7.owner, ebola7.name, ebola7.desc, ebola7.itf);
        mv.visitInsn(RETURN);
        mv.visitMaxs(2, 2);
        mv.visitEnd();
    }
}

From source file:me.themallard.bitmmo.impl.plugin.chathook.ChatHook.java

License:Open Source License

private void createAddMessage(ClassNode cn) {
    Pattern p = new PatternBuilder().add(new InstructionElement(ALOAD), new LdcElement(new LdcInsnNode("")),
            new InstructionElement(ALOAD), new InstructionElement(INVOKEVIRTUAL)).build();

    MethodInsnNode ebola1 = null;/* w  w w  .j av  a  2 s  . c  o  m*/

    for (MethodNode mn : cn.methods) {
        if (!p.contains(mn.instructions))
            continue;

        int offset = p.getOffset(mn.instructions);

        ebola1 = (MethodInsnNode) mn.instructions.get(offset + 3);
    }

    {
        MethodVisitor mv = cn.visitMethod(ACC_PUBLIC, "addChatMessage", "(Ljava/lang/String;)V", null, null);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitLdcInsn("");
        mv.visitVarInsn(ALOAD, 1);
        mv.visitMethodInsn(INVOKEVIRTUAL, ebola1.owner, ebola1.name, ebola1.desc, ebola1.itf);
        mv.visitInsn(RETURN);
        mv.visitEnd();
    }
}

From source file:me.themallard.bitmmo.impl.plugin.chathook.ChatHook.java

License:Open Source License

public void createIsVisible(ClassNode cn) {
    // again too lazy to make actual work
    // steal it from original code and hope that it works ;)
    InsnList method = null;/*w ww. j  a va2  s  .  c o m*/

    for (MethodNode mn : cn.methods) {
        if (mn.desc.equals("()Z")) {
            method = mn.instructions;
            break;
        }
    }

    MethodVisitor mv = cn.visitMethod(ACC_PUBLIC, "isVisible", "()Z", null, null);
    method.accept(mv);
    mv.visitEnd();
}

From source file:me.themallard.bitmmo.impl.plugin.inputactiontracker.InputActionTrackerPlugin.java

License:Open Source License

private void createIsKeyDown(ClassNode cn) {
    // again too lazy to make actual work
    // steal it from original code and hope that it works ;)

    for (MethodNode mn : cn.methods) {
        if (mn.desc.equals("(LHTMud/InputActionTracker$ActionType;)Z")) {
            InsnList method = mn.instructions;

            MethodVisitor mv = cn.visitMethod(ACC_PUBLIC, "isKeyDown", mn.desc, null, null);
            method.accept(mv);/*from   w  w  w .j a v a2 s.  c o m*/
            mv.visitEnd();
            break;
        }
    }
}