On Wed, 15 Jun 2022 21:24:04 GMT, Maurizio Cimadamore <mcimadam...@openjdk.org> 
wrote:

> While playing with the API, I've realized that some of the out of bound error 
> messgaes come out incorrectly.
> 
> This is because the bound check is performed as follows (to avoid overflow):
> 
> 
> Objects.checkIndex(offset, this.length - length + 1);
> 
> 
> So, if out-of-bounds access is detected, the resulting exception mentions the 
> values of the first and second parameter, respectively - but since the second 
> parameter is the result of a subtraction, it doesn't make sense.
> 
> The solution is not to use `Objects.checkIndex` directly, but, instead, drop 
> down one level, and pass our own "IOOB formatter":
> 
> 
> Preconditions.checkIndex(offset, this.length - length + 1, this);
> 
> 
> Note that, in order to recover the correct values, the formatter needs to 
> know the segment size - so I made `AbstractMemorySegment` act as a formatter 
> (so we don't need to allocate in such a hot path).
> 
> The fix seems to bring back the desired messages - but I would like some 
> confirmation that doing this won't disrupt intrinsification of the 
> `checkIndex` method.

I would expect passing an non-constant exception mapper should work. The C2 
intrinsic never accesses the exception mapper argument, and a range check 
failure results in a deoptimzation back to the interpreter from which the 
exception mapper is then operated on. However, i think its worth just double 
checking generated code.

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

PR: https://git.openjdk.org/jdk19/pull/24

Reply via email to