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. Benchmarks looks all good except UnrolledAccess::handle_loop_instance. A quick PrintInlining revealed a missed inlining for `MemoryLayout.byteSize` which is called by `MemorySegment::getAtIndex`. This is an issue I spotted in the past, so we might just fix it now. ------------- PR: https://git.openjdk.org/jdk19/pull/24