On Wed, 5 Feb 2025 23:41:19 GMT, Chen Liang <li...@openjdk.org> wrote:

> `MethodHandles.byteArrayViewVarHandle` exposes checked multi-byte access to 
> byte arrays via VarHandle. This larger access speeds up many operations, yet 
> it cannot be used in early bootstrap, and as a result, people tend to use 
> `Unsafe` which can threaten memory safety of the Java Platform.
> 
> To promote the safe use of multi-byte access, I propose to move the checked 
> implementations from VarHandle to ByteArray to allow earlier use and reduce 
> maintenance costs. In addition, ByteArrayLittleEndian is consolidated, and 
> now the access methods are distinguished by BO (byte order) / BE (big endian) 
> / LE (little endian) suffixes to indicate their access features.

test/jdk/jdk/internal/util/ByteArray/Types.java line 27:

> 25:  * @test
> 26:  * @bug 8349503
> 27:  * @library /test/lib

Suggestion:

 * @library /test/lib
 * @key randomness

test/jdk/jdk/internal/util/ByteArray/Types.java line 64:

> 62:                 new ReadCase<>("u2", ByteArray::getUnsignedShortBO, 
> ByteArray::getUnsignedShortBE, ByteArray::getUnsignedShortLE, 2, u2 -> ((u2 
> >> Byte.SIZE) & 0xFF) | ((u2 << Byte.SIZE) & 0xFF00), 
> Comparator.naturalOrder()),
> 63:                 new ReadCase<>("int", ByteArray::getIntBO, 
> ByteArray::getIntBE, ByteArray::getIntLE, Integer.BYTES, 
> Integer::reverseBytes, Comparator.naturalOrder()),
> 64:                 new ReadCase<>("float", ByteArray::getFloatBO, 
> ByteArray::getFloatBE, ByteArray::getFloatLE, Float.BYTES, null, 
> Comparator.comparing(Float::floatToRawIntBits)),

Would it be possible to have a local `reverseBytes` for `float` and `double` as 
well?

test/jdk/jdk/internal/util/ByteArray/Types.java line 124:

> 122:                 new WriteCase<>("int", ByteArray::setIntBO, 
> ByteArray::setIntBE, ByteArray::setIntLE, Integer.BYTES, List.of(42)),
> 123:                 new WriteCase<>("float", ByteArray::setFloatBO, 
> ByteArray::setFloatBE, ByteArray::setFloatLE, Float.BYTES, List.of(Float.NaN, 
> Float.intBitsToFloat(0x7FF23847))),
> 124:                 new WriteCase<>("float raw", ByteArray::setFloatRawBO, 
> ByteArray::setFloatRawBE, ByteArray::setFloatRawLE, Float.BYTES, 
> List.of(1.0F)),

Raw seems to be exercised only on unproblematic cases, not on NaNs.

Similarly for "double raw".

test/jdk/jdk/internal/util/ByteArray/Types.java line 152:

> 150:         assertThrows(IndexOutOfBoundsException.class, () -> 
> leWriter.set(arr, arrayLen - size + 1, value));
> 151: 
> 152:         int index = 0;

This is always 0.

test/jdk/jdk/internal/util/ByteArray/Types.java line 173:

> 171:             var arrBe1 = arr.clone();
> 172:             beWriter.set(arrBe1, index, v1);
> 173:             assertArrayEquals(arrBe, arrBe1);

What about the little-endian case?

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

PR Review Comment: https://git.openjdk.org/jdk/pull/23478#discussion_r1944742266
PR Review Comment: https://git.openjdk.org/jdk/pull/23478#discussion_r1944786100
PR Review Comment: https://git.openjdk.org/jdk/pull/23478#discussion_r1944783068
PR Review Comment: https://git.openjdk.org/jdk/pull/23478#discussion_r1944769063
PR Review Comment: https://git.openjdk.org/jdk/pull/23478#discussion_r1944772926

Reply via email to