On Wed, 27 Nov 2024 16:57:49 GMT, Quan Anh Mai <[email protected]> wrote:
>> test/jdk/java/foreign/TestByteBuffer.java line 414:
>>
>>> 412: ByteBuffer bb;
>>> 413: try (Arena arena = Arena.ofConfined()) {
>>> 414: MemorySegment segment = arena.allocate(bytes, Long.BYTES);
>>
>> Why does this segment need to be aligned?
>
> Because the `bufferHandle` here iterates through all kinds of element types:
>
> @DataProvider(name = "bufferHandleOps")
> public static Object[][] bufferHandleOps() throws Throwable {
> return new Object[][]{
> { MethodHandles.byteBufferViewVarHandle(char[].class,
> ByteOrder.nativeOrder()) },
> { MethodHandles.byteBufferViewVarHandle(short[].class,
> ByteOrder.nativeOrder()) },
> { MethodHandles.byteBufferViewVarHandle(int[].class,
> ByteOrder.nativeOrder()) },
> { MethodHandles.byteBufferViewVarHandle(long[].class,
> ByteOrder.nativeOrder()) },
> { MethodHandles.byteBufferViewVarHandle(float[].class,
> ByteOrder.nativeOrder()) },
> { MethodHandles.byteBufferViewVarHandle(double[].class,
> ByteOrder.nativeOrder()) }
>
> The test then does all kind of accesses on these:
>
> static Map<MethodHandle, Object[]> varHandleMembers(ByteBuffer bb,
> VarHandle handle) {
> Map<MethodHandle, Object[]> members = new HashMap<>();
> for (VarHandle.AccessMode mode : VarHandle.AccessMode.values()) {
> Class<?>[] params = handle.accessModeType(mode).parameterArray();
> Object[] args = Stream.concat(Stream.of(bb),
> Stream.of(params).skip(1)
> .map(TestByteBuffer::defaultValue))
> .toArray();
> try {
> members.put(MethodHandles.varHandleInvoker(mode,
> handle.accessModeType(mode)), args);
> } catch (Throwable ex) {
> throw new AssertionError(ex);
> }
> }
> return members;
> }
>
> And for access other than plain `get` and `set`, the natural alignment is
> required.
Ok, thanks for the explanation.
-------------
PR Review Comment: https://git.openjdk.org/jdk/pull/22415#discussion_r1861172810