On Wed, 27 Nov 2024 16:41:39 GMT, Jorn Vernee <[email protected]> wrote:
>> Hi,
>>
>> This patch resolves some issues I found that the tests wrongly assume
>> sufficient alignment from the segment returned by `Arena::allocate`.
>>
>> Please take a look and leave your reviews, thanks a lot.
>
> 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.
-------------
PR Review Comment: https://git.openjdk.org/jdk/pull/22415#discussion_r1860998302