Example usage for org.objectweb.asm MethodVisitor visitInvokeDynamicInsn

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

Introduction

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

Prototype

public void visitInvokeDynamicInsn(final String name, final String descriptor,
        final Handle bootstrapMethodHandle, final Object... bootstrapMethodArguments) 

Source Link

Document

Visits an invokedynamic instruction.

Usage

From source file:com.gargoylesoftware.js.nashorn.internal.codegen.types.LongType.java

License:Open Source License

@Override
public Type div(final MethodVisitor method, final int programPoint) {
    if (programPoint == INVALID_PROGRAM_POINT) {
        JSType.DIV_ZERO_LONG.invoke(method);
    } else {/* ww  w  . jav a  2 s . c om*/
        method.visitInvokeDynamicInsn("ldiv", "(JJ)J", MATHBOOTSTRAP, programPoint);
    }
    return LONG;
}

From source file:com.gargoylesoftware.js.nashorn.internal.codegen.types.LongType.java

License:Open Source License

@Override
public Type rem(final MethodVisitor method, final int programPoint) {
    if (programPoint == INVALID_PROGRAM_POINT) {
        JSType.REM_ZERO_LONG.invoke(method);
    } else {/*from  ww w  . ja v  a2 s.  c o m*/
        method.visitInvokeDynamicInsn("lrem", "(JJ)J", MATHBOOTSTRAP, programPoint);
    }
    return LONG;
}

From source file:com.gargoylesoftware.js.nashorn.internal.codegen.types.LongType.java

License:Open Source License

@Override
public Type neg(final MethodVisitor method, final int programPoint) {
    method.visitInvokeDynamicInsn("lneg", "(J)J", MATHBOOTSTRAP, programPoint);
    return LONG;//w w w  .  j av  a  2 s . c  o m
}

From source file:com.github.wolf480pl.mias4j.MakeTestDynamic.java

License:Open Source License

public static byte[] dump() throws Exception {

    ClassWriter cw = new ClassWriter(0);
    FieldVisitor fv;/*from  www . ja  v a 2  s.  c  om*/
    MethodVisitor mv;
    AnnotationVisitor av0;

    cw.visit(V1_7, ACC_PUBLIC + ACC_SUPER, "TestDynamic", null, "java/lang/Object", null);

    cw.visitInnerClass("java/lang/invoke/MethodHandles$Lookup", "java/lang/invoke/MethodHandles", "Lookup",
            ACC_PUBLIC + ACC_FINAL + ACC_STATIC);

    {
        mv = cw.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null);
        mv.visitCode();
        mv.visitVarInsn(ALOAD, 0);
        mv.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V", false);
        mv.visitInsn(RETURN);
        mv.visitMaxs(1, 1);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PUBLIC + ACC_STATIC, "bootstrap",
                "(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;",
                null, new String[] { "java/lang/NoSuchMethodException", "java/lang/IllegalAccessException" });
        mv.visitCode();
        mv.visitVarInsn(ALOAD, 0);
        mv.visitLdcInsn(Type.getType("LTestDynamic;"));
        mv.visitLdcInsn("sayHi");
        mv.visitVarInsn(ALOAD, 3);
        mv.visitLdcInsn(Type.getType("LTestDynamic;"));
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/invoke/MethodHandles$Lookup", "findSpecial",
                "(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/Class;)Ljava/lang/invoke/MethodHandle;",
                false);
        mv.visitVarInsn(ASTORE, 4);
        mv.visitTypeInsn(NEW, "java/lang/invoke/ConstantCallSite");
        mv.visitInsn(DUP);
        mv.visitVarInsn(ALOAD, 4);
        mv.visitMethodInsn(INVOKESPECIAL, "java/lang/invoke/ConstantCallSite", "<init>",
                "(Ljava/lang/invoke/MethodHandle;)V", false);
        mv.visitInsn(ARETURN);
        mv.visitMaxs(5, 5);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PUBLIC + ACC_STATIC, "main", "([Ljava/lang/String;)V", null, null);
        mv.visitCode();
        mv.visitTypeInsn(NEW, "TestDynamic");
        mv.visitInsn(DUP);
        mv.visitMethodInsn(INVOKESPECIAL, "TestDynamic", "<init>", "()V", false);
        mv.visitVarInsn(ASTORE, 1);
        mv.visitVarInsn(ALOAD, 1);
        // mv.visitMethodInsn(INVOKESPECIAL, "TestDynamic", "sayHi", "()V", false);
        mv.visitInvokeDynamicInsn("sayHi", "(LTestDynamic;)V", new Handle(H_INVOKESTATIC, "TestDynamic",
                "bootstrap",
                "(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;"),
                Type.getMethodType("()V"));
        mv.visitInsn(RETURN);
        mv.visitMaxs(2, 2);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PRIVATE, "sayHi", "()V", null, null);
        mv.visitCode();
        mv.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
        mv.visitLdcInsn("hi");
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
        mv.visitInsn(RETURN);
        mv.visitMaxs(2, 1);
        mv.visitEnd();
    }
    cw.visitEnd();

    return cw.toByteArray();
}

From source file:com.google.devtools.build.android.desugar.Bug62060793TestDataGenerator.java

License:Open Source License

private static byte[] createClass() {
    ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
    MethodVisitor mv;
    cw.visit(V1_8, ACC_PUBLIC | ACC_SUPER, CLASS_NAME, null, "java/lang/Object", null);

    cw.visitInnerClass(INTERFACE_TYPE_NAME, CLASS_NAME, "Interface",
            ACC_PUBLIC | ACC_STATIC | ACC_ABSTRACT | ACC_INTERFACE);

    cw.visitInnerClass("java/lang/invoke/MethodHandles$Lookup", "java/lang/invoke/MethodHandles", "Lookup",
            ACC_PUBLIC | ACC_FINAL | ACC_STATIC);

    {/* w  w w. j  a  v a  2  s. c  o  m*/
        mv = cw.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null);
        mv.visitCode();
        mv.visitVarInsn(ALOAD, 0);
        mv.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V", false);
        mv.visitInsn(RETURN);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PRIVATE | ACC_STATIC, "method", "(Ljava/lang/String;)Ljava/lang/String;", null,
                null);
        mv.visitParameter("str", 0);
        mv.visitCode();
        mv.visitVarInsn(ALOAD, 0);
        mv.visitInsn(ARETURN);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PRIVATE | ACC_STATIC, "method",
                "(ZCBFDJISLjava/lang/Object;[Ljava/lang/Object;Ljava/lang/String;)Ljava/lang/String;", null,
                null);
        mv.visitParameter("bool", 0);
        mv.visitParameter("c", 0);
        mv.visitParameter("b", 0);
        mv.visitParameter("f", 0);
        mv.visitParameter("d", 0);
        mv.visitParameter("l", 0);
        mv.visitParameter("i", 0);
        mv.visitParameter("s", 0);
        mv.visitParameter("o", 0);
        mv.visitParameter("array", 0);
        mv.visitParameter("str", 0);
        mv.visitCode();
        mv.visitVarInsn(ALOAD, 10);
        mv.visitMethodInsn(INVOKESTATIC, "java/lang/String", "valueOf",
                "(Ljava/lang/Object;)Ljava/lang/String;", false);
        mv.visitVarInsn(ASTORE, 13);
        mv.visitVarInsn(ALOAD, 11);
        Label l0 = new Label();
        mv.visitJumpInsn(IFNONNULL, l0);
        mv.visitInsn(ICONST_1);
        Label l1 = new Label();
        mv.visitJumpInsn(GOTO, l1);
        mv.visitLabel(l0);
        mv.visitFrame(Opcodes.F_APPEND, 1, new Object[] { "java/lang/String" }, 0, null);
        mv.visitInsn(ICONST_0);
        mv.visitLabel(l1);
        mv.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] { Opcodes.INTEGER });
        mv.visitVarInsn(ISTORE, 14);
        mv.visitIntInsn(BIPUSH, 91);
        mv.visitVarInsn(ALOAD, 12);
        mv.visitMethodInsn(INVOKESTATIC, "java/lang/String", "valueOf",
                "(Ljava/lang/Object;)Ljava/lang/String;", false);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/String", "length", "()I", false);
        mv.visitInsn(IADD);
        mv.visitVarInsn(ALOAD, 13);
        mv.visitMethodInsn(INVOKESTATIC, "java/lang/String", "valueOf",
                "(Ljava/lang/Object;)Ljava/lang/String;", false);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/String", "length", "()I", false);
        mv.visitInsn(IADD);
        mv.visitTypeInsn(NEW, "java/lang/StringBuilder");
        mv.visitInsn(DUP_X1);
        mv.visitInsn(SWAP);
        mv.visitMethodInsn(INVOKESPECIAL, "java/lang/StringBuilder", "<init>", "(I)V", false);
        mv.visitVarInsn(ALOAD, 12);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append",
                "(Ljava/lang/String;)Ljava/lang/StringBuilder;", false);
        mv.visitVarInsn(ILOAD, 0);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append", "(Z)Ljava/lang/StringBuilder;",
                false);
        mv.visitVarInsn(ILOAD, 1);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append", "(C)Ljava/lang/StringBuilder;",
                false);
        mv.visitVarInsn(ILOAD, 2);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append", "(I)Ljava/lang/StringBuilder;",
                false);
        mv.visitVarInsn(FLOAD, 3);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append", "(F)Ljava/lang/StringBuilder;",
                false);
        mv.visitVarInsn(DLOAD, 4);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append", "(D)Ljava/lang/StringBuilder;",
                false);
        mv.visitVarInsn(LLOAD, 6);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append", "(J)Ljava/lang/StringBuilder;",
                false);
        mv.visitVarInsn(ILOAD, 8);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append", "(I)Ljava/lang/StringBuilder;",
                false);
        mv.visitVarInsn(ILOAD, 9);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append", "(I)Ljava/lang/StringBuilder;",
                false);
        mv.visitVarInsn(ALOAD, 13);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append",
                "(Ljava/lang/String;)Ljava/lang/StringBuilder;", false);
        mv.visitVarInsn(ILOAD, 14);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append", "(Z)Ljava/lang/StringBuilder;",
                false);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "toString", "()Ljava/lang/String;", false);
        mv.visitInsn(ARETURN);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PUBLIC | ACC_STATIC, "lambdaWithConstantArguments",
                "()L" + INTERFACE_TYPE_NAME + ";", null, null);
        mv.visitCode();
        mv.visitInsn(ICONST_0);
        mv.visitInsn(ICONST_1);
        mv.visitInsn(ICONST_2);
        mv.visitInsn(FCONST_0);
        mv.visitInsn(DCONST_0);
        mv.visitInsn(LCONST_0);
        mv.visitInsn(ICONST_4);
        mv.visitIntInsn(SIPUSH, 9);
        mv.visitInsn(ACONST_NULL);
        mv.visitInsn(ACONST_NULL);
        mv.visitInvokeDynamicInsn("call",
                "(ZCBFDJISLjava/lang/Object;[Ljava/lang/Object;)L" + INTERFACE_TYPE_NAME + ";",
                new Handle(Opcodes.H_INVOKESTATIC, "java/lang/invoke/LambdaMetafactory", "metafactory",
                        "(Ljava/lang/invoke/MethodHandles$Lookup;"
                                + "Ljava/lang/String;Ljava/lang/invoke/MethodType;"
                                + "Ljava/lang/invoke/MethodType;" + "Ljava/lang/invoke/MethodHandle;"
                                + "Ljava/lang/invoke/MethodType;" + ")Ljava/lang/invoke/CallSite;",
                        false),
                new Object[] { Type.getType("(Ljava/lang/String;)Ljava/lang/String;"),
                        new Handle(Opcodes.H_INVOKESTATIC, CLASS_NAME, "method",
                                "(ZCBFDJISLjava/lang/Object;[Ljava/lang/Object;Ljava/lang/String;"
                                        + ")Ljava/lang/String;",
                                false),
                        Type.getType("(Ljava/lang/String;)Ljava/lang/String;") });
        mv.visitInsn(ARETURN);
        mv.visitEnd();
    }

    cw.visitEnd();

    return cw.toByteArray();
}

From source file:com.heliosdecompiler.appifier.SystemHookDump.java

License:Apache License

public static byte[] dump() {

    ClassWriter cw = new ClassWriter(0);
    FieldVisitor fv;//from   w  w  w.  ja  v a 2s  .  co m
    MethodVisitor mv;
    AnnotationVisitor av0;

    cw.visit(52, ACC_PUBLIC + ACC_SUPER, "com/heliosdecompiler/appifier/SystemHook", null, "java/lang/Object",
            null);

    cw.visitInnerClass("java/lang/invoke/MethodHandles$Lookup", "java/lang/invoke/MethodHandles", "Lookup",
            ACC_PUBLIC + ACC_FINAL + ACC_STATIC);

    {
        fv = cw.visitField(ACC_PUBLIC + ACC_STATIC, "out", "Ljava/lang/ThreadLocal;",
                "Ljava/lang/ThreadLocal<Ljava/io/PrintStream;>;", null);
        fv.visitEnd();
    }
    {
        fv = cw.visitField(ACC_PUBLIC + ACC_STATIC, "err", "Ljava/lang/ThreadLocal;",
                "Ljava/lang/ThreadLocal<Ljava/io/PrintStream;>;", 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", false);
        mv.visitInsn(RETURN);
        mv.visitMaxs(1, 1);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PRIVATE + ACC_STATIC + ACC_SYNTHETIC, "lambda$static$1",
                "()Ljava/io/PrintStream;", null, null);
        mv.visitCode();
        mv.visitFieldInsn(GETSTATIC, "java/lang/System", "err", "Ljava/io/PrintStream;");
        mv.visitInsn(ARETURN);
        mv.visitMaxs(1, 0);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_PRIVATE + ACC_STATIC + ACC_SYNTHETIC, "lambda$static$0",
                "()Ljava/io/PrintStream;", null, null);
        mv.visitCode();
        mv.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
        mv.visitInsn(ARETURN);
        mv.visitMaxs(1, 0);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(ACC_STATIC, "<clinit>", "()V", null, null);
        mv.visitCode();
        mv.visitInvokeDynamicInsn("get", "()Ljava/util/function/Supplier;", new Handle(Opcodes.H_INVOKESTATIC,
                "java/lang/invoke/LambdaMetafactory", "metafactory",
                "(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;"),
                new Object[] { Type.getType("()Ljava/lang/Object;"),
                        new Handle(Opcodes.H_INVOKESTATIC, "com/heliosdecompiler/appifier/SystemHook",
                                "lambda$static$0", "()Ljava/io/PrintStream;"),
                        Type.getType("()Ljava/io/PrintStream;") });
        mv.visitMethodInsn(INVOKESTATIC, "java/lang/ThreadLocal", "withInitial",
                "(Ljava/util/function/Supplier;)Ljava/lang/ThreadLocal;", false);
        mv.visitFieldInsn(PUTSTATIC, "com/heliosdecompiler/appifier/SystemHook", "out",
                "Ljava/lang/ThreadLocal;");
        mv.visitInvokeDynamicInsn("get", "()Ljava/util/function/Supplier;", new Handle(Opcodes.H_INVOKESTATIC,
                "java/lang/invoke/LambdaMetafactory", "metafactory",
                "(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;"),
                new Object[] { Type.getType("()Ljava/lang/Object;"),
                        new Handle(Opcodes.H_INVOKESTATIC, "com/heliosdecompiler/appifier/SystemHook",
                                "lambda$static$1", "()Ljava/io/PrintStream;"),
                        Type.getType("()Ljava/io/PrintStream;") });
        mv.visitMethodInsn(INVOKESTATIC, "java/lang/ThreadLocal", "withInitial",
                "(Ljava/util/function/Supplier;)Ljava/lang/ThreadLocal;", false);
        mv.visitFieldInsn(PUTSTATIC, "com/heliosdecompiler/appifier/SystemHook", "err",
                "Ljava/lang/ThreadLocal;");
        mv.visitInsn(RETURN);
        mv.visitMaxs(1, 0);
        mv.visitEnd();
    }
    cw.visitEnd();

    return cw.toByteArray();
}

From source file:com.yahoo.yqlplus.engine.internal.plan.types.base.InvokeDynamicExpression.java

@Override
public void generate(CodeEmitter code) {
    for (BytecodeExpression arg : arguments) {
        arg.generate(code);//from   w ww  .j  a v a2  s  .  c  o  m
    }
    Type[] argTypes = new Type[arguments.size()];
    for (int i = 0; i < arguments.size(); ++i) {
        argTypes[i] = arguments.get(i).getType().getJVMType();
    }
    String desc = Type.getMethodDescriptor(returnType.getJVMType(), argTypes);
    MethodVisitor mv = code.getMethodVisitor();
    mv.visitInvokeDynamicInsn(operationName, desc, bootstrap, bootstrapArgs);
}

From source file:org.ballerinalang.nativeimpl.jvm.methodvisitor.VisitInvokeDynamicInsn.java

License:Open Source License

public static void visitInvokeDynamicInsn(Strand strand, ObjectValue oMv, String className, String lambdaName,
        long mapsCount) {

    String mapDesc = getMapsDesc(mapsCount);

    //Function<Object[], Object> - create a dynamic lambda invocation with object[] param and returns object
    MethodVisitor mv = ASMUtil.getRefArgumentNativeData(oMv);
    Handle handle = new Handle(Opcodes.H_INVOKESTATIC, "java/lang/invoke/LambdaMetafactory", "metafactory",
            "(Ljava/lang/invoke/MethodHandles$Lookup;" + STRING_DESC + METHOD_TYPE_DESC + METHOD_TYPE_DESC
                    + "Ljava/lang/invoke/MethodHandle;" + METHOD_TYPE_DESC + ")Ljava/lang/invoke/CallSite;",
            false);//from   ww w .  j a v a 2  s .com

    mv.visitInvokeDynamicInsn("apply", "(" + mapDesc + ")" + FUNCTION_DESC, handle,
            new Object[] { Type.getType("(" + OBJECT_DESC + ")" + OBJECT_DESC),
                    new Handle(Opcodes.H_INVOKESTATIC, className, lambdaName,
                            "(" + mapDesc + "[" + OBJECT_DESC + ")" + OBJECT_DESC, false),
                    Type.getType("([" + OBJECT_DESC + ")" + OBJECT_DESC) });
}

From source file:org.codehaus.groovy.classgen.asm.sc.StaticTypesLambdaWriter.java

License:Apache License

@Override
public void writeLambda(LambdaExpression expression) {
    ClassNode functionalInterfaceType = getFunctionalInterfaceType(expression);
    if (null == functionalInterfaceType) {
        // if the parameter type failed to be inferred, generate the default bytecode, which is actually a closure
        super.writeLambda(expression);
        return;/*from  ww  w.ja  v  a 2  s.  c  o  m*/
    }

    ClassNode redirect = functionalInterfaceType.redirect();
    if (!ClassHelper.isFunctionalInterface(redirect)) {
        // if the parameter type is not real FunctionalInterface, generate the default bytecode, which is actually a closure
        super.writeLambda(expression);
        return;
    }

    boolean implementsSerializable = functionalInterfaceType.implementsInterface(SERIALIZABLE_TYPE);
    expression.setSerializable(expression.isSerializable() || implementsSerializable);

    MethodNode abstractMethodNode = ClassHelper.findSAM(redirect);
    String abstractMethodDesc = createMethodDescriptor(abstractMethodNode);

    ClassNode classNode = controller.getClassNode();

    boolean isInterface = classNode.isInterface();
    ClassNode lambdaWrapperClassNode = getOrAddLambdaClass(expression,
            ACC_PUBLIC | ACC_FINAL | (isInterface ? ACC_STATIC : 0) | ACC_SYNTHETIC, abstractMethodNode);
    MethodNode syntheticLambdaMethodNode = lambdaWrapperClassNode.getMethods(DO_CALL).get(0);

    boolean canDeserialize = classNode.hasMethod(createDeserializeLambdaMethodName(lambdaWrapperClassNode),
            createDeserializeLambdaMethodParams());

    if (!canDeserialize) {
        if (expression.isSerializable()) {
            addDeserializeLambdaMethodForEachLambdaExpression(expression, lambdaWrapperClassNode);
            addDeserializeLambdaMethod();
        }

        boolean accessingInstanceMembers = isAccessingInstanceMembersOfEnclosingClass(
                syntheticLambdaMethodNode);
        newGroovyLambdaWrapperAndLoad(lambdaWrapperClassNode, expression, accessingInstanceMembers);
    }

    MethodVisitor mv = controller.getMethodVisitor();
    OperandStack operandStack = controller.getOperandStack();

    mv.visitInvokeDynamicInsn(abstractMethodNode.getName(),
            createAbstractMethodDesc(functionalInterfaceType, lambdaWrapperClassNode),
            createBootstrapMethod(isInterface, expression.isSerializable()),
            createBootstrapMethodArguments(abstractMethodDesc, H_INVOKEVIRTUAL, lambdaWrapperClassNode,
                    syntheticLambdaMethodNode, expression.isSerializable()));

    if (expression.isSerializable()) {
        mv.visitTypeInsn(CHECKCAST, "java/io/Serializable");
    }

    operandStack.replace(redirect, 1);
}

From source file:org.codehaus.groovy.classgen.asm.sc.StaticTypesMethodReferenceExpressionWriter.java

License:Apache License

@Override
public void writeMethodReferenceExpression(MethodReferenceExpression methodReferenceExpression) {
    ClassNode functionalInterfaceType = getFunctionalInterfaceType(methodReferenceExpression);
    if (null == functionalInterfaceType) {
        // if the parameter type failed to be inferred, generate the default bytecode, which is actually a method closure
        super.writeMethodReferenceExpression(methodReferenceExpression);
        return;//from   www  .  ja  v  a2 s  . com
    }

    ClassNode redirect = functionalInterfaceType.redirect();
    if (!ClassHelper.isFunctionalInterface(redirect)) {
        // if the parameter type is not real FunctionalInterface, generate the default bytecode, which is actually a method closure
        super.writeMethodReferenceExpression(methodReferenceExpression);
        return;
    }

    MethodNode abstractMethodNode = ClassHelper.findSAM(redirect);

    String abstractMethodDesc = createMethodDescriptor(abstractMethodNode);

    ClassNode classNode = controller.getClassNode();
    boolean isInterface = classNode.isInterface();

    Expression typeOrTargetRef = methodReferenceExpression.getExpression();
    ClassNode typeOrTargetRefType = typeOrTargetRef.getType();
    String methodRefName = methodReferenceExpression.getMethodName().getText();

    ClassNode[] methodReferenceParamTypes = methodReferenceExpression.getNodeMetaData(CLOSURE_ARGUMENTS);
    Parameter[] parametersWithExactType = createParametersWithExactType(abstractMethodNode,
            methodReferenceParamTypes);

    boolean isConstructorReference = isConstructorReference(methodRefName);

    MethodNode methodRefMethod;
    if (isConstructorReference) {
        methodRefName = genSyntheticMethodNameForConstructorReference();
        methodRefMethod = addSyntheticMethodForConstructorReference(methodRefName, typeOrTargetRefType,
                parametersWithExactType);
    } else {
        // TODO move the `findMethodRefMethod` and checking to `StaticTypeCheckingVisitor`
        methodRefMethod = findMethodRefMethod(methodRefName, parametersWithExactType, typeOrTargetRef);
    }

    validate(methodReferenceExpression, typeOrTargetRef, typeOrTargetRefType, methodRefName,
            parametersWithExactType, methodRefMethod);

    if (isExtensionMethod(methodRefMethod)) {
        ExtensionMethodNode extensionMethodNode = (ExtensionMethodNode) methodRefMethod;
        methodRefMethod = extensionMethodNode.getExtensionMethodNode();
        if (extensionMethodNode.isStaticExtension()) {
            methodRefMethod = addSyntheticMethodForDGSM(methodRefMethod);
        }

        ClassExpression classExpression = new ClassExpression(methodRefMethod.getDeclaringClass());
        classExpression.setSourcePosition(typeOrTargetRef);
        typeOrTargetRef = classExpression;
        typeOrTargetRefType = typeOrTargetRef.getType();
    }

    methodRefMethod.putNodeMetaData(ORIGINAL_PARAMETERS_WITH_EXACT_TYPE, parametersWithExactType);
    MethodVisitor mv = controller.getMethodVisitor();

    boolean isClassExpr = isClassExpr(typeOrTargetRef);
    if (!isClassExpr) {
        if (isConstructorReference) {
            // TODO move the checking code to the Parrot parser
            addFatalError("Constructor reference must be className::new", methodReferenceExpression);
        }

        if (methodRefMethod.isStatic()) {
            ClassExpression classExpression = new ClassExpression(typeOrTargetRefType);
            classExpression.setSourcePosition(typeOrTargetRef);
            typeOrTargetRef = classExpression;
            isClassExpr = true;
        }

        if (!isClassExpr) {
            typeOrTargetRef.visit(controller.getAcg());
        }
    }

    mv.visitInvokeDynamicInsn(abstractMethodNode.getName(),
            createAbstractMethodDesc(functionalInterfaceType, typeOrTargetRef),
            createBootstrapMethod(isInterface, false),
            createBootstrapMethodArguments(abstractMethodDesc,
                    methodRefMethod.isStatic() || isConstructorReference ? Opcodes.H_INVOKESTATIC
                            : Opcodes.H_INVOKEVIRTUAL,
                    isConstructorReference ? controller.getClassNode() : typeOrTargetRefType, methodRefMethod,
                    false));

    if (isClassExpr) {
        controller.getOperandStack().push(redirect);
    } else {
        controller.getOperandStack().replace(redirect, 1);
    }
}