On Wed, 27 Nov 2024 16:41:39 GMT, Jorn Vernee <jver...@openjdk.org> 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