aboutsummaryrefslogtreecommitdiff
path: root/src/share/classes/java/lang/invoke/MethodHandle.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/share/classes/java/lang/invoke/MethodHandle.java')
-rw-r--r--src/share/classes/java/lang/invoke/MethodHandle.java39
1 files changed, 30 insertions, 9 deletions
diff --git a/src/share/classes/java/lang/invoke/MethodHandle.java b/src/share/classes/java/lang/invoke/MethodHandle.java
index f4c191f9e6..f0169e73df 100644
--- a/src/share/classes/java/lang/invoke/MethodHandle.java
+++ b/src/share/classes/java/lang/invoke/MethodHandle.java
@@ -864,9 +864,18 @@ assertEquals("[A, B, C]", (String) caToString2.invokeExact('A', "BC".toCharArray
* @see #asCollector
*/
public MethodHandle asSpreader(Class<?> arrayType, int arrayLength) {
- asSpreaderChecks(arrayType, arrayLength);
- int spreadArgPos = type.parameterCount() - arrayLength;
- return MethodHandleImpl.makeSpreadArguments(this, arrayType, spreadArgPos, arrayLength);
+ MethodType postSpreadType = asSpreaderChecks(arrayType, arrayLength);
+ int arity = type().parameterCount();
+ int spreadArgPos = arity - arrayLength;
+ if (USE_LAMBDA_FORM_EDITOR) {
+ MethodHandle afterSpread = this.asType(postSpreadType);
+ BoundMethodHandle mh = afterSpread.rebind();
+ LambdaForm lform = mh.editor().spreadArgumentsForm(1 + spreadArgPos, arrayType, arrayLength);
+ MethodType preSpreadType = postSpreadType.replaceParameterTypes(spreadArgPos, arity, arrayType);
+ return mh.copyWith(preSpreadType, lform);
+ } else {
+ return MethodHandleImpl.makeSpreadArguments(this, arrayType, spreadArgPos, arrayLength);
+ }
}
/**
@@ -986,12 +995,24 @@ assertEquals("[123]", (String) longsToString.invokeExact((long)123));
*/
public MethodHandle asCollector(Class<?> arrayType, int arrayLength) {
asCollectorChecks(arrayType, arrayLength);
- int collectArgPos = type().parameterCount()-1;
- MethodHandle target = this;
- if (arrayType != type().parameterType(collectArgPos))
- target = MethodHandleImpl.makePairwiseConvert(this, type().changeParameterType(collectArgPos, arrayType), true);
- MethodHandle collector = MethodHandleImpl.varargsArray(arrayType, arrayLength);
- return MethodHandles.collectArguments(target, collectArgPos, collector);
+ int collectArgPos = type().parameterCount() - 1;
+ if (USE_LAMBDA_FORM_EDITOR) {
+ BoundMethodHandle mh = rebind();
+ MethodType resultType = type().asCollectorType(arrayType, arrayLength);
+ MethodHandle newArray = MethodHandleImpl.varargsArray(arrayType, arrayLength);
+ LambdaForm lform = mh.editor().collectArgumentArrayForm(1 + collectArgPos, newArray);
+ if (lform != null) {
+ return mh.copyWith(resultType, lform);
+ }
+ lform = mh.editor().collectArgumentsForm(1 + collectArgPos, newArray.type().basicType());
+ return mh.copyWithExtendL(resultType, lform, newArray);
+ } else {
+ MethodHandle target = this;
+ if (arrayType != type().parameterType(collectArgPos))
+ target = MethodHandleImpl.makePairwiseConvert(this, type().changeParameterType(collectArgPos, arrayType), true);
+ MethodHandle collector = MethodHandleImpl.varargsArray(arrayType, arrayLength);
+ return MethodHandles.collectArguments(target, collectArgPos, collector);
+ }
}
/**