8338532: Speed up the ClassFile API MethodTypeDesc#ofDescriptor

Reviewed-by: redestad, liach
This commit is contained in:
Shaojin Wen 2024-08-21 14:56:30 +00:00 committed by Chen Liang
parent 918cf11454
commit 3aeb6733f9
11 changed files with 201 additions and 110 deletions

View file

@ -36,6 +36,7 @@ import static java.util.stream.Collectors.joining;
import static jdk.internal.constant.ConstantUtils.MAX_ARRAY_TYPE_DESC_DIMENSIONS;
import static jdk.internal.constant.ConstantUtils.arrayDepth;
import static jdk.internal.constant.ConstantUtils.binaryToInternal;
import static jdk.internal.constant.ConstantUtils.forPrimitiveType;
import static jdk.internal.constant.ConstantUtils.internalToBinary;
import static jdk.internal.constant.ConstantUtils.validateBinaryClassName;
import static jdk.internal.constant.ConstantUtils.validateInternalClassName;
@ -164,7 +165,7 @@ public sealed interface ClassDesc
static ClassDesc ofDescriptor(String descriptor) {
// implicit null-check
return (descriptor.length() == 1)
? Wrapper.forPrimitiveType(descriptor.charAt(0)).basicClassDescriptor()
? forPrimitiveType(descriptor, 0)
// will throw IAE on descriptor.length == 0 or if array dimensions too long
: ReferenceClassDescImpl.of(descriptor);
}

View file

@ -240,31 +240,31 @@ public final class ConstantDescs {
CD_Object, CD_Object);
/** {@link ClassDesc} representing the primitive type {@code int} */
public static final ClassDesc CD_int = new PrimitiveClassDescImpl("I");
public static final ClassDesc CD_int = PrimitiveClassDescImpl.CD_int;
/** {@link ClassDesc} representing the primitive type {@code long} */
public static final ClassDesc CD_long = new PrimitiveClassDescImpl("J");
public static final ClassDesc CD_long = PrimitiveClassDescImpl.CD_long;
/** {@link ClassDesc} representing the primitive type {@code float} */
public static final ClassDesc CD_float = new PrimitiveClassDescImpl("F");
public static final ClassDesc CD_float = PrimitiveClassDescImpl.CD_float;
/** {@link ClassDesc} representing the primitive type {@code double} */
public static final ClassDesc CD_double = new PrimitiveClassDescImpl("D");
public static final ClassDesc CD_double = PrimitiveClassDescImpl.CD_double;
/** {@link ClassDesc} representing the primitive type {@code short} */
public static final ClassDesc CD_short = new PrimitiveClassDescImpl("S");
public static final ClassDesc CD_short = PrimitiveClassDescImpl.CD_short;
/** {@link ClassDesc} representing the primitive type {@code byte} */
public static final ClassDesc CD_byte = new PrimitiveClassDescImpl("B");
public static final ClassDesc CD_byte = PrimitiveClassDescImpl.CD_byte;
/** {@link ClassDesc} representing the primitive type {@code char} */
public static final ClassDesc CD_char = new PrimitiveClassDescImpl("C");
public static final ClassDesc CD_char = PrimitiveClassDescImpl.CD_char;
/** {@link ClassDesc} representing the primitive type {@code boolean} */
public static final ClassDesc CD_boolean = new PrimitiveClassDescImpl("Z");
public static final ClassDesc CD_boolean = PrimitiveClassDescImpl.CD_boolean;
/** {@link ClassDesc} representing the primitive type {@code void} */
public static final ClassDesc CD_void = new PrimitiveClassDescImpl("V");
public static final ClassDesc CD_void = PrimitiveClassDescImpl.CD_void;
/**
* {@link MethodHandleDesc} representing {@link MethodHandles#classData(Lookup, String, Class) MethodHandles.classData}

View file

@ -25,6 +25,7 @@
package java.lang.invoke;
import sun.invoke.util.Wrapper;
import jdk.internal.constant.ConstantUtils;
import static java.lang.invoke.MethodHandleNatives.mapLookupExceptionToError;
import static java.util.Objects.requireNonNull;
@ -112,7 +113,7 @@ public final class ConstantBootstraps {
throw new IllegalArgumentException(String.format("not primitive: %s", name));
}
return Wrapper.forPrimitiveType(name.charAt(0)).primitiveType();
return ConstantUtils.forPrimitiveType(name, 0).resolveConstantDesc(lookup);
}
/**