src/share/classes/java/lang/invoke/MethodHandleImpl.java
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File
*** old/src/share/classes/java/lang/invoke/MethodHandleImpl.java	Wed Sep 11 15:00:33 2013
--- new/src/share/classes/java/lang/invoke/MethodHandleImpl.java	Wed Sep 11 15:00:33 2013

*** 433,443 **** --- 433,443 ---- Class<?> src = lambdaType.parameterType(i); if (i == spreadArgPos) { // Spread the array. MethodHandle aload = MethodHandles.arrayElementGetter(spreadArgType); Name array = names[argIndex]; ! names[nameCursor++] = new Name(NF_checkSpreadArgument, array, spreadArgCount); ! names[nameCursor++] = new Name(NF.checkSpreadArgument, array, spreadArgCount); for (int j = 0; j < spreadArgCount; i++, j++) { indexes[i] = nameCursor; names[nameCursor++] = new Name(aload, array, j); } } else if (i < indexes.length) {
*** 478,497 **** --- 478,503 ---- if (RAISE_RANDOM_EXCEPTIONS) throw newIllegalArgumentException("Array is not of length "+n); throw new WrongMethodTypeException("Array is not of length "+n); } private static final NamedFunction NF_checkSpreadArgument; + /** + * Pre-initialized NamedFunctions for bootstrapping purposes. + * Factored in an inner class to delay initialization until first usage. + */ + private static class NF { + static final NamedFunction checkSpreadArgument; static { try { ! NF_checkSpreadArgument = new NamedFunction(MethodHandleImpl.class ! checkSpreadArgument = new NamedFunction(MethodHandleImpl.class .getDeclaredMethod("checkSpreadArgument", Object.class, int.class)); ! NF_checkSpreadArgument.resolve(); ! checkSpreadArgument.resolve(); } catch (ReflectiveOperationException ex) { throw newInternalError(ex); } } + } /** Factory method: Collect or filter selected argument(s). */ static MethodHandle makeCollectArguments(MethodHandle target, MethodHandle collector, int collectArgPos, boolean retainOriginalArgs) { MethodType targetType = target.type(); // (a..., c, [b...])=>r

src/share/classes/java/lang/invoke/MethodHandleImpl.java
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File