src/java.base/share/classes/java/lang/invoke/MethodHandle.java
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File
*** old/src/java.base/share/classes/java/lang/invoke/MethodHandle.java	Fri Sep  5 17:34:39 2014
--- new/src/java.base/share/classes/java/lang/invoke/MethodHandle.java	Fri Sep  5 17:34:39 2014

*** 867,899 **** --- 867,904 ---- asSpreaderChecks(arrayType, arrayLength); int spreadArgPos = type.parameterCount() - arrayLength; return MethodHandleImpl.makeSpreadArguments(this, arrayType, spreadArgPos, arrayLength); } private void asSpreaderChecks(Class<?> arrayType, int arrayLength) { + /** + * See if {@code asSpreader} can be validly called with the given arguments. + * Return the type of the method handle call after spreading but before conversions. + */ + private MethodType asSpreaderChecks(Class<?> arrayType, int arrayLength) { spreadArrayChecks(arrayType, arrayLength); int nargs = type().parameterCount(); if (nargs < arrayLength || arrayLength < 0) throw newIllegalArgumentException("bad spread array length"); if (arrayType != Object[].class && arrayLength != 0) { boolean sawProblem = false; Class<?> arrayElement = arrayType.getComponentType(); + MethodType mtype = type(); + boolean match = true, fail = false; for (int i = nargs - arrayLength; i < nargs; i++) { if (!MethodType.canConvert(arrayElement, type().parameterType(i))) { sawProblem = true; + Class<?> ptype = mtype.parameterType(i); + if (ptype != arrayElement) { + match = false; + if (!MethodType.canConvert(arrayElement, ptype)) { + fail = true; break; } } if (sawProblem) { ArrayList<Class<?>> ptypes = new ArrayList<>(type().parameterList()); for (int i = nargs - arrayLength; i < nargs; i++) { ptypes.set(i, arrayElement); } + if (match) return mtype; + MethodType needType = mtype.asSpreaderType(arrayType, arrayLength); + if (!fail) return needType; // elicit an error: ! this.asType(MethodType.methodType(type().returnType(), ptypes)); } } ! this.asType(needType); + throw newInternalError("should not return", null); } private void spreadArrayChecks(Class<?> arrayType, int arrayLength) { Class<?> arrayElement = arrayType.getComponentType(); if (arrayElement == null)

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