jdk/src/share/classes/java/lang/invoke/MethodHandleImpl.java
changeset 20495 6586c2f78d57
parent 19804 83170920c07b
child 20527 d241258cfbcb
equal deleted inserted replaced
20494:cf77ae5ff678 20495:6586c2f78d57
   433             Class<?> src = lambdaType.parameterType(i);
   433             Class<?> src = lambdaType.parameterType(i);
   434             if (i == spreadArgPos) {
   434             if (i == spreadArgPos) {
   435                 // Spread the array.
   435                 // Spread the array.
   436                 MethodHandle aload = MethodHandles.arrayElementGetter(spreadArgType);
   436                 MethodHandle aload = MethodHandles.arrayElementGetter(spreadArgType);
   437                 Name array = names[argIndex];
   437                 Name array = names[argIndex];
   438                 names[nameCursor++] = new Name(NF_checkSpreadArgument, array, spreadArgCount);
   438                 names[nameCursor++] = new Name(Lazy.NF_checkSpreadArgument, array, spreadArgCount);
   439                 for (int j = 0; j < spreadArgCount; i++, j++) {
   439                 for (int j = 0; j < spreadArgCount; i++, j++) {
   440                     indexes[i] = nameCursor;
   440                     indexes[i] = nameCursor;
   441                     names[nameCursor++] = new Name(aload, array, j);
   441                     names[nameCursor++] = new Name(aload, array, j);
   442                 }
   442                 }
   443             } else if (i < indexes.length) {
   443             } else if (i < indexes.length) {
   478         if (RAISE_RANDOM_EXCEPTIONS)
   478         if (RAISE_RANDOM_EXCEPTIONS)
   479             throw newIllegalArgumentException("Array is not of length "+n);
   479             throw newIllegalArgumentException("Array is not of length "+n);
   480         throw new WrongMethodTypeException("Array is not of length "+n);
   480         throw new WrongMethodTypeException("Array is not of length "+n);
   481     }
   481     }
   482 
   482 
   483     private static final NamedFunction NF_checkSpreadArgument;
   483     /**
   484     static {
   484      * Pre-initialized NamedFunctions for bootstrapping purposes.
   485         try {
   485      * Factored in an inner class to delay initialization until first usage.
   486             NF_checkSpreadArgument = new NamedFunction(MethodHandleImpl.class
   486      */
   487                     .getDeclaredMethod("checkSpreadArgument", Object.class, int.class));
   487     private static class Lazy {
   488             NF_checkSpreadArgument.resolve();
   488         static final NamedFunction NF_checkSpreadArgument;
   489         } catch (ReflectiveOperationException ex) {
   489         static {
   490             throw newInternalError(ex);
   490             try {
       
   491                 NF_checkSpreadArgument = new NamedFunction(MethodHandleImpl.class
       
   492                         .getDeclaredMethod("checkSpreadArgument", Object.class, int.class));
       
   493                 NF_checkSpreadArgument.resolve();
       
   494             } catch (ReflectiveOperationException ex) {
       
   495                 throw newInternalError(ex);
       
   496             }
   491         }
   497         }
   492     }
   498     }
   493 
   499 
   494     /** Factory method:  Collect or filter selected argument(s). */
   500     /** Factory method:  Collect or filter selected argument(s). */
   495     static MethodHandle makeCollectArguments(MethodHandle target,
   501     static MethodHandle makeCollectArguments(MethodHandle target,