From 4d65c3efcaa5f855f9e0fbdd8e9d4f4ed2b44d3b Mon Sep 17 00:00:00 2001 From: Chen Liang Date: Thu, 12 Sep 2024 15:16:38 +0000 Subject: [PATCH] 8339876: Move constant symbol caches to Utf8EntryImpl Reviewed-by: redestad --- .../java/lang/classfile/Annotation.java | 8 ++- .../java/lang/classfile/AnnotationValue.java | 10 +-- .../java/lang/classfile/ClassBuilder.java | 4 +- .../java/lang/classfile/CodeBuilder.java | 2 +- .../java/lang/classfile/FieldModel.java | 3 +- .../java/lang/classfile/MethodModel.java | 3 +- .../attribute/LocalVariableInfo.java | 3 +- .../attribute/RecordComponentInfo.java | 5 +- .../constantpool/ConstantPoolBuilder.java | 8 +-- .../classfile/instruction/LocalVariable.java | 5 +- .../classfile/impl/AbstractPoolEntry.java | 64 ++++++++----------- .../classfile/impl/BoundLocalVariable.java | 2 +- .../classfile/impl/BufferedMethodBuilder.java | 10 +-- .../classfile/impl/ChainedClassBuilder.java | 9 --- .../classfile/impl/DirectClassBuilder.java | 15 ----- .../classfile/impl/DirectMethodBuilder.java | 10 +-- .../internal/classfile/impl/MethodImpl.java | 6 +- .../classfile/impl/SplitConstantPool.java | 20 ++++-- .../jdk/internal/classfile/impl/Util.java | 13 +++- 19 files changed, 87 insertions(+), 113 deletions(-) diff --git a/src/java.base/share/classes/java/lang/classfile/Annotation.java b/src/java.base/share/classes/java/lang/classfile/Annotation.java index 357a7cb77ee..009248ffd78 100644 --- a/src/java.base/share/classes/java/lang/classfile/Annotation.java +++ b/src/java.base/share/classes/java/lang/classfile/Annotation.java @@ -34,6 +34,8 @@ import jdk.internal.classfile.impl.TemporaryConstantPool; import java.lang.constant.ClassDesc; import java.util.List; + +import jdk.internal.classfile.impl.Util; import jdk.internal.javac.PreviewFeature; /** @@ -78,7 +80,7 @@ public sealed interface Annotation * {@return the annotation interface, as a symbolic descriptor} */ default ClassDesc classSymbol() { - return ClassDesc.ofDescriptor(className().stringValue()); + return Util.fieldTypeSymbol(className()); } /** @@ -115,7 +117,7 @@ public sealed interface Annotation */ static Annotation of(ClassDesc annotationClass, List elements) { - return of(TemporaryConstantPool.INSTANCE.utf8Entry(annotationClass.descriptorString()), elements); + return of(TemporaryConstantPool.INSTANCE.utf8Entry(annotationClass), elements); } /** @@ -125,6 +127,6 @@ public sealed interface Annotation */ static Annotation of(ClassDesc annotationClass, AnnotationElement... elements) { - return of(TemporaryConstantPool.INSTANCE.utf8Entry(annotationClass.descriptorString()), elements); + return of(TemporaryConstantPool.INSTANCE.utf8Entry(annotationClass), elements); } } diff --git a/src/java.base/share/classes/java/lang/classfile/AnnotationValue.java b/src/java.base/share/classes/java/lang/classfile/AnnotationValue.java index 61314207755..c4474a248b5 100644 --- a/src/java.base/share/classes/java/lang/classfile/AnnotationValue.java +++ b/src/java.base/share/classes/java/lang/classfile/AnnotationValue.java @@ -38,6 +38,8 @@ import java.lang.constant.ClassDesc; import java.lang.constant.Constable; import java.util.ArrayList; import java.util.List; + +import jdk.internal.classfile.impl.Util; import jdk.internal.javac.PreviewFeature; /** @@ -405,7 +407,7 @@ public sealed interface AnnotationValue { /** {@return the class descriptor} */ default ClassDesc classSymbol() { - return ClassDesc.ofDescriptor(className().stringValue()); + return Util.fieldTypeSymbol(className()); } } @@ -423,7 +425,7 @@ public sealed interface AnnotationValue { /** {@return the enum class descriptor} */ default ClassDesc classSymbol() { - return ClassDesc.ofDescriptor(className().stringValue()); + return Util.fieldTypeSymbol(className()); } /** {@return the enum constant name} */ @@ -452,7 +454,7 @@ public sealed interface AnnotationValue { * @param constantName the name of the enum constant */ static OfEnum ofEnum(ClassDesc className, String constantName) { - return ofEnum(TemporaryConstantPool.INSTANCE.utf8Entry(className.descriptorString()), + return ofEnum(TemporaryConstantPool.INSTANCE.utf8Entry(className), TemporaryConstantPool.INSTANCE.utf8Entry(constantName)); } @@ -469,7 +471,7 @@ public sealed interface AnnotationValue { * @param className the descriptor of the class */ static OfClass ofClass(ClassDesc className) { - return ofClass(TemporaryConstantPool.INSTANCE.utf8Entry(className.descriptorString())); + return ofClass(TemporaryConstantPool.INSTANCE.utf8Entry(className)); } /** diff --git a/src/java.base/share/classes/java/lang/classfile/ClassBuilder.java b/src/java.base/share/classes/java/lang/classfile/ClassBuilder.java index 1d5bb271dbe..905c7355c34 100644 --- a/src/java.base/share/classes/java/lang/classfile/ClassBuilder.java +++ b/src/java.base/share/classes/java/lang/classfile/ClassBuilder.java @@ -194,7 +194,9 @@ public sealed interface ClassBuilder default ClassBuilder withField(String name, ClassDesc descriptor, int flags) { - return withField(name, descriptor, Util.buildingFlags(flags)); + return withField(constantPool().utf8Entry(name), + constantPool().utf8Entry(descriptor), + flags); } /** diff --git a/src/java.base/share/classes/java/lang/classfile/CodeBuilder.java b/src/java.base/share/classes/java/lang/classfile/CodeBuilder.java index be0778d1984..5f4e5b72a19 100644 --- a/src/java.base/share/classes/java/lang/classfile/CodeBuilder.java +++ b/src/java.base/share/classes/java/lang/classfile/CodeBuilder.java @@ -769,7 +769,7 @@ public sealed interface CodeBuilder default CodeBuilder localVariable(int slot, String name, ClassDesc descriptor, Label startScope, Label endScope) { return localVariable(slot, constantPool().utf8Entry(name), - constantPool().utf8Entry(descriptor.descriptorString()), + constantPool().utf8Entry(descriptor), startScope, endScope); } diff --git a/src/java.base/share/classes/java/lang/classfile/FieldModel.java b/src/java.base/share/classes/java/lang/classfile/FieldModel.java index e14f264ca2a..006103d5f9c 100644 --- a/src/java.base/share/classes/java/lang/classfile/FieldModel.java +++ b/src/java.base/share/classes/java/lang/classfile/FieldModel.java @@ -31,6 +31,7 @@ import java.util.Optional; import java.lang.classfile.constantpool.Utf8Entry; import jdk.internal.classfile.impl.BufferedFieldBuilder; import jdk.internal.classfile.impl.FieldImpl; +import jdk.internal.classfile.impl.Util; import jdk.internal.javac.PreviewFeature; /** @@ -59,6 +60,6 @@ public sealed interface FieldModel /** {@return the field descriptor of this field, as a symbolic descriptor} */ default ClassDesc fieldTypeSymbol() { - return ClassDesc.ofDescriptor(fieldType().stringValue()); + return Util.fieldTypeSymbol(fieldType()); } } diff --git a/src/java.base/share/classes/java/lang/classfile/MethodModel.java b/src/java.base/share/classes/java/lang/classfile/MethodModel.java index 651bc194ee3..bd51f3c97d7 100644 --- a/src/java.base/share/classes/java/lang/classfile/MethodModel.java +++ b/src/java.base/share/classes/java/lang/classfile/MethodModel.java @@ -31,6 +31,7 @@ import java.util.Optional; import java.lang.classfile.constantpool.Utf8Entry; import jdk.internal.classfile.impl.BufferedMethodBuilder; import jdk.internal.classfile.impl.MethodImpl; +import jdk.internal.classfile.impl.Util; import jdk.internal.javac.PreviewFeature; /** @@ -59,7 +60,7 @@ public sealed interface MethodModel /** {@return the method descriptor of this method, as a symbolic descriptor} */ default MethodTypeDesc methodTypeSymbol() { - return MethodTypeDesc.ofDescriptor(methodType().stringValue()); + return Util.methodTypeSymbol(methodType()); } /** {@return the body of this method, if there is one} */ diff --git a/src/java.base/share/classes/java/lang/classfile/attribute/LocalVariableInfo.java b/src/java.base/share/classes/java/lang/classfile/attribute/LocalVariableInfo.java index 954682f665d..0ef8542e05c 100644 --- a/src/java.base/share/classes/java/lang/classfile/attribute/LocalVariableInfo.java +++ b/src/java.base/share/classes/java/lang/classfile/attribute/LocalVariableInfo.java @@ -28,6 +28,7 @@ import java.lang.constant.ClassDesc; import java.lang.classfile.constantpool.Utf8Entry; import jdk.internal.classfile.impl.BoundLocalVariable; import jdk.internal.classfile.impl.UnboundAttribute; +import jdk.internal.classfile.impl.Util; import jdk.internal.javac.PreviewFeature; /** @@ -65,7 +66,7 @@ public sealed interface LocalVariableInfo * {@return the field descriptor of the local variable} */ default ClassDesc typeSymbol() { - return ClassDesc.ofDescriptor(type().stringValue()); + return Util.fieldTypeSymbol(type()); } /** diff --git a/src/java.base/share/classes/java/lang/classfile/attribute/RecordComponentInfo.java b/src/java.base/share/classes/java/lang/classfile/attribute/RecordComponentInfo.java index ab7df7a5db2..5a4c0d87b83 100644 --- a/src/java.base/share/classes/java/lang/classfile/attribute/RecordComponentInfo.java +++ b/src/java.base/share/classes/java/lang/classfile/attribute/RecordComponentInfo.java @@ -33,6 +33,7 @@ import java.lang.classfile.constantpool.Utf8Entry; import jdk.internal.classfile.impl.BoundRecordComponentInfo; import jdk.internal.classfile.impl.TemporaryConstantPool; import jdk.internal.classfile.impl.UnboundAttribute; +import jdk.internal.classfile.impl.Util; import jdk.internal.javac.PreviewFeature; /** @@ -58,7 +59,7 @@ public sealed interface RecordComponentInfo * {@return the field descriptor of this component, as a {@linkplain ClassDesc}} */ default ClassDesc descriptorSymbol() { - return ClassDesc.ofDescriptor(descriptor().stringValue()); + return Util.fieldTypeSymbol(descriptor()); } /** @@ -95,7 +96,7 @@ public sealed interface RecordComponentInfo ClassDesc descriptor, List> attributes) { return new UnboundAttribute.UnboundRecordComponentInfo(TemporaryConstantPool.INSTANCE.utf8Entry(name), - TemporaryConstantPool.INSTANCE.utf8Entry(descriptor.descriptorString()), + TemporaryConstantPool.INSTANCE.utf8Entry(descriptor), attributes); } diff --git a/src/java.base/share/classes/java/lang/classfile/constantpool/ConstantPoolBuilder.java b/src/java.base/share/classes/java/lang/classfile/constantpool/ConstantPoolBuilder.java index 7334d8e5460..1c0d6e55e31 100644 --- a/src/java.base/share/classes/java/lang/classfile/constantpool/ConstantPoolBuilder.java +++ b/src/java.base/share/classes/java/lang/classfile/constantpool/ConstantPoolBuilder.java @@ -223,9 +223,7 @@ public sealed interface ConstantPoolBuilder * @param type the symbolic descriptor for a field type */ default NameAndTypeEntry nameAndTypeEntry(String name, ClassDesc type) { - var ret = (NameAndTypeEntryImpl)nameAndTypeEntry(utf8Entry(name), utf8Entry(type.descriptorString())); - ret.typeSym = type; - return ret; + return nameAndTypeEntry(utf8Entry(name), utf8Entry(type)); } /** @@ -238,9 +236,7 @@ public sealed interface ConstantPoolBuilder * @param type the symbolic descriptor for a method type */ default NameAndTypeEntry nameAndTypeEntry(String name, MethodTypeDesc type) { - var ret = (NameAndTypeEntryImpl)nameAndTypeEntry(utf8Entry(name), utf8Entry(type.descriptorString())); - ret.typeSym = type; - return ret; + return nameAndTypeEntry(utf8Entry(name), utf8Entry(type)); } /** diff --git a/src/java.base/share/classes/java/lang/classfile/instruction/LocalVariable.java b/src/java.base/share/classes/java/lang/classfile/instruction/LocalVariable.java index 4d3d7553867..84a85993152 100644 --- a/src/java.base/share/classes/java/lang/classfile/instruction/LocalVariable.java +++ b/src/java.base/share/classes/java/lang/classfile/instruction/LocalVariable.java @@ -36,6 +36,7 @@ import java.lang.constant.ClassDesc; import jdk.internal.classfile.impl.AbstractPseudoInstruction; import jdk.internal.classfile.impl.BoundLocalVariable; import jdk.internal.classfile.impl.TemporaryConstantPool; +import jdk.internal.classfile.impl.Util; import jdk.internal.javac.PreviewFeature; /** @@ -70,7 +71,7 @@ public sealed interface LocalVariable extends PseudoInstruction * {@return the local variable type, as a symbolic descriptor} */ default ClassDesc typeSymbol() { - return ClassDesc.ofDescriptor(type().stringValue()); + return Util.fieldTypeSymbol(type()); } /** @@ -109,7 +110,7 @@ public sealed interface LocalVariable extends PseudoInstruction static LocalVariable of(int slot, String name, ClassDesc descriptor, Label startScope, Label endScope) { return of(slot, TemporaryConstantPool.INSTANCE.utf8Entry(name), - TemporaryConstantPool.INSTANCE.utf8Entry(descriptor.descriptorString()), + TemporaryConstantPool.INSTANCE.utf8Entry(descriptor), startScope, endScope); } } diff --git a/src/java.base/share/classes/jdk/internal/classfile/impl/AbstractPoolEntry.java b/src/java.base/share/classes/jdk/internal/classfile/impl/AbstractPoolEntry.java index 450f6ae1c8c..7f14560fd18 100644 --- a/src/java.base/share/classes/jdk/internal/classfile/impl/AbstractPoolEntry.java +++ b/src/java.base/share/classes/jdk/internal/classfile/impl/AbstractPoolEntry.java @@ -54,6 +54,7 @@ import java.lang.classfile.constantpool.Utf8Entry; import jdk.internal.access.JavaLangAccess; import jdk.internal.access.SharedSecrets; import jdk.internal.util.ArraysSupport; +import jdk.internal.vm.annotation.Stable; public abstract sealed class AbstractPoolEntry { /* @@ -146,12 +147,14 @@ public abstract sealed class AbstractPoolEntry { private final int offset; private final int rawLen; // Set in any state other than RAW - private int hash; - private int charLen; + private @Stable int hash; + private @Stable int charLen; // Set in CHAR state - private char[] chars; + private @Stable char[] chars; // Only set in STRING state - private String stringValue; + private @Stable String stringValue; + // The descriptor symbol, if this is a descriptor + @Stable TypeDescriptor typeSym; Utf8EntryImpl(ConstantPool cpm, int index, byte[] rawBytes, int offset, int rawLen) { @@ -187,6 +190,7 @@ public abstract sealed class AbstractPoolEntry { this.charLen = u.charLen; this.chars = u.chars; this.stringValue = u.stringValue; + this.typeSym = u.typeSym; } /** @@ -419,6 +423,22 @@ public abstract sealed class AbstractPoolEntry { pool.writeUTF(stringValue); } } + + public ClassDesc fieldTypeSymbol() { + if (typeSym instanceof ClassDesc cd) + return cd; + var ret = ClassDesc.ofDescriptor(stringValue()); + typeSym = ret; + return ret; + } + + public MethodTypeDesc methodTypeSymbol() { + if (typeSym instanceof MethodTypeDesc mtd) + return mtd; + var ret = MethodTypeDesc.ofDescriptor(stringValue()); + typeSym = ret; + return ret; + } } abstract static sealed class AbstractRefEntry extends AbstractPoolEntry { @@ -585,8 +605,6 @@ public abstract sealed class AbstractPoolEntry { public static final class NameAndTypeEntryImpl extends AbstractRefsEntry implements NameAndTypeEntry { - public TypeDescriptor typeSym = null; - NameAndTypeEntryImpl(ConstantPool cpm, int index, Utf8EntryImpl name, Utf8EntryImpl type) { super(cpm, ClassFile.TAG_NAMEANDTYPE, index, name, type); } @@ -601,31 +619,12 @@ public abstract sealed class AbstractPoolEntry { return ref2; } - public ClassDesc fieldTypeSymbol() { - if (typeSym instanceof ClassDesc cd) { - return cd; - } else { - return (ClassDesc)(typeSym = ClassDesc.ofDescriptor(ref2.stringValue())); - } - } - - public MethodTypeDesc methodTypeSymbol() { - if (typeSym instanceof MethodTypeDesc mtd) { - return mtd; - } else { - return (MethodTypeDesc)(typeSym = MethodTypeDesc.ofDescriptor(ref2.stringValue())); - } - } - @Override public NameAndTypeEntry clone(ConstantPoolBuilder cp) { if (cp.canWriteDirect(constantPool)) { return this; - } else { - var ret = (NameAndTypeEntryImpl)cp.nameAndTypeEntry(ref1, ref2); - ret.typeSym = typeSym; - return ret; } + return cp.nameAndTypeEntry(ref1, ref2); } @Override @@ -897,8 +896,6 @@ public abstract sealed class AbstractPoolEntry { extends AbstractRefEntry implements MethodTypeEntry { - public MethodTypeDesc sym = null; - MethodTypeEntryImpl(ConstantPool cpm, int index, Utf8EntryImpl descriptor) { super(cpm, ClassFile.TAG_METHODTYPE, index, descriptor); } @@ -912,20 +909,13 @@ public abstract sealed class AbstractPoolEntry { public MethodTypeEntry clone(ConstantPoolBuilder cp) { if (cp.canWriteDirect(constantPool)) { return this; - } else { - var ret = (MethodTypeEntryImpl)cp.methodTypeEntry(ref1); - ret.sym = sym; - return ret; } + return cp.methodTypeEntry(ref1); } @Override public MethodTypeDesc asSymbol() { - var sym = this.sym; - if (sym != null) { - return sym; - } - return this.sym = MethodTypeDesc.ofDescriptor(descriptor().stringValue()); + return ref1.methodTypeSymbol(); } @Override diff --git a/src/java.base/share/classes/jdk/internal/classfile/impl/BoundLocalVariable.java b/src/java.base/share/classes/jdk/internal/classfile/impl/BoundLocalVariable.java index a5953c86f5d..3bbcd243cc1 100644 --- a/src/java.base/share/classes/jdk/internal/classfile/impl/BoundLocalVariable.java +++ b/src/java.base/share/classes/jdk/internal/classfile/impl/BoundLocalVariable.java @@ -46,7 +46,7 @@ public final class BoundLocalVariable @Override public ClassDesc typeSymbol() { - return ClassDesc.ofDescriptor(type().stringValue()); + return Util.fieldTypeSymbol(type()); } @Override diff --git a/src/java.base/share/classes/jdk/internal/classfile/impl/BufferedMethodBuilder.java b/src/java.base/share/classes/jdk/internal/classfile/impl/BufferedMethodBuilder.java index 84ddd09b990..bc6ab555ae5 100644 --- a/src/java.base/share/classes/jdk/internal/classfile/impl/BufferedMethodBuilder.java +++ b/src/java.base/share/classes/jdk/internal/classfile/impl/BufferedMethodBuilder.java @@ -53,7 +53,6 @@ public final class BufferedMethodBuilder private AccessFlags flags; private final MethodModel original; private int[] parameterSlots; - MethodTypeDesc mDesc; public BufferedMethodBuilder(SplitConstantPool constantPool, ClassFileImpl context, @@ -102,14 +101,7 @@ public final class BufferedMethodBuilder @Override public MethodTypeDesc methodTypeSymbol() { - if (mDesc == null) { - if (original instanceof MethodInfo mi) { - mDesc = mi.methodTypeSymbol(); - } else { - mDesc = MethodTypeDesc.ofDescriptor(methodType().stringValue()); - } - } - return mDesc; + return Util.methodTypeSymbol(methodType()); } @Override diff --git a/src/java.base/share/classes/jdk/internal/classfile/impl/ChainedClassBuilder.java b/src/java.base/share/classes/jdk/internal/classfile/impl/ChainedClassBuilder.java index 50c1590e8a2..8f05f20d739 100644 --- a/src/java.base/share/classes/jdk/internal/classfile/impl/ChainedClassBuilder.java +++ b/src/java.base/share/classes/jdk/internal/classfile/impl/ChainedClassBuilder.java @@ -79,15 +79,6 @@ public final class ChainedClassBuilder return this; } - @Override - public ClassBuilder withMethod(String name, MethodTypeDesc descriptor, int flags, Consumer handler) { - var mb = new BufferedMethodBuilder(terminal.constantPool, terminal.context, - constantPool().utf8Entry(name), constantPool().utf8Entry(descriptor), flags, null); - mb.mDesc = descriptor; - consumer.accept(mb.run(handler).toModel()); - return this; - } - @Override public ClassBuilder transformMethod(MethodModel method, MethodTransform transform) { BufferedMethodBuilder builder = new BufferedMethodBuilder(terminal.constantPool, terminal.context, diff --git a/src/java.base/share/classes/jdk/internal/classfile/impl/DirectClassBuilder.java b/src/java.base/share/classes/jdk/internal/classfile/impl/DirectClassBuilder.java index 7d67ed272af..6901ae7e24c 100644 --- a/src/java.base/share/classes/jdk/internal/classfile/impl/DirectClassBuilder.java +++ b/src/java.base/share/classes/jdk/internal/classfile/impl/DirectClassBuilder.java @@ -90,14 +90,6 @@ public final class DirectClassBuilder return this; } - @Override - public ClassBuilder withField(String name, - ClassDesc descriptor, - int flags) { - return withField(new DirectFieldBuilder(constantPool, context, - constantPool.utf8Entry(name), constantPool.utf8Entry(descriptor), flags, null)); - } - @Override public ClassBuilder withField(Utf8Entry name, Utf8Entry descriptor, @@ -130,13 +122,6 @@ public final class DirectClassBuilder .run(handler)); } - @Override - public ClassBuilder withMethod(String name, MethodTypeDesc descriptor, int flags, Consumer handler) { - var method = new DirectMethodBuilder(constantPool, context, constantPool.utf8Entry(name), constantPool.utf8Entry(descriptor), flags, null); - method.mDesc = descriptor; - return withMethod(method.run(handler)); - } - @Override public ClassBuilder transformMethod(MethodModel method, MethodTransform transform) { DirectMethodBuilder builder = new DirectMethodBuilder(constantPool, context, method.methodName(), diff --git a/src/java.base/share/classes/jdk/internal/classfile/impl/DirectMethodBuilder.java b/src/java.base/share/classes/jdk/internal/classfile/impl/DirectMethodBuilder.java index fac6b7384e2..ec4e148baf3 100644 --- a/src/java.base/share/classes/jdk/internal/classfile/impl/DirectMethodBuilder.java +++ b/src/java.base/share/classes/jdk/internal/classfile/impl/DirectMethodBuilder.java @@ -46,7 +46,6 @@ public final class DirectMethodBuilder final Utf8Entry desc; int flags; int[] parameterSlots; - MethodTypeDesc mDesc; public DirectMethodBuilder(SplitConstantPool constantPool, ClassFileImpl context, @@ -87,14 +86,7 @@ public final class DirectMethodBuilder @Override public MethodTypeDesc methodTypeSymbol() { - if (mDesc == null) { - if (original instanceof MethodInfo mi) { - mDesc = mi.methodTypeSymbol(); - } else { - mDesc = MethodTypeDesc.ofDescriptor(methodType().stringValue()); - } - } - return mDesc; + return Util.methodTypeSymbol(methodType()); } @Override diff --git a/src/java.base/share/classes/jdk/internal/classfile/impl/MethodImpl.java b/src/java.base/share/classes/jdk/internal/classfile/impl/MethodImpl.java index 05de881ba29..8467152504e 100644 --- a/src/java.base/share/classes/jdk/internal/classfile/impl/MethodImpl.java +++ b/src/java.base/share/classes/jdk/internal/classfile/impl/MethodImpl.java @@ -41,7 +41,6 @@ public final class MethodImpl private final int startPos, endPos, attributesPos; private List> attributes; private int[] parameterSlots; - private MethodTypeDesc mDesc; public MethodImpl(ClassReader reader, int startPos, int endPos, int attrStart) { this.reader = reader; @@ -75,10 +74,7 @@ public final class MethodImpl @Override public MethodTypeDesc methodTypeSymbol() { - if (mDesc == null) { - mDesc = MethodTypeDesc.ofDescriptor(methodType().stringValue()); - } - return mDesc; + return Util.methodTypeSymbol(methodType()); } @Override diff --git a/src/java.base/share/classes/jdk/internal/classfile/impl/SplitConstantPool.java b/src/java.base/share/classes/jdk/internal/classfile/impl/SplitConstantPool.java index 49c2d51e4dc..0b5d64023b9 100644 --- a/src/java.base/share/classes/jdk/internal/classfile/impl/SplitConstantPool.java +++ b/src/java.base/share/classes/jdk/internal/classfile/impl/SplitConstantPool.java @@ -24,7 +24,7 @@ */ package jdk.internal.classfile.impl; -import java.lang.constant.ConstantDesc; +import java.lang.constant.ClassDesc; import java.lang.constant.MethodTypeDesc; import java.util.Arrays; import java.util.List; @@ -398,6 +398,20 @@ public final class SplitConstantPool implements ConstantPoolBuilder { return null; } + @Override + public Utf8Entry utf8Entry(ClassDesc desc) { + var utf8 = utf8Entry(desc.descriptorString()); + utf8.typeSym = desc; + return utf8; + } + + @Override + public Utf8Entry utf8Entry(MethodTypeDesc desc) { + var utf8 = utf8Entry(desc.descriptorString()); + utf8.typeSym = desc; + return utf8; + } + @Override public AbstractPoolEntry.Utf8EntryImpl utf8Entry(String s) { int hash = AbstractPoolEntry.hashString(s.hashCode()); @@ -480,9 +494,7 @@ public final class SplitConstantPool implements ConstantPoolBuilder { @Override public MethodTypeEntry methodTypeEntry(MethodTypeDesc descriptor) { - var ret = (AbstractPoolEntry.MethodTypeEntryImpl)methodTypeEntry(utf8Entry(descriptor.descriptorString())); - ret.sym = descriptor; - return ret; + return methodTypeEntry(utf8Entry(descriptor)); } @Override diff --git a/src/java.base/share/classes/jdk/internal/classfile/impl/Util.java b/src/java.base/share/classes/jdk/internal/classfile/impl/Util.java index b0f1de65d92..7f3dd914e7f 100644 --- a/src/java.base/share/classes/jdk/internal/classfile/impl/Util.java +++ b/src/java.base/share/classes/jdk/internal/classfile/impl/Util.java @@ -30,6 +30,7 @@ import java.lang.classfile.FieldBuilder; import java.lang.classfile.MethodBuilder; import java.lang.classfile.PseudoInstruction; import java.lang.classfile.constantpool.PoolEntry; +import java.lang.classfile.constantpool.Utf8Entry; import java.lang.constant.ClassDesc; import java.lang.constant.MethodTypeDesc; import java.util.AbstractList; @@ -220,12 +221,20 @@ public class Util { return (flag.mask() & flagsMask) == flag.mask() && flag.locations().contains(location); } + public static ClassDesc fieldTypeSymbol(Utf8Entry utf8) { + return ((AbstractPoolEntry.Utf8EntryImpl) utf8).fieldTypeSymbol(); + } + + public static MethodTypeDesc methodTypeSymbol(Utf8Entry utf8) { + return ((AbstractPoolEntry.Utf8EntryImpl) utf8).methodTypeSymbol(); + } + public static ClassDesc fieldTypeSymbol(NameAndTypeEntry nat) { - return ((AbstractPoolEntry.NameAndTypeEntryImpl)nat).fieldTypeSymbol(); + return fieldTypeSymbol(nat.type()); } public static MethodTypeDesc methodTypeSymbol(NameAndTypeEntry nat) { - return ((AbstractPoolEntry.NameAndTypeEntryImpl)nat).methodTypeSymbol(); + return methodTypeSymbol(nat.type()); } @SuppressWarnings("unchecked")