This is the implementation of a new method added to the JNI specification.

>From the CSR request:

The `GetStringUTFLength` function returns the length as a `jint` (`jsize`) 
value and so is limited to returning at most `Integer.MAX_VALUE`. But a Java 
string can itself consist of `Integer.MAX_VALUE` characters, each of which may 
require more than one byte to represent them in modified UTF-8 format.** It 
follows then that this function cannot return the correct answer for all String 
values and yet the specification makes no mention of this, nor of any possible 
error to report if this situation is encountered.

**The modified UTF-8 format used by the VM can require up to six bytes to 
represent one unicode character, but six byte characters are stored as UTF16 
surrogate pairs. Hence the most bytes per character is 3, and so the maximum 
length is 3*`Integer.MAX_VALUE`. With compact strings this reduces to 
2*`Integer.MAX_VALUE`.

Solution

Deprecate the existing JNI `GetStringUTFLength` method noting that it may 
return a truncated length, and add a new method, JNI `GetStringUTFLengthAsLong` 
that returns the string length as a `jlong` value.

---

We also add a truncation warning to `GetStringUTFLength` under -Xcheck:jni

There are some incidental whitespace changes in 
`src/hotspot/os/posix/dtrace/hotspot_jni.d` along with the new method entries.

Testing:
 - new test added
 - tiers 1-3 sanity

Thanks

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

Commit messages:
 - Test adjustments
 - 8328877: [JNI] The JNI Specification needs to address the limitations of 
integer UTF-8 String lengths
 - Merge
 - Initial commit before splitting out UTF8 changes

Changes: https://git.openjdk.org/jdk/pull/20784/files
  Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=20784&range=00
  Issue: https://bugs.openjdk.org/browse/JDK-8328877
  Stats: 203 lines in 7 files changed: 180 ins; 1 del; 22 mod
  Patch: https://git.openjdk.org/jdk/pull/20784.diff
  Fetch: git fetch https://git.openjdk.org/jdk.git pull/20784/head:pull/20784

PR: https://git.openjdk.org/jdk/pull/20784

Reply via email to