From b2727e92bf464276d4d548f29ee3b94e7b0f60ee Mon Sep 17 00:00:00 2001 From: liach Date: Mon, 21 Apr 2025 16:05:55 -0500 Subject: [PATCH] 8355227: [lworld] Clarify preview API status for some vallhalla APIs --- .../share/classes/java/lang/IdentityException.java | 9 ++++++++- .../attribute/LoadableDescriptorsAttribute.java | 2 +- .../java/lang/classfile/attribute/StackMapFrameInfo.java | 3 +++ .../share/classes/java/lang/reflect/AccessFlag.java | 2 +- src/java.base/share/classes/java/util/Objects.java | 8 ++++---- .../share/classes/jdk/internal/javac/PreviewFeature.java | 2 ++ 6 files changed, 19 insertions(+), 7 deletions(-) diff --git a/src/java.base/share/classes/java/lang/IdentityException.java b/src/java.base/share/classes/java/lang/IdentityException.java index c6a5ca0563d..db98e3316eb 100644 --- a/src/java.base/share/classes/java/lang/IdentityException.java +++ b/src/java.base/share/classes/java/lang/IdentityException.java @@ -34,7 +34,9 @@ * * @since Valhalla */ -@PreviewFeature(feature = PreviewFeature.Feature.VALUE_OBJECTS) +// Non-preview programs can anticipate to catch this when preview is enabled, +// but should never construct an IdentityException +@PreviewFeature(feature = PreviewFeature.Feature.VALUE_OBJECTS, reflective = true) public class IdentityException extends RuntimeException { @java.io.Serial private static final long serialVersionUID = 1L; @@ -42,6 +44,7 @@ public class IdentityException extends RuntimeException { /** * Create an {@code IdentityException} with no message. */ + @PreviewFeature(feature = PreviewFeature.Feature.VALUE_OBJECTS, reflective = false) public IdentityException() { } @@ -50,6 +53,7 @@ public IdentityException() { * * @param clazz the class of the object */ + @PreviewFeature(feature = PreviewFeature.Feature.VALUE_OBJECTS, reflective = false) public IdentityException(Class clazz) { super(clazz.getName() + " is not an identity class"); } @@ -59,6 +63,7 @@ public IdentityException(Class clazz) { * * @param message the detail message; can be {@code null} */ + @PreviewFeature(feature = PreviewFeature.Feature.VALUE_OBJECTS, reflective = false) public IdentityException(String message) { super(message); } @@ -69,6 +74,7 @@ public IdentityException(String message) { * @param cause the cause; {@code null} is permitted, and indicates * that the cause is nonexistent or unknown. */ + @PreviewFeature(feature = PreviewFeature.Feature.VALUE_OBJECTS, reflective = false) public IdentityException(Throwable cause) { super(cause); } @@ -80,6 +86,7 @@ public IdentityException(Throwable cause) { * @param cause the cause; {@code null} is permitted, and indicates * that the cause is nonexistent or unknown. */ + @PreviewFeature(feature = PreviewFeature.Feature.VALUE_OBJECTS, reflective = false) public IdentityException(String message, Throwable cause) { super(message, cause); } diff --git a/src/java.base/share/classes/java/lang/classfile/attribute/LoadableDescriptorsAttribute.java b/src/java.base/share/classes/java/lang/classfile/attribute/LoadableDescriptorsAttribute.java index 22fc75e0dfb..148eebaf477 100644 --- a/src/java.base/share/classes/java/lang/classfile/attribute/LoadableDescriptorsAttribute.java +++ b/src/java.base/share/classes/java/lang/classfile/attribute/LoadableDescriptorsAttribute.java @@ -43,7 +43,7 @@ * This code and its internal interfaces are subject to change or * deletion without notice. */ -@PreviewFeature(feature = PreviewFeature.Feature.CLASSFILE_API) +@PreviewFeature(feature = PreviewFeature.Feature.VALUE_OBJECTS, reflective = true) public sealed interface LoadableDescriptorsAttribute extends Attribute, ClassElement permits BoundAttribute.BoundLoadableDescriptorsAttribute, UnboundAttribute.UnboundLoadableDescriptorsAttribute { diff --git a/src/java.base/share/classes/java/lang/classfile/attribute/StackMapFrameInfo.java b/src/java.base/share/classes/java/lang/classfile/attribute/StackMapFrameInfo.java index e1bfe83c194..5bff16d1728 100644 --- a/src/java.base/share/classes/java/lang/classfile/attribute/StackMapFrameInfo.java +++ b/src/java.base/share/classes/java/lang/classfile/attribute/StackMapFrameInfo.java @@ -36,6 +36,7 @@ import jdk.internal.classfile.impl.StackMapDecoder; import jdk.internal.classfile.impl.TemporaryConstantPool; +import jdk.internal.javac.PreviewFeature; /** * Models a stack map frame in a {@link StackMapTableAttribute StackMapTable} @@ -83,6 +84,7 @@ public sealed interface StackMapFrameInfo * * @see Specs */ + @PreviewFeature(feature = PreviewFeature.Feature.STRICT_FIELDS, reflective = true) List unsetFields(); /** @@ -106,6 +108,7 @@ public static StackMapFrameInfo of(Label target, * @param stack the complete frame stack * @param unsetFields the complete list of unset fields */ + @PreviewFeature(feature = PreviewFeature.Feature.STRICT_FIELDS, reflective = true) public static StackMapFrameInfo of(Label target, List locals, List stack, diff --git a/src/java.base/share/classes/java/lang/reflect/AccessFlag.java b/src/java.base/share/classes/java/lang/reflect/AccessFlag.java index 496143a8c17..6b1d6e4e21e 100644 --- a/src/java.base/share/classes/java/lang/reflect/AccessFlag.java +++ b/src/java.base/share/classes/java/lang/reflect/AccessFlag.java @@ -375,7 +375,7 @@ public Set apply(ClassFileFormatVersion cffv) { * * @since Valhalla */ - @PreviewFeature(feature = PreviewFeature.Feature.VALUE_OBJECTS, reflective=true) + @PreviewFeature(feature = PreviewFeature.Feature.STRICT_FIELDS, reflective=true) STRICT_FIELD(Modifier.STRICT, false, PreviewFeatures.isEnabled() ? Location.SET_FIELD : Location.EMPTY_SET, new Function>() { diff --git a/src/java.base/share/classes/java/util/Objects.java b/src/java.base/share/classes/java/util/Objects.java index 7085323ce1e..dd1571c906e 100644 --- a/src/java.base/share/classes/java/util/Objects.java +++ b/src/java.base/share/classes/java/util/Objects.java @@ -187,7 +187,7 @@ public static String toIdentityString(Object o) { * @throws NullPointerException if {@code obj} is {@code null} * @since Valhalla */ - @PreviewFeature(feature = PreviewFeature.Feature.VALUE_OBJECTS) + @PreviewFeature(feature = PreviewFeature.Feature.VALUE_OBJECTS, reflective = true) // @IntrinsicCandidate public static boolean hasIdentity(Object obj) { requireNonNull(obj); @@ -205,7 +205,7 @@ public static boolean hasIdentity(Object obj) { * @throws IdentityException if {@code obj} is not an identity object * @since Valhalla */ - @PreviewFeature(feature = PreviewFeature.Feature.VALUE_OBJECTS) + @PreviewFeature(feature = PreviewFeature.Feature.VALUE_OBJECTS, reflective = true) @ForceInline public static T requireIdentity(T obj) { Objects.requireNonNull(obj); @@ -226,7 +226,7 @@ public static T requireIdentity(T obj) { * @throws IdentityException if {@code obj} is not an identity object * @since Valhalla */ - @PreviewFeature(feature = PreviewFeature.Feature.VALUE_OBJECTS) + @PreviewFeature(feature = PreviewFeature.Feature.VALUE_OBJECTS, reflective = true) @ForceInline public static T requireIdentity(T obj, String message) { Objects.requireNonNull(obj); @@ -247,7 +247,7 @@ public static T requireIdentity(T obj, String message) { * @throws IdentityException if {@code obj} is not an identity object * @since Valhalla */ - @PreviewFeature(feature = PreviewFeature.Feature.VALUE_OBJECTS) + @PreviewFeature(feature = PreviewFeature.Feature.VALUE_OBJECTS, reflective = true) @ForceInline public static T requireIdentity(T obj, Supplier messageSupplier) { Objects.requireNonNull(obj); diff --git a/src/java.base/share/classes/jdk/internal/javac/PreviewFeature.java b/src/java.base/share/classes/jdk/internal/javac/PreviewFeature.java index 80aef33a078..f8ebac78779 100644 --- a/src/java.base/share/classes/jdk/internal/javac/PreviewFeature.java +++ b/src/java.base/share/classes/jdk/internal/javac/PreviewFeature.java @@ -66,6 +66,8 @@ public enum Feature { @JEP(number=401, title="Value Classes and Objects", status = "Preview") VALUE_OBJECTS, + @JEP(number=8350458, title="Strict Field Initialization in the JVM", status="Preview") + STRICT_FIELDS, // while building the interim javac, the ClassReader will produce a warning when loading a class // keeping the constant of a feature that has been integrated or dropped, serves the purpose of muting such warnings.