@@ -308,23 +308,36 @@ fn print_struct(ret: &mut String, name: &Id, s: &StructDatatype) {
308308}
309309
310310fn 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