On Fri, 2 Feb 2024 16:40:45 GMT, Raffaello Giulietti <rgiulie...@openjdk.org> 
wrote:

>> src/java.base/share/classes/java/lang/String.java line 2506:
>> 
>>> 2504:         fromIndex = Math.max(0, fromIndex);
>>> 2505:         return isLatin1() ? StringLatin1.indexOf(value, ch, 
>>> fromIndex, value.length)
>>> 2506:                 : StringUTF16.indexOf(value, ch, fromIndex, 
>>> value.length >> 1);
>> 
>> This needs to include the check for `fromIndex >= this.length()`:
>> Suggestion:
>> 
>>         fromIndex = Math.max(0, fromIndex);
>>         int toIndex = length();
>>         if (fromIndex >= toIndex) {
>>             return -1;
>>         }
>>         return isLatin1()
>>                 ? StringLatin1.indexOf(value, ch, fromIndex, toIndex)
>>                 : StringUTF16.indexOf(value, ch, fromIndex, toIndex);
>
> I don't think so.
> If you deeply follow the invoked `indexOf()` methods, there's either a check 
> later, or the loop conditions are false on entry (although I'm not sure about 
> the intrinsic methods).

While not directly observable (all tests pass) then sadly the intrinsic 
implementation emits a string range check that triggers a decompilation and 
subsequent compilation without the intrinsic if you'd call with a `fromIndex` 
with values greater than `length()` (equal to should be fine). I'll try out 
some options here.

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

PR Review Comment: https://git.openjdk.org/jdk/pull/17685#discussion_r1476907109

Reply via email to