List of usage examples for org.objectweb.asm MethodVisitor visitInvokeDynamicInsn
public void visitInvokeDynamicInsn(final String name, final String descriptor, final Handle bootstrapMethodHandle, final Object... bootstrapMethodArguments)
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); } }