On Tue, 5 Nov 2024 14:20:32 GMT, Per Minborg <pminb...@openjdk.org> wrote:
>>> Also, don't we already check the alignment before when calling >>> `checkMemberOffset`? Why is it checked again here? >> >> Good catch. > >> What happens here if an element is already aligned, and `padding.byteSize() >> == element.byteAlignment()`? e.g. >> `MemoryLayout.structLayout(MemoryLayout.paddingLayout(4), >> ValueLayout.JAVA_INT)`? > > This is an error that existed before this PR. On the main branch: > > > @Test > public void alignedByInitialPadding() { > Linker linker = Linker.nativeLinker(); > var struct = MemoryLayout.structLayout( > MemoryLayout.paddingLayout(Integer.BYTES), > JAVA_INT); > var fd = FunctionDescriptor.of(struct, struct, struct); > linker.downcallHandle(fd); > } > > > would produce: > > > test TestLinker.alignedByInitialPadding(): failure > java.lang.IllegalArgumentException: Member layout 'i4', of '[x4i4]' found at > unexpected offset: 4 != 0 > at > java.base/jdk.internal.foreign.abi.AbstractLinker.checkMemberOffset(AbstractLinker.java:235) > at > java.base/jdk.internal.foreign.abi.AbstractLinker.checkLayoutRecursive(AbstractLinker.java:195) > at > java.base/jdk.internal.foreign.abi.AbstractLinker.checkLayout(AbstractLinker.java:176) > at java.base/java.util.Optional.ifPresent(Optional.java:178) > at > java.base/jdk.internal.foreign.abi.AbstractLinker.checkLayouts(AbstractLinker.java:167) > at > java.base/jdk.internal.foreign.abi.AbstractLinker.downcallHandle0(AbstractLinker.java:98) > at > java.base/jdk.internal.foreign.abi.AbstractLinker.downcallHandle(AbstractLinker.java:92) > at TestLinker.alignedByInitialPadding(TestLinker.java:160) > at > java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104) I've raised a separate issue for this: https://bugs.openjdk.org/browse/JDK-8343620 ------------- PR Review Comment: https://git.openjdk.org/jdk/pull/21041#discussion_r1829445374