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 Mon Jul 14 19:53:29 2014
--- new/src/share/classes/java/lang/invoke/MethodHandleImpl.java Mon Jul 14 19:53:29 2014
*** 349,381 ****
--- 349,387 ----
MethodType type = target.type();
int last = type.parameterCount() - 1;
if (type.parameterType(last) != arrayType)
target = target.asType(type.changeParameterType(last, arrayType));
target = target.asFixedArity(); // make sure this attribute is turned off
- return new AsVarargsCollector(target, target.type(), arrayType);
}
! static class AsVarargsCollector extends MethodHandle {
! private static final class AsVarargsCollector extends DelegatingMethodHandle {
private final MethodHandle target;
private final Class<?> arrayType;
private /*@Stable*/ MethodHandle asCollectorCache;
- AsVarargsCollector(MethodHandle target, MethodType type, Class<?> arrayType) {
! super(type, reinvokerForm(target));
! this(target.type(), target, arrayType);
+ }
+ AsVarargsCollector(MethodType type, MethodHandle target, Class<?> arrayType) {
+ super(type, target);
this.target = target;
this.arrayType = arrayType;
this.asCollectorCache = target.asCollector(arrayType, 0);
}
@Override MethodHandle reinvokerTarget() { return target; }
@Override
public boolean isVarargsCollector() {
return true;
}
@Override
+ protected MethodHandle getTarget() {
+ return target;
+ }
+
+ @Override
public MethodHandle asFixedArity() {
return target;
}
@Override
*** 414,449 ****
--- 420,429 ----
.isAssignableFrom(
newType.lastParameterType().getComponentType()))
: Arrays.asList(this, newType);
return true;
}
@Override
MethodHandle setVarargs(MemberName member) {
if (member.isVarargs()) return this;
return asFixedArity();
}
@Override
MemberName internalMemberName() {
return asFixedArity().internalMemberName();
}
@Override
Class<?> internalCallerClass() {
return asFixedArity().internalCallerClass();
}
/*non-public*/
@Override
boolean isInvokeSpecial() {
return asFixedArity().isInvokeSpecial();
}
@Override
MethodHandle copyWith(MethodType mt, LambdaForm lf) {
throw newIllegalArgumentException("do not use this");
}
}
/** Factory method: Spread selected argument. */
static MethodHandle makeSpreadArguments(MethodHandle target,
Class<?> spreadArgType, int spreadArgPos, int spreadArgCount) {
*** 970,1006 ****
--- 950,976 ----
}
}
/** This subclass allows a wrapped method handle to be re-associated with an arbitrary member name. */
! static class WrappedMember extends MethodHandle {
! private static final class WrappedMember extends DelegatingMethodHandle {
private final MethodHandle target;
private final MemberName member;
private final Class<?> callerClass;
private final boolean isInvokeSpecial;
private WrappedMember(MethodHandle target, MethodType type,
MemberName member, boolean isInvokeSpecial,
Class<?> callerClass) {
! super(type, reinvokerForm(target));
this.target = target;
this.member = member;
this.callerClass = callerClass;
this.isInvokeSpecial = isInvokeSpecial;
}
@Override
MethodHandle reinvokerTarget() {
return target;
}
@Override
public MethodHandle asTypeUncached(MethodType newType) {
// This MH is an alias for target, except for the MemberName
// Drop the MemberName if there is any conversion.
return asTypeCache = target.asType(newType);
}
@Override
MemberName internalMemberName() {
return member;
}
@Override
Class<?> internalCallerClass() {
*** 1008,1021 ****
--- 978,996 ----
}
@Override
boolean isInvokeSpecial() {
return isInvokeSpecial;
}
@Override
! MethodHandle copyWith(MethodType mt, LambdaForm lf) {
! throw newIllegalArgumentException("do not use this");
! protected MethodHandle getTarget() {
! return target;
+ }
+ @Override
+ public MethodHandle asTypeUncached(MethodType newType) {
+ // This MH is an alias for target, except for the MemberName
+ // Drop the MemberName if there is any conversion.
+ return asTypeCache = target.asType(newType);
}
}
static MethodHandle makeWrappedMember(MethodHandle target, MemberName member, boolean isInvokeSpecial) {
if (member.equals(target.internalMemberName()) && isInvokeSpecial == target.isInvokeSpecial())
src/share/classes/java/lang/invoke/MethodHandleImpl.java
Index
Unified diffs
Context diffs
Sdiffs
Patch
New
Old
Previous File
Next File