Skip to content

Commit 71d279a

Browse files
committed
wasi-headers: unions are tagged now
1 parent 3af7707 commit 71d279a

1 file changed

Lines changed: 42 additions & 12 deletions

File tree

tools/wasi-headers/src/c_header.rs

Lines changed: 42 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -308,23 +308,36 @@ fn print_struct(ret: &mut String, name: &Id, s: &StructDatatype) {
308308
}
309309

310310
fn print_union(ret: &mut String, name: &Id, u: &UnionDatatype) {
311-
ret.push_str(&format!("typedef union __wasi_{}_t {{\n", ident_name(name)));
311+
ret.push_str(&format!(
312+
"typedef union __wasi_{}_u_t {{\n",
313+
ident_name(name)
314+
));
312315

313316
for variant in &u.variants {
314-
if !variant.docs.is_empty() {
315-
ret.push_str(" /**\n");
316-
for line in variant.docs.lines() {
317-
ret.push_str(&format!(" * {}\n", line));
317+
if let Some(ref tref) = variant.tref {
318+
if !variant.docs.is_empty() {
319+
ret.push_str(" /**\n");
320+
for line in variant.docs.lines() {
321+
ret.push_str(&format!(" * {}\n", line));
322+
}
323+
ret.push_str(" */\n");
318324
}
319-
ret.push_str(" */\n");
325+
ret.push_str(&format!(
326+
" {} {};\n",
327+
typeref_name(tref),
328+
ident_name(&variant.name)
329+
));
320330
}
321-
ret.push_str(&format!(
322-
" {} {};\n",
323-
typeref_name(&variant.tref),
324-
ident_name(&variant.name)
325-
));
326-
ret.push_str("\n");
327331
}
332+
ret.push_str(&format!("}} __wasi_{}_u_t;\n", ident_name(name)));
333+
334+
ret.push_str(&format!(
335+
"typedef struct __wasi_{}_t {{\n",
336+
ident_name(name)
337+
));
338+
339+
ret.push_str(&format!(" {} tag;\n", typeref_name(&u.tag)));
340+
ret.push_str(&format!(" __wasi_{}_u_t u;\n", ident_name(name)));
328341

329342
ret.push_str(&format!("}} __wasi_{}_t;\n", ident_name(name)));
330343
ret.push_str("\n");
@@ -340,6 +353,23 @@ fn print_union(ret: &mut String, name: &Id, u: &UnionDatatype) {
340353
u.mem_align()
341354
));
342355

356+
let l = u.union_layout();
357+
ret.push_str(&format!(
358+
"_Static_assert(offsetof(__wasi_{}_t, u) == {}, \"witx calculated union offset\");\n",
359+
ident_name(name),
360+
l.contents_offset,
361+
));
362+
ret.push_str(&format!(
363+
"_Static_assert(sizeof(__wasi_{}_u_t) == {}, \"witx calculated union size\");\n",
364+
ident_name(name),
365+
l.contents_size,
366+
));
367+
ret.push_str(&format!(
368+
"_Static_assert(_Alignof(__wasi_{}_u_t) == {}, \"witx calculated union align\");\n",
369+
ident_name(name),
370+
l.contents_align,
371+
));
372+
343373
ret.push_str("\n");
344374
}
345375

0 commit comments

Comments
 (0)