On Thu, 20 Jul 2023 09:25:31 GMT, Maurizio Cimadamore <mcimadam...@openjdk.org> 
wrote:

>> Glavo has updated the pull request with a new target base due to a merge or 
>> a rebase. The incremental webrev excludes the unrelated changes brought in 
>> by the merge/rebase. The pull request contains 15 additional commits since 
>> the last revision:
>> 
>>  - Merge branch 'openjdk:master' into unsafe
>>  - add 8310843 to @bug
>>  - Merge branch 'openjdk:master' into unsafe
>>  - Merge branch 'openjdk:master' into unsafe
>>  - delete incorrect comments
>>  - delete extraneous whitespace
>>  - add javadoc
>>  - delete extraneous whitespace
>>  - fix test
>>  - update tests
>>  - ... and 5 more: https://git.openjdk.org/jdk/compare/3f1edf8c...cb56e736
>
> src/java.base/share/classes/jdk/internal/util/ByteArray.java line 54:
> 
>> 52: 
>> 53:     @ForceInline
>> 54:     static long arrayOffset(byte[] array, int typeBytes, int offset) {
> 
> IMHO, this is the really interesting thing that this class does - e.g. it 
> introduces a way to translate a (logical) offset into a byte array into a 
> physical offset that can be used for unsafe. After you have an helper method 
> like this, it seems like the client can just do what it wants by using Unsafe 
> directly (which would remove the need for having this class) ? Was some 
> experiment of that kind done (e.g. replacing usage of ByteArray with Unsafe + 
> helpers) - or does it lead to code that is too cumbersome on the client?
> 
> Also, were ByteBuffers considered as an alternative? (I'm not suggesting 
> MemorySegment as those depend on VarHandle again, but a heap ByteBuffer is 
> just a thin wrapper around an array which uses Unsafe). ByteBuffer will have 
> a bound check, but so does your code (which call checkIndex). I believe that, 
> at least in hot code, wrapping a ByteBuffer around a byte array should be 
> routinely scalarized, as there's no control flow inside these little methods.

Actually, a byte buffer is big endian, so some extra code would be required. 
But maybe that's another helper function:


@ForceInline
ByteBuffer asBuffer(byte[] array) { return 
ByteBuffer.wrap(array).order(ByteOrder.nativeOrder()); }


And then replace:


ByteArray.getChar(array, 42)

With

asBuffer(array).getChar(42);

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

PR Review Comment: https://git.openjdk.org/jdk/pull/14636#discussion_r1269204424

Reply via email to