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, |