Skip to content

Commit cfc1d60

Browse files
authored
Fix size/align calculations for WIT variants (#948)
The previous calculation was incorrect for a type of the shape: variant foo { a(float64), b(tuple<float32, float32, float32>), } which caused codegen discrepancies between guests and Wasmtime where Wasmtime had the correct calculation. cc #526
1 parent ae010af commit cfc1d60

File tree

1 file changed

+9
-7
lines changed

1 file changed

+9
-7
lines changed

crates/wit-parser/src/sizealign.rs

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -110,17 +110,19 @@ impl SizeAlign {
110110
types: impl IntoIterator<Item = Option<&'a Type>>,
111111
) -> (usize, usize) {
112112
let (discrim_size, discrim_align) = int_size_align(tag);
113-
let mut size = discrim_size;
114-
let mut align = discrim_align;
113+
let mut case_size = 0;
114+
let mut case_align = 0;
115115
for ty in types {
116116
if let Some(ty) = ty {
117-
let case_size = self.size(ty);
118-
let case_align = self.align(ty);
119-
align = align.max(case_align);
120-
size = size.max(align_to(discrim_size, case_align) + case_size);
117+
case_size = case_size.max(self.size(ty));
118+
case_align = case_align.max(self.align(ty));
121119
}
122120
}
123-
(size, align)
121+
let align = discrim_align.max(case_align);
122+
(
123+
align_to(align_to(discrim_size, case_align) + case_size, align),
124+
align,
125+
)
124126
}
125127
}
126128

0 commit comments

Comments
 (0)