--- old/src/share/classes/java/lang/invoke/MethodHandleImpl.java 2014-07-14 19:55:44.000000000 +0400 +++ new/src/share/classes/java/lang/invoke/MethodHandleImpl.java 2014-07-14 19:55:44.000000000 +0400 @@ -84,7 +84,7 @@ assert((isSetter ? mh.type().parameterType(2) : mh.type().returnType()) == Object.class); assert(isSetter || correctType.parameterType(0).getComponentType() == correctType.returnType()); // safe to view non-strictly, because element type follows from array type - mh = mh.viewAsType(correctType); + mh = mh.viewAsType(correctType, false); } // Atomically update accessor cache. synchronized(cache) { @@ -406,18 +406,21 @@ } @Override - MethodHandle setVarargs(MemberName member) { - if (member.isVarargs()) return this; - return asFixedArity(); + boolean viewAsTypeChecks(MethodType newType, boolean strict) { + super.viewAsTypeChecks(newType, true); + if (strict) return true; + // extra assertion for non-strict checks: + assert (type().lastParameterType().getComponentType() + .isAssignableFrom( + newType.lastParameterType().getComponentType())) + : Arrays.asList(this, newType); + return true; } @Override - MethodHandle viewAsType(MethodType newType) { - if (newType.lastParameterType() != type().lastParameterType()) - throw new InternalError(); - MethodHandle newTarget = asFixedArity().viewAsType(newType); - // put back the varargs bit: - return new AsVarargsCollector(newTarget, newType, arrayType); + MethodHandle setVarargs(MemberName member) { + if (member.isVarargs()) return this; + return asFixedArity(); } @Override @@ -434,6 +437,11 @@ boolean isInvokeSpecial() { return asFixedArity().isInvokeSpecial(); } + + @Override + MethodHandle copyWith(MethodType mt, LambdaForm lf) { + throw newIllegalArgumentException("do not use this"); + } } /** Factory method: Spread selected argument. */ @@ -996,9 +1004,10 @@ boolean isInvokeSpecial() { return target.isInvokeSpecial(); } + @Override - MethodHandle viewAsType(MethodType newType) { - return new WrappedMember(target, newType, member, callerClass); + MethodHandle copyWith(MethodType mt, LambdaForm lf) { + throw newIllegalArgumentException("do not use this"); } }