On Fri, 8 Dec 2023 19:50:30 GMT, Roger Riggs <rri...@openjdk.org> wrote:

>> In the compact string implementation of non-latin1 (UTF16) strings the 
>> length is constrained by VM implementation limit on the size a byte array 
>> that can be allocated. To produce a useful exception the implementation 
>> checks the string size against the maximum byte array size. The exception 
>> message is correct
>> 
>> "UTF16 String size is " + len + ", should be less than or equal to " + 
>> MAX_LENGTH
>> 
>> The code should match the message, otherwise the exception thrown is: 
>> 
>> java.lang.OutOfMemoryError: Requested array size exceeds VM limit
>
> Roger Riggs has updated the pull request incrementally with one additional 
> commit since the last revision:
> 
>   As suggested by reviewers
>   Correct exception message text
>   Removed unused imports

test/jdk/java/lang/String/CompactString/MaxSizeUTF16String.java line 53:

> 51:         int nonAsciiSize = nonAscii.length;
> 52:         int asciisize = byteSize - nonAsciiSize;
> 53:         byte[] arr = new byte[asciisize + nonAsciiSize];

Suggestion:

        byte[] arr = new byte[byteSize];

Note that `asciisize + nonAsciiSize` = `byteSize - nonAsciiSize + nonAsciiSize` 
= `byteSize`, even in the presence of overflows. Then `asciisize` becomes 
useless.

test/jdk/java/lang/String/CompactString/MaxSizeUTF16String.java line 54:

> 52:         int asciisize = byteSize - nonAsciiSize;
> 53:         byte[] arr = new byte[asciisize + nonAsciiSize];
> 54:         Arrays.fill(arr, (byte)'x');      // fill with latin1

`(byte) 0` is a valid UTF-8 sequence after all, so there is no need to fill the 
array with `'x'`.

test/jdk/java/lang/String/CompactString/MaxSizeUTF16String.java line 64:

> 62:         int nonAsciiSize = nonAscii.length;
> 63:         int asciisize = size - nonAsciiSize;
> 64:         char[] arr = new char[asciisize + nonAsciiSize];

Same as above

test/jdk/java/lang/String/CompactString/MaxSizeUTF16String.java line 65:

> 63:         int asciisize = size - nonAsciiSize;
> 64:         char[] arr = new char[asciisize + nonAsciiSize];
> 65:         Arrays.fill(arr, 'x');      // fill with latin1

Same as above

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

PR Review Comment: https://git.openjdk.org/jdk/pull/17008#discussion_r1420993528
PR Review Comment: https://git.openjdk.org/jdk/pull/17008#discussion_r1420993636
PR Review Comment: https://git.openjdk.org/jdk/pull/17008#discussion_r1420993740
PR Review Comment: https://git.openjdk.org/jdk/pull/17008#discussion_r1420993780

Reply via email to