On Tue, 16 May 2023 13:53:32 GMT, Maurizio Cimadamore <mcimadam...@openjdk.org> 
wrote:

> As explained in [1], memory layouts and memory segments describe sizes using 
> different units. Memory layouts use bits, whereas memory segments use bytes. 
> This is historical: memory layouts were designed after the Minimal LDL [2], 
> which allowed layout strings to be used to describe both memory *and* 
> register. In practice that ship has sailed, and the FFM API uses layouts to 
> firmly model the contents of regions of memory. While it would be possible, 
> in principle, to tweak segments to work on bits, changing that would have 
> implications on how easily code that is currently using ByteBuffer can 
> migrate to use MemorySegment.
> 
> For these reasons, this patch fixes the asymmetry so that layouts also model 
> sizes in term of bytes.
> 
> The patch is straightforward, although a bit tedious (as you can imagine), as 
> various uses of bit sizes had to be turned in byte sizes. In practice, the 
> migration had not been too hard, for the following reasons:
> 
> * the `withBitAlignment` and `bitSize` methods are no longer in the API, it 
> is easy to fix any code (mainly tests) using it;
> * most code already uses ready-made constants such as `JAVA_INT` - such code 
> continues to work unchanged;
> * the layout API de facto already required clients to work with bit sizes 
> that are a multiple of 8.
> 
> The only problematic case is the presence of the 
> `MemoryLayout::paddingLayout(long size)` factory. As this factory is changed 
> to deal in bytes instead of bits, all constants passed to this factory will 
> need to be updated. This is not a problem for code using jextract (as 
> jextract will take care of generating padding) but will be an issue for code 
> using the layout API directly.
> 
> [1] - https://mail.openjdk.org/pipermail/panama-dev/2023-May/019059.html

src/java.base/share/classes/jdk/internal/foreign/layout/ValueLayouts.java line 
155:

> 153:             assert isValidCarrier(carrier);
> 154:             assert carrier != MemorySegment.class
> 155:                     // MemorySegment byteSize must always equal 
> ADDRESS_SIZE_BITS

Suggestion:

                    // MemorySegment byteSize must always equal 
ADDRESS_SIZE_BYTES

test/jdk/java/foreign/TestIllegalLink.java line 122:

> 120:             {
> 121:                     
> FunctionDescriptor.ofVoid(C_INT.withByteAlignment(2)),
> 122:                     "Layout bit alignment must be natural alignment"

Suggestion:

                    "Layout byte alignment must be natural alignment"

And for all the other occurrences.

test/jdk/java/foreign/TestLayoutPaths.java line 49:

> 47: public class TestLayoutPaths {
> 48: 
> 49:     @Test(expectedExceptions = IllegalArgumentException.class)

Remove this test, since its is the same as the next one.

test/jdk/java/foreign/TestLayoutPaths.java line 185:

> 183:         for (int i = 0 ; i < 4 ; i++) {
> 184:             long bitOffset = g.byteOffset(groupSelector.apply(i));
> 185:             assertEquals(offsets[i], bitOffset);

Suggestion:

            long byteOffset = g.byteOffset(groupSelector.apply(i));
            assertEquals(offsets[i], byteOffset);

test/jdk/java/foreign/TestLayoutPaths.java line 236:

> 234:         for (int i = 0 ; i < 4 ; i++) {
> 235:             long bitOffset = g.byteOffset(sequenceElement(i));
> 236:             assertEquals(offsets[i], bitOffset);

Suggestion:

            long byteOffset = g.byteOffset(sequenceElement(i));
            assertEquals(offsets[i], byteOffset);

test/jdk/java/foreign/TestLayoutPaths.java line 246:

> 244:         byteOffsetHandle = byteOffsetHandle.asSpreader(long[].class, 
> indexes.length);
> 245:         long actualBitOffset = (long) 
> byteOffsetHandle.invokeExact(indexes);
> 246:         assertEquals(actualBitOffset, expectedByteOffset);

Suggestion:

        long actualByteOffset = (long) byteOffsetHandle.invokeExact(indexes);
        assertEquals(actualByteOffset, expectedByteOffset);

test/jdk/java/foreign/TestLayouts.java line 286:

> 284: 
> 285:     @Test(dataProvider="layoutsAndAlignments")
> 286:     public void testBadBitAlignment(MemoryLayout layout, long byteAlign) 
> {

Suggestion:

    public void testBadByteAlignment(MemoryLayout layout, long byteAlign) {

-------------

PR Review Comment: https://git.openjdk.org/jdk/pull/14013#discussion_r1197051902
PR Review Comment: https://git.openjdk.org/jdk/pull/14013#discussion_r1197057928
PR Review Comment: https://git.openjdk.org/jdk/pull/14013#discussion_r1197053576
PR Review Comment: https://git.openjdk.org/jdk/pull/14013#discussion_r1197054978
PR Review Comment: https://git.openjdk.org/jdk/pull/14013#discussion_r1197055501
PR Review Comment: https://git.openjdk.org/jdk/pull/14013#discussion_r1197056040
PR Review Comment: https://git.openjdk.org/jdk/pull/14013#discussion_r1197056551

Reply via email to