< prev index next >

src/java.base/share/classes/java/lang/invoke/LambdaMetafactory.java

Print this page
*** 24,13 ***
--- 24,15 ---
   */
  
  package java.lang.invoke;
  
  import java.io.Serializable;
+ import java.lang.classfile.ClassBuilder;
  import java.util.Arrays;
  import java.lang.reflect.Array;
  import java.util.Objects;
+ import java.util.function.Function;
  
  import jdk.internal.vm.annotation.AOTSafeClassInitializer;
  
  /**
   * <p>Methods to facilitate the creation of simple "function objects" that

*** 341,20 ***
                                         MethodType factoryType,
                                         MethodType interfaceMethodType,
                                         MethodHandle implementation,
                                         MethodType dynamicMethodType)
              throws LambdaConversionException {
!         AbstractValidatingLambdaMetafactory mf;
!         mf = new InnerClassLambdaMetafactory(Objects.requireNonNull(caller),
!                                              Objects.requireNonNull(factoryType),
!                                              Objects.requireNonNull(interfaceMethodName),
!                                              Objects.requireNonNull(interfaceMethodType),
!                                              Objects.requireNonNull(implementation),
!                                              Objects.requireNonNull(dynamicMethodType),
!                                              false,
!                                              EMPTY_CLASS_ARRAY,
!                                              EMPTY_MT_ARRAY);
          mf.validateMetafactoryArgs();
          return mf.buildCallSite();
      }
  
      /**
--- 343,33 ---
                                         MethodType factoryType,
                                         MethodType interfaceMethodType,
                                         MethodHandle implementation,
                                         MethodType dynamicMethodType)
              throws LambdaConversionException {
!         return metafactoryInternal(caller, interfaceMethodName, factoryType, interfaceMethodType,
!                 implementation, dynamicMethodType, null);
!     }
! 
!     static CallSite metafactoryInternal(MethodHandles.Lookup caller,
!                                         String interfaceMethodName,
!                                         MethodType factoryType,
!                                         MethodType interfaceMethodType,
!                                         MethodHandle implementation,
!                                         MethodType dynamicMethodType,
+                                         Function<ClassBuilder, Object> finisher)
+             throws LambdaConversionException {
+         AbstractValidatingLambdaMetafactory mf = new InnerClassLambdaMetafactory(
+                 Objects.requireNonNull(caller),
+                 Objects.requireNonNull(factoryType),
+                 Objects.requireNonNull(interfaceMethodName),
+                 Objects.requireNonNull(interfaceMethodType),
+                 Objects.requireNonNull(implementation),
+                 Objects.requireNonNull(dynamicMethodType),
+                 false,
+                 EMPTY_CLASS_ARRAY,
+                 EMPTY_MT_ARRAY,
+                 finisher);
          mf.validateMetafactoryArgs();
          return mf.buildCallSite();
      }
  
      /**

*** 487,10 ***
--- 502,19 ---
      public static CallSite altMetafactory(MethodHandles.Lookup caller,
                                            String interfaceMethodName,
                                            MethodType factoryType,
                                            Object... args)
              throws LambdaConversionException {
+         return altMetafactoryInternal(caller, interfaceMethodName, factoryType, null, args);
+     }
+ 
+     static CallSite altMetafactoryInternal(MethodHandles.Lookup caller,
+                                            String interfaceMethodName,
+                                            MethodType factoryType,
+                                            Function<ClassBuilder, Object> finisher,
+                                            Object... args)
+             throws LambdaConversionException {
          Objects.requireNonNull(caller);
          Objects.requireNonNull(interfaceMethodName);
          Objects.requireNonNull(factoryType);
          Objects.requireNonNull(args);
          int argIndex = 0;

*** 542,11 ***
                                                    interfaceMethodType,
                                                    implementation,
                                                    dynamicMethodType,
                                                    isSerializable,
                                                    altInterfaces,
!                                                   altMethods);
          mf.validateMetafactoryArgs();
          return mf.buildCallSite();
      }
  
      private static <T> T extractArg(Object[] args, int index, Class<T> type) {
--- 566,12 ---
                                                    interfaceMethodType,
                                                    implementation,
                                                    dynamicMethodType,
                                                    isSerializable,
                                                    altInterfaces,
!                                                   altMethods,
+                                                   finisher);
          mf.validateMetafactoryArgs();
          return mf.buildCallSite();
      }
  
      private static <T> T extractArg(Object[] args, int index, Class<T> type) {
< prev index next >