8150180: String.value contents should be trusted
Reviewed-by: vlivanov, redestad, jrose, twisti
--- a/jdk/src/java.base/share/classes/java/lang/String.java Thu Feb 18 15:19:41 2016 -0800
+++ b/jdk/src/java.base/share/classes/java/lang/String.java Tue Feb 23 17:55:28 2016 +0300
@@ -42,6 +42,7 @@
import java.util.stream.IntStream;
import java.util.stream.StreamSupport;
import jdk.internal.HotSpotIntrinsicCandidate;
+import jdk.internal.vm.annotation.Stable;
/**
* The {@code String} class represents character strings. All
@@ -119,7 +120,18 @@
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
- /** The value is used for character storage. */
+ /**
+ * The value is used for character storage.
+ *
+ * @implNote This field is trusted by the VM, and is a subject to
+ * constant folding if String instance is constant. Overwriting this
+ * field after construction will cause problems.
+ *
+ * Additionally, it is marked with {@link Stable} to trust the contents
+ * of the array. No other facility in JDK provides this functionality (yet).
+ * {@link Stable} is safe here, because value is never null.
+ */
+ @Stable
private final byte[] value;
/**
@@ -129,6 +141,9 @@
* LATIN1
* UTF16
*
+ * @implNote This field is trusted by the VM, and is a subject to
+ * constant folding if String instance is constant. Overwriting this
+ * field after construction will cause problems.
*/
private final byte coder;