Skip to content

Commit c850ecb

Browse files
wenshaoliach
andcommitted
8341755: Optimize argNames in InnerClassLambdaMetafactory
Co-authored-by: Chen Liang <liach@openjdk.org> Reviewed-by: liach, redestad
1 parent 172f744 commit c850ecb

File tree

1 file changed

+18
-16
lines changed

1 file changed

+18
-16
lines changed

src/java.base/share/classes/java/lang/invoke/InnerClassLambdaMetafactory.java

Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -34,12 +34,10 @@
3434
import java.lang.classfile.ClassBuilder;
3535
import java.lang.classfile.ClassFile;
3636
import java.lang.classfile.CodeBuilder;
37-
import java.lang.classfile.FieldBuilder;
3837
import java.lang.classfile.MethodBuilder;
3938
import java.lang.classfile.Opcode;
4039
import java.lang.classfile.TypeKind;
4140
import java.lang.constant.ClassDesc;
42-
import java.lang.constant.DynamicConstantDesc;
4341
import java.lang.constant.MethodTypeDesc;
4442
import java.lang.reflect.Modifier;
4543
import java.util.LinkedHashSet;
@@ -51,16 +49,15 @@
5149
import java.lang.classfile.attribute.ExceptionsAttribute;
5250
import java.lang.classfile.constantpool.ClassEntry;
5351
import java.lang.classfile.constantpool.ConstantPoolBuilder;
54-
import java.lang.classfile.constantpool.MethodRefEntry;
52+
5553
import static java.lang.constant.ConstantDescs.*;
5654
import static java.lang.invoke.MethodHandleNatives.Constants.NESTMATE_CLASS;
5755
import static java.lang.invoke.MethodHandleNatives.Constants.STRONG_LOADER_LINK;
58-
import static java.lang.invoke.MethodHandles.Lookup.ClassOption.NESTMATE;
59-
import static java.lang.invoke.MethodHandles.Lookup.ClassOption.STRONG;
6056
import static java.lang.invoke.MethodType.methodType;
6157
import jdk.internal.constant.ConstantUtils;
6258
import jdk.internal.constant.MethodTypeDescImpl;
6359
import jdk.internal.constant.ReferenceClassDescImpl;
60+
import jdk.internal.vm.annotation.Stable;
6461
import sun.invoke.util.Wrapper;
6562

6663
/**
@@ -71,7 +68,7 @@
7168
*/
7269
/* package */ final class InnerClassLambdaMetafactory extends AbstractValidatingLambdaMetafactory {
7370
private static final String LAMBDA_INSTANCE_FIELD = "LAMBDA_INSTANCE$";
74-
private static final String[] EMPTY_STRING_ARRAY = new String[0];
71+
private static final @Stable String[] ARG_NAME_CACHE = {"arg$1", "arg$2", "arg$3", "arg$4", "arg$5", "arg$6", "arg$7", "arg$8"};
7572
private static final ClassDesc[] EMPTY_CLASSDESC_ARRAY = ConstantUtils.EMPTY_CLASSDESC;
7673

7774
// For dumping generated classes to disk, for debugging purposes
@@ -96,7 +93,6 @@
9693
private final MethodTypeDesc implMethodDesc; // Type descriptor for implementation methods "(I)Ljava/lang/String;"
9794
private final MethodType constructorType; // Generated class constructor type "(CC)void"
9895
private final MethodTypeDesc constructorTypeDesc;// Type descriptor for the generated class constructor type "(CC)void"
99-
private final String[] argNames; // Generated names for the constructor arguments
10096
private final ClassDesc[] argDescs; // Type descriptors for the constructor arguments
10197
private final String lambdaClassName; // Generated name for the generated class "X$$Lambda$1"
10298
private final ConstantPoolBuilder pool = ConstantPoolBuilder.of();
@@ -174,18 +170,24 @@ public InnerClassLambdaMetafactory(MethodHandles.Lookup caller,
174170
implKind == MethodHandleInfo.REF_invokeSpecial ||
175171
implKind == MethodHandleInfo.REF_invokeStatic && implClass.isHidden();
176172
int parameterCount = factoryType.parameterCount();
173+
ClassDesc[] argDescs;
174+
MethodTypeDesc constructorTypeDesc;
177175
if (parameterCount > 0) {
178-
argNames = new String[parameterCount];
179176
argDescs = new ClassDesc[parameterCount];
180177
for (int i = 0; i < parameterCount; i++) {
181-
argNames[i] = "arg$" + (i + 1);
182178
argDescs[i] = classDesc(factoryType.parameterType(i));
183179
}
180+
constructorTypeDesc = MethodTypeDescImpl.ofValidated(CD_void, argDescs);
184181
} else {
185-
argNames = EMPTY_STRING_ARRAY;
186182
argDescs = EMPTY_CLASSDESC_ARRAY;
183+
constructorTypeDesc = MTD_void;
187184
}
188-
constructorTypeDesc = MethodTypeDescImpl.ofValidated(CD_void, argDescs);
185+
this.argDescs = argDescs;
186+
this.constructorTypeDesc = constructorTypeDesc;
187+
}
188+
189+
private static String argName(int i) {
190+
return i < ARG_NAME_CACHE.length ? ARG_NAME_CACHE[i] : "arg$" + (i + 1);
189191
}
190192

191193
private static String lambdaClassName(Class<?> targetClass) {
@@ -313,7 +315,7 @@ public void accept(ClassBuilder clb) {
313315
.withInterfaceSymbols(interfaces);
314316
// Generate final fields to be filled in by constructor
315317
for (int i = 0; i < argDescs.length; i++) {
316-
clb.withField(argNames[i], argDescs[i], ACC_PRIVATE | ACC_FINAL);
318+
clb.withField(argName(i), argDescs[i], ACC_PRIVATE | ACC_FINAL);
317319
}
318320

319321
generateConstructor(clb);
@@ -396,7 +398,7 @@ public void accept(CodeBuilder cob) {
396398
for (int i = 0; i < parameterCount; i++) {
397399
cob.aload(0)
398400
.loadLocal(TypeKind.from(factoryType.parameterType(i)), cob.parameterSlot(i))
399-
.putfield(pool.fieldRefEntry(lambdaClassEntry, pool.nameAndTypeEntry(argNames[i], argDescs[i])));
401+
.putfield(pool.fieldRefEntry(lambdaClassEntry, pool.nameAndTypeEntry(argName(i), argDescs[i])));
400402
}
401403
cob.return_();
402404
}
@@ -448,7 +450,7 @@ public void accept(CodeBuilder cob) {
448450
cob.dup()
449451
.loadConstant(i)
450452
.aload(0)
451-
.getfield(pool.fieldRefEntry(lambdaClassEntry, pool.nameAndTypeEntry(argNames[i], argDescs[i])));
453+
.getfield(pool.fieldRefEntry(lambdaClassEntry, pool.nameAndTypeEntry(argName(i), argDescs[i])));
452454
TypeConvertingMethodAdapter.boxIfTypePrimitive(cob, TypeKind.from(argDescs[i]));
453455
cob.aastore();
454456
}
@@ -505,9 +507,9 @@ public void accept(CodeBuilder cob) {
505507
cob.ldc(cp.constantDynamicEntry(cp.bsmEntry(cp.methodHandleEntry(BSM_CLASS_DATA), List.of()),
506508
cp.nameAndTypeEntry(DEFAULT_NAME, CD_MethodHandle)));
507509
}
508-
for (int i = 0; i < argNames.length; i++) {
510+
for (int i = 0; i < argDescs.length; i++) {
509511
cob.aload(0)
510-
.getfield(pool.fieldRefEntry(lambdaClassEntry, pool.nameAndTypeEntry(argNames[i], argDescs[i])));
512+
.getfield(pool.fieldRefEntry(lambdaClassEntry, pool.nameAndTypeEntry(argName(i), argDescs[i])));
511513
}
512514

513515
convertArgumentTypes(cob, methodType);

0 commit comments

Comments
 (0)