|
24 | 24 |
|
25 | 25 | /* |
26 | 26 | * =========================================================================== |
27 | | - * (c) Copyright IBM Corp. 2021, 2022 All Rights Reserved |
| 27 | + * (c) Copyright IBM Corp. 2021, 2023 All Rights Reserved |
28 | 28 | * =========================================================================== |
29 | 29 | */ |
30 | 30 |
|
@@ -148,21 +148,24 @@ MemoryLayout layout(List<StructFieldType> fields) { |
148 | 148 | long align = 0; |
149 | 149 | for (StructFieldType field : fields) { |
150 | 150 | MemoryLayout l = field.layout(); |
151 | | - /* Follow the calculation of padding in JDK19 which is based on |
152 | | - * the alignment of layout rather than the bit size. |
| 151 | + /* Use the padding calculation from JDK19+ which is based |
| 152 | + * on the alignment of the layout rather than its bit size. |
153 | 153 | */ |
154 | | - long padding = offset % l.bitAlignment(); |
155 | | - if (padding != 0) { |
| 154 | + long alignment = l.bitAlignment(); |
| 155 | + long padding = alignment - (offset % alignment); |
| 156 | + if (padding != alignment) { |
156 | 157 | layouts.add(MemoryLayout.paddingLayout(padding)); |
157 | 158 | offset += padding; |
158 | 159 | } |
159 | 160 | layouts.add(l.withName("field" + offset)); |
160 | 161 | align = Math.max(align, l.bitAlignment()); |
161 | 162 | offset += l.bitSize(); |
162 | 163 | } |
163 | | - long padding = offset % align; |
164 | | - if (padding != 0) { |
165 | | - layouts.add(MemoryLayout.paddingLayout(padding)); |
| 164 | + if (align != 0) { |
| 165 | + long padding = align - (offset % align); |
| 166 | + if (padding != align) { |
| 167 | + layouts.add(MemoryLayout.paddingLayout(padding)); |
| 168 | + } |
166 | 169 | } |
167 | 170 | return MemoryLayout.structLayout(layouts.toArray(new MemoryLayout[0])); |
168 | 171 | } else { |
|
0 commit comments