Skip to content

Commit 0630bb0

Browse files
committed
8331264: Reduce java.lang.constant initialization overhead
Reviewed-by: liach, mchung
1 parent 60b61e5 commit 0630bb0

File tree

7 files changed

+69
-67
lines changed

7 files changed

+69
-67
lines changed

src/java.base/share/classes/java/lang/constant/ClassDesc.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -270,7 +270,7 @@ default ClassDesc nested(String firstNestedName, String... moreNestedNames) {
270270
* @return whether this {@linkplain ClassDesc} describes an array type
271271
*/
272272
default boolean isArray() {
273-
return descriptorString().startsWith("[");
273+
return descriptorString().charAt(0) == '[';
274274
}
275275

276276
/**
@@ -288,7 +288,7 @@ default boolean isPrimitive() {
288288
* @return whether this {@linkplain ClassDesc} describes a class or interface type
289289
*/
290290
default boolean isClassOrInterface() {
291-
return descriptorString().startsWith("L");
291+
return descriptorString().charAt(0) == 'L';
292292
}
293293

294294
/**

src/java.base/share/classes/java/lang/constant/ConstantDescs.java

Lines changed: 43 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -64,125 +64,125 @@ private ConstantDescs() { }
6464
// Don't change the order of these declarations!
6565

6666
/** {@link ClassDesc} representing {@link Object} */
67-
public static final ClassDesc CD_Object = ClassDesc.of("java.lang.Object");
67+
public static final ClassDesc CD_Object = new ReferenceClassDescImpl("Ljava/lang/Object;");
6868

6969
/** {@link ClassDesc} representing {@link String} */
70-
public static final ClassDesc CD_String = ClassDesc.of("java.lang.String");
70+
public static final ClassDesc CD_String = new ReferenceClassDescImpl("Ljava/lang/String;");
7171

7272
/** {@link ClassDesc} representing {@link Class} */
73-
public static final ClassDesc CD_Class = ClassDesc.of("java.lang.Class");
73+
public static final ClassDesc CD_Class = new ReferenceClassDescImpl("Ljava/lang/Class;");
7474

7575
/** {@link ClassDesc} representing {@link Number} */
76-
public static final ClassDesc CD_Number = ClassDesc.of("java.lang.Number");
76+
public static final ClassDesc CD_Number = new ReferenceClassDescImpl("Ljava/lang/Number;");
7777

7878
/** {@link ClassDesc} representing {@link Integer} */
79-
public static final ClassDesc CD_Integer = ClassDesc.of("java.lang.Integer");
79+
public static final ClassDesc CD_Integer = new ReferenceClassDescImpl("Ljava/lang/Integer;");
8080

8181
/** {@link ClassDesc} representing {@link Long} */
82-
public static final ClassDesc CD_Long = ClassDesc.of("java.lang.Long");
82+
public static final ClassDesc CD_Long = new ReferenceClassDescImpl("Ljava/lang/Long;");
8383

8484
/** {@link ClassDesc} representing {@link Float} */
85-
public static final ClassDesc CD_Float = ClassDesc.of("java.lang.Float");
85+
public static final ClassDesc CD_Float = new ReferenceClassDescImpl("Ljava/lang/Float;");
8686

8787
/** {@link ClassDesc} representing {@link Double} */
88-
public static final ClassDesc CD_Double = ClassDesc.of("java.lang.Double");
88+
public static final ClassDesc CD_Double = new ReferenceClassDescImpl("Ljava/lang/Double;");
8989

9090
/** {@link ClassDesc} representing {@link Short} */
91-
public static final ClassDesc CD_Short = ClassDesc.of("java.lang.Short");
91+
public static final ClassDesc CD_Short = new ReferenceClassDescImpl("Ljava/lang/Short;");
9292

9393
/** {@link ClassDesc} representing {@link Byte} */
94-
public static final ClassDesc CD_Byte = ClassDesc.of("java.lang.Byte");
94+
public static final ClassDesc CD_Byte = new ReferenceClassDescImpl("Ljava/lang/Byte;");
9595

9696
/** {@link ClassDesc} representing {@link Character} */
97-
public static final ClassDesc CD_Character = ClassDesc.of("java.lang.Character");
97+
public static final ClassDesc CD_Character = new ReferenceClassDescImpl("Ljava/lang/Character;");
9898

9999
/** {@link ClassDesc} representing {@link Boolean} */
100-
public static final ClassDesc CD_Boolean = ClassDesc.of("java.lang.Boolean");
100+
public static final ClassDesc CD_Boolean = new ReferenceClassDescImpl("Ljava/lang/Boolean;");
101101

102102
/** {@link ClassDesc} representing {@link Void} */
103-
public static final ClassDesc CD_Void = ClassDesc.of("java.lang.Void");
103+
public static final ClassDesc CD_Void = new ReferenceClassDescImpl("Ljava/lang/Void;");
104104

105105
/** {@link ClassDesc} representing {@link Throwable} */
106-
public static final ClassDesc CD_Throwable = ClassDesc.of("java.lang.Throwable");
106+
public static final ClassDesc CD_Throwable = new ReferenceClassDescImpl("Ljava/lang/Throwable;");
107107

108108
/** {@link ClassDesc} representing {@link Exception} */
109-
public static final ClassDesc CD_Exception = ClassDesc.of("java.lang.Exception");
109+
public static final ClassDesc CD_Exception = new ReferenceClassDescImpl("Ljava/lang/Exception;");
110110

111111
/** {@link ClassDesc} representing {@link Enum} */
112-
public static final ClassDesc CD_Enum = ClassDesc.of("java.lang.Enum");
112+
public static final ClassDesc CD_Enum = new ReferenceClassDescImpl("Ljava/lang/Enum;");
113113

114114
/** {@link ClassDesc} representing {@link VarHandle} */
115-
public static final ClassDesc CD_VarHandle = ClassDesc.of("java.lang.invoke.VarHandle");
115+
public static final ClassDesc CD_VarHandle = new ReferenceClassDescImpl("Ljava/lang/invoke/VarHandle;");
116116

117117
/** {@link ClassDesc} representing {@link MethodHandles} */
118-
public static final ClassDesc CD_MethodHandles = ClassDesc.of("java.lang.invoke.MethodHandles");
118+
public static final ClassDesc CD_MethodHandles = new ReferenceClassDescImpl("Ljava/lang/invoke/MethodHandles;");
119119

120120
/** {@link ClassDesc} representing {@link MethodHandles.Lookup} */
121-
public static final ClassDesc CD_MethodHandles_Lookup = CD_MethodHandles.nested("Lookup");
121+
public static final ClassDesc CD_MethodHandles_Lookup = new ReferenceClassDescImpl("Ljava/lang/invoke/MethodHandles$Lookup;");
122122

123123
/** {@link ClassDesc} representing {@link MethodHandle} */
124-
public static final ClassDesc CD_MethodHandle = ClassDesc.of("java.lang.invoke.MethodHandle");
124+
public static final ClassDesc CD_MethodHandle = new ReferenceClassDescImpl("Ljava/lang/invoke/MethodHandle;");
125125

126126
/** {@link ClassDesc} representing {@link MethodType} */
127-
public static final ClassDesc CD_MethodType = ClassDesc.of("java.lang.invoke.MethodType");
127+
public static final ClassDesc CD_MethodType = new ReferenceClassDescImpl("Ljava/lang/invoke/MethodType;");
128128

129129
/** {@link ClassDesc} representing {@link CallSite} */
130-
public static final ClassDesc CD_CallSite = ClassDesc.of("java.lang.invoke.CallSite");
130+
public static final ClassDesc CD_CallSite = new ReferenceClassDescImpl("Ljava/lang/invoke/CallSite;");
131131

132132
/** {@link ClassDesc} representing {@link Collection} */
133-
public static final ClassDesc CD_Collection = ClassDesc.of("java.util.Collection");
133+
public static final ClassDesc CD_Collection = new ReferenceClassDescImpl("Ljava/util/Collection;");
134134

135135
/** {@link ClassDesc} representing {@link List} */
136-
public static final ClassDesc CD_List = ClassDesc.of("java.util.List");
136+
public static final ClassDesc CD_List = new ReferenceClassDescImpl("Ljava/util/List;");
137137

138138
/** {@link ClassDesc} representing {@link Set} */
139-
public static final ClassDesc CD_Set = ClassDesc.of("java.util.Set");
139+
public static final ClassDesc CD_Set = new ReferenceClassDescImpl("Ljava/util/Set;");
140140

141141
/** {@link ClassDesc} representing {@link Map} */
142-
public static final ClassDesc CD_Map = ClassDesc.of("java.util.Map");
142+
public static final ClassDesc CD_Map = new ReferenceClassDescImpl("Ljava/util/Map;");
143143

144144
/** {@link ClassDesc} representing {@link ConstantDesc} */
145-
public static final ClassDesc CD_ConstantDesc = ClassDesc.of("java.lang.constant.ConstantDesc");
145+
public static final ClassDesc CD_ConstantDesc = new ReferenceClassDescImpl("Ljava/lang/constant/ConstantDesc;");
146146

147147
/** {@link ClassDesc} representing {@link ClassDesc} */
148-
public static final ClassDesc CD_ClassDesc = ClassDesc.of("java.lang.constant.ClassDesc");
148+
public static final ClassDesc CD_ClassDesc = new ReferenceClassDescImpl("Ljava/lang/constant/ClassDesc;");
149149

150150
/** {@link ClassDesc} representing {@link EnumDesc} */
151-
public static final ClassDesc CD_EnumDesc = CD_Enum.nested("EnumDesc");
151+
public static final ClassDesc CD_EnumDesc = new ReferenceClassDescImpl("Ljava/lang/Enum$EnumDesc;");
152152

153153
/** {@link ClassDesc} representing {@link MethodTypeDesc} */
154-
public static final ClassDesc CD_MethodTypeDesc = ClassDesc.of("java.lang.constant.MethodTypeDesc");
154+
public static final ClassDesc CD_MethodTypeDesc = new ReferenceClassDescImpl("Ljava/lang/constant/MethodTypeDesc;");
155155

156156
/** {@link ClassDesc} representing {@link MethodHandleDesc} */
157-
public static final ClassDesc CD_MethodHandleDesc = ClassDesc.of("java.lang.constant.MethodHandleDesc");
157+
public static final ClassDesc CD_MethodHandleDesc = new ReferenceClassDescImpl("Ljava/lang/constant/MethodHandleDesc;");
158158

159159
/** {@link ClassDesc} representing {@link DirectMethodHandleDesc} */
160-
public static final ClassDesc CD_DirectMethodHandleDesc = ClassDesc.of("java.lang.constant.DirectMethodHandleDesc");
160+
public static final ClassDesc CD_DirectMethodHandleDesc = new ReferenceClassDescImpl("Ljava/lang/constant/DirectMethodHandleDesc;");
161161

162162
/** {@link ClassDesc} representing {@link VarHandleDesc} */
163-
public static final ClassDesc CD_VarHandleDesc = CD_VarHandle.nested("VarHandleDesc");
163+
public static final ClassDesc CD_VarHandleDesc = new ReferenceClassDescImpl("Ljava/lang/invoke/VarHandle$VarHandleDesc;");
164164

165165
/** {@link ClassDesc} representing {@link DirectMethodHandleDesc.Kind} */
166-
public static final ClassDesc CD_MethodHandleDesc_Kind = CD_DirectMethodHandleDesc.nested("Kind");
166+
public static final ClassDesc CD_MethodHandleDesc_Kind = new ReferenceClassDescImpl("Ljava/lang/constant/DirectMethodHandleDesc$Kind;");
167167

168168
/** {@link ClassDesc} representing {@link DynamicConstantDesc} */
169-
public static final ClassDesc CD_DynamicConstantDesc = ClassDesc.of("java.lang.constant.DynamicConstantDesc");
169+
public static final ClassDesc CD_DynamicConstantDesc = new ReferenceClassDescImpl("Ljava/lang/constant/DynamicConstantDesc;");
170170

171171
/** {@link ClassDesc} representing {@link DynamicCallSiteDesc} */
172-
public static final ClassDesc CD_DynamicCallSiteDesc = ClassDesc.of("java.lang.constant.DynamicCallSiteDesc");
172+
public static final ClassDesc CD_DynamicCallSiteDesc = new ReferenceClassDescImpl("Ljava/lang/constant/DynamicCallSiteDesc;");
173173

174174
/** {@link ClassDesc} representing {@link ConstantBootstraps} */
175-
public static final ClassDesc CD_ConstantBootstraps = ClassDesc.of("java.lang.invoke.ConstantBootstraps");
175+
public static final ClassDesc CD_ConstantBootstraps = new ReferenceClassDescImpl("Ljava/lang/invoke/ConstantBootstraps;");
176176

177177
private static final ClassDesc[] INDY_BOOTSTRAP_ARGS = {
178-
ConstantDescs.CD_MethodHandles_Lookup,
179-
ConstantDescs.CD_String,
180-
ConstantDescs.CD_MethodType};
178+
CD_MethodHandles_Lookup,
179+
CD_String,
180+
CD_MethodType};
181181

182182
private static final ClassDesc[] CONDY_BOOTSTRAP_ARGS = {
183-
ConstantDescs.CD_MethodHandles_Lookup,
184-
ConstantDescs.CD_String,
185-
ConstantDescs.CD_Class};
183+
CD_MethodHandles_Lookup,
184+
CD_String,
185+
CD_Class};
186186

187187
/** {@link MethodHandleDesc} representing {@link ConstantBootstraps#primitiveClass(Lookup, String, Class) ConstantBootstraps.primitiveClass} */
188188
public static final DirectMethodHandleDesc BSM_PRIMITIVE_CLASS

src/java.base/share/classes/java/lang/constant/ConstantUtils.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,6 @@ public static String validateModuleName(String name) {
146146
* @throws IllegalArgumentException if the member name is invalid
147147
*/
148148
public static String validateMemberName(String name, boolean method) {
149-
requireNonNull(name);
150149
if (name.length() == 0)
151150
throw new IllegalArgumentException("zero-length member name");
152151
for (int i=0; i<name.length(); i++) {

src/java.base/share/classes/java/lang/constant/DirectMethodHandleDescImpl.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,8 +67,8 @@ final class DirectMethodHandleDescImpl implements DirectMethodHandleDesc {
6767
name = "<init>";
6868

6969
requireNonNull(kind);
70-
validateClassOrInterface(requireNonNull(owner));
71-
validateMemberName(requireNonNull(name), true);
70+
validateClassOrInterface(owner);
71+
validateMemberName(name, true);
7272
requireNonNull(type);
7373

7474
switch (kind) {

src/java.base/share/classes/java/lang/constant/DynamicConstantDesc.java

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -87,12 +87,9 @@ protected DynamicConstantDesc(DirectMethodHandleDesc bootstrapMethod,
8787
ClassDesc constantType,
8888
ConstantDesc... bootstrapArgs) {
8989
this.bootstrapMethod = requireNonNull(bootstrapMethod);
90-
this.constantName = validateMemberName(requireNonNull(constantName), true);
90+
this.constantName = validateMemberName(constantName, true);
9191
this.constantType = requireNonNull(constantType);
92-
this.bootstrapArgs = requireNonNull(bootstrapArgs).clone();
93-
94-
if (constantName.length() == 0)
95-
throw new IllegalArgumentException("Illegal invocation name: " + constantName);
92+
this.bootstrapArgs = bootstrapArgs.length == 0 ? EMPTY_CONSTANTDESC : bootstrapArgs.clone();
9693
}
9794

9895
/**

src/java.base/share/classes/java/lang/constant/MethodTypeDescImpl.java

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,8 @@ final class MethodTypeDescImpl implements MethodTypeDesc {
5454
* @param validatedArgTypes {@link ClassDesc}s describing the trusted and validated parameter types
5555
*/
5656
private MethodTypeDescImpl(ClassDesc returnType, ClassDesc[] validatedArgTypes) {
57-
this.returnType = requireNonNull(returnType);
58-
this.argTypes = requireNonNull(validatedArgTypes);
57+
this.returnType = returnType;
58+
this.argTypes = validatedArgTypes;
5959
}
6060

6161
/**
@@ -66,12 +66,12 @@ private MethodTypeDescImpl(ClassDesc returnType, ClassDesc[] validatedArgTypes)
6666
* @param trustedArgTypes {@link ClassDesc}s describing the trusted parameter types
6767
*/
6868
static MethodTypeDescImpl ofTrusted(ClassDesc returnType, ClassDesc[] trustedArgTypes) {
69-
Objects.requireNonNull(returnType);
69+
requireNonNull(returnType);
7070
if (trustedArgTypes.length == 0) // implicit null check
7171
return new MethodTypeDescImpl(returnType, ConstantUtils.EMPTY_CLASSDESC);
7272

7373
for (ClassDesc cd : trustedArgTypes)
74-
if (cd.isPrimitive() && cd.descriptorString().charAt(0) == 'V') // implicit null check
74+
if (cd.descriptorString().charAt(0) == 'V') // implicit null check
7575
throw new IllegalArgumentException("Void parameters not permitted");
7676

7777
return new MethodTypeDescImpl(returnType, trustedArgTypes);
@@ -127,7 +127,7 @@ public ClassDesc[] parameterArray() {
127127

128128
@Override
129129
public MethodTypeDesc changeReturnType(ClassDesc returnType) {
130-
return new MethodTypeDescImpl(returnType, argTypes);
130+
return new MethodTypeDescImpl(requireNonNull(returnType), argTypes);
131131
}
132132

133133
@Override
@@ -143,8 +143,12 @@ public MethodTypeDesc dropParameterTypes(int start, int end) {
143143
Objects.checkFromToIndex(start, end, argTypes.length);
144144

145145
ClassDesc[] newArgs = new ClassDesc[argTypes.length - (end - start)];
146-
System.arraycopy(argTypes, 0, newArgs, 0, start);
147-
System.arraycopy(argTypes, end, newArgs, start, argTypes.length - end);
146+
if (start > 0) {
147+
System.arraycopy(argTypes, 0, newArgs, 0, start);
148+
}
149+
if (end < argTypes.length) {
150+
System.arraycopy(argTypes, end, newArgs, start, argTypes.length - end);
151+
}
148152
return ofTrusted(returnType, newArgs);
149153
}
150154

@@ -154,10 +158,13 @@ public MethodTypeDesc insertParameterTypes(int pos, ClassDesc... paramTypes) {
154158
throw new IndexOutOfBoundsException(pos);
155159

156160
ClassDesc[] newArgs = new ClassDesc[argTypes.length + paramTypes.length];
157-
System.arraycopy(argTypes, 0, newArgs, 0, pos);
161+
if (pos > 0) {
162+
System.arraycopy(argTypes, 0, newArgs, 0, pos);
163+
}
158164
System.arraycopy(paramTypes, 0, newArgs, pos, paramTypes.length);
159-
System.arraycopy(argTypes, pos, newArgs, pos+paramTypes.length, argTypes.length - pos);
160-
165+
if (pos < argTypes.length) {
166+
System.arraycopy(argTypes, pos, newArgs, pos + paramTypes.length, argTypes.length - pos);
167+
}
161168
return ofTrusted(returnType, newArgs);
162169
}
163170

src/java.base/share/classes/java/lang/constant/ReferenceClassDescImpl.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -47,10 +47,9 @@ final class ReferenceClassDescImpl implements ClassDesc {
4747
* @jvms 4.3.2 Field Descriptors
4848
*/
4949
ReferenceClassDescImpl(String descriptor) {
50-
requireNonNull(descriptor);
51-
int len = ConstantUtils.skipOverFieldSignature(descriptor, 0, descriptor.length(), false);
52-
if (len == 0 || len == 1
53-
|| len != descriptor.length())
50+
int dLen = descriptor.length();
51+
int len = ConstantUtils.skipOverFieldSignature(descriptor, 0, dLen, false);
52+
if (len <= 1 || len != dLen)
5453
throw new IllegalArgumentException(String.format("not a valid reference type descriptor: %s", descriptor));
5554
this.descriptor = descriptor;
5655
}

0 commit comments

Comments
 (0)