RFR: 8345119: Some java/foreign tests wrongly assume aligned memory

Jorn Vernee jvernee at openjdk.org
Wed Nov 27 19:45:39 UTC 2024


On Wed, 27 Nov 2024 16:57:49 GMT, Quan Anh Mai <qamai at 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


More information about the core-libs-dev mailing list