On Wed, 27 Nov 2024 16:57:49 GMT, Quan Anh Mai <qa...@openjdk.org> 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