On Mon, 15 Dec 2025 20:30:51 GMT, Volkan Yazici <[email protected]> wrote:

> Moves input validation checks to Java for `java.lang.StringLatin1` 
> intrinsics. While doing so, affected `java.lang.StringUTF16` methods needed 
> to be updated due to relaxed checks at intrinsics. The javadocs of the 
> touched methods are extensively overhauled.

src/java.base/share/classes/java/lang/StringLatin1.java line 114:

> 112:     // inline_string_equals
> 113:     @IntrinsicCandidate
> 114:     private static boolean equals0(byte[] value, byte[] other) {

This intrinsic is actually identical to `Arrays::equals`, and can be removed – 
I'm exploring this in #28717.

src/java.base/share/classes/java/lang/StringLatin1.java line 493:

> 491:         byte first = str[0];
> 492:         int max = (valueToIndex - strToIndex);
> 493:         for (int i = valueFromIndex; i <= max; i++) {

Note that the earlier code used `valueCount` – the same `Count`-suffixed 
variables are used at the intrinsics too. Though as can be seen from these two 
lines, what is meant is a `ToIndex`. That is, `valueCount` does *not* denote 
_"the count of characters"_ after the from index, but instead it denotes _"the 
(exclusive) index of the last character"_. I've updated the Java code to 
reflect this, though I've not touched the intrinsic.

Note that the same issue (and the correction) is present in the 
`StringUTF16::indexOf` family too.

src/java.base/share/classes/java/lang/StringUTF16.java line 1671:

> 1669: 
> 1670:     // inflatedCopy byte[] -> byte[]
> 1671:     static void inflate(byte[] src, int srcOff, byte[] dst, int dstOff, 
> int len) {

Moved this to `StringLatin1`, which happens to be the only caller of this 
method.

-------------

PR Review Comment: https://git.openjdk.org/jdk/pull/28832#discussion_r2620787257
PR Review Comment: https://git.openjdk.org/jdk/pull/28832#discussion_r2620776159
PR Review Comment: https://git.openjdk.org/jdk/pull/28832#discussion_r2620792767

Reply via email to