mirror of
https://github.com/openjdk/jdk.git
synced 2025-08-27 06:45:07 +02:00
8264288: Performance issue with MethodHandle.asCollector
Reviewed-by: jrose, vlivanov
This commit is contained in:
parent
920189918e
commit
b7baca7f32
10 changed files with 197 additions and 358 deletions
|
@ -869,13 +869,6 @@ class InvokerBytecodeGenerator {
|
|||
onStack = emitLoop(i);
|
||||
i += 2; // jump to the end of the LOOP idiom
|
||||
continue;
|
||||
case NEW_ARRAY:
|
||||
Class<?> rtype = name.function.methodType().returnType();
|
||||
if (isStaticallyNameable(rtype)) {
|
||||
emitNewArray(name);
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
case ARRAY_LOAD:
|
||||
emitArrayLoad(name);
|
||||
continue;
|
||||
|
@ -1112,43 +1105,6 @@ class InvokerBytecodeGenerator {
|
|||
}
|
||||
}
|
||||
|
||||
void emitNewArray(Name name) throws InternalError {
|
||||
Class<?> rtype = name.function.methodType().returnType();
|
||||
if (name.arguments.length == 0) {
|
||||
// The array will be a constant.
|
||||
Object emptyArray;
|
||||
try {
|
||||
emptyArray = name.function.resolvedHandle().invoke();
|
||||
} catch (Throwable ex) {
|
||||
throw uncaughtException(ex);
|
||||
}
|
||||
assert(java.lang.reflect.Array.getLength(emptyArray) == 0);
|
||||
assert(emptyArray.getClass() == rtype); // exact typing
|
||||
mv.visitFieldInsn(Opcodes.GETSTATIC, className, classData(emptyArray), "Ljava/lang/Object;");
|
||||
emitReferenceCast(rtype, emptyArray);
|
||||
return;
|
||||
}
|
||||
Class<?> arrayElementType = rtype.getComponentType();
|
||||
assert(arrayElementType != null);
|
||||
emitIconstInsn(name.arguments.length);
|
||||
int xas = Opcodes.AASTORE;
|
||||
if (!arrayElementType.isPrimitive()) {
|
||||
mv.visitTypeInsn(Opcodes.ANEWARRAY, getInternalName(arrayElementType));
|
||||
} else {
|
||||
byte tc = arrayTypeCode(Wrapper.forPrimitiveType(arrayElementType));
|
||||
xas = arrayInsnOpcode(tc, xas);
|
||||
mv.visitIntInsn(Opcodes.NEWARRAY, tc);
|
||||
}
|
||||
// store arguments
|
||||
for (int i = 0; i < name.arguments.length; i++) {
|
||||
mv.visitInsn(Opcodes.DUP);
|
||||
emitIconstInsn(i);
|
||||
emitPushArgument(name, i);
|
||||
mv.visitInsn(xas);
|
||||
}
|
||||
// the array is left on the stack
|
||||
assertStaticType(rtype, name);
|
||||
}
|
||||
int refKindOpcode(byte refKind) {
|
||||
switch (refKind) {
|
||||
case REF_invokeVirtual: return Opcodes.INVOKEVIRTUAL;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue