components: Fix support for 0-sized flags (#4560)

This commit goes through and updates support in the various argument
passing routines to support 0-sized flags. A bit of a degenerate case
but clarified in WebAssembly/component-model#76 as intentional.
This commit is contained in:
Alex Crichton
2022-08-01 11:05:09 -05:00
committed by GitHub
parent 05e6abf2f6
commit 893fadb485
9 changed files with 59 additions and 9 deletions

View File

@@ -210,7 +210,9 @@ fn make_echo_component(type_definition: &str, type_size: u32) -> String {
}
fn make_echo_component_with_params(type_definition: &str, params: &[Param]) -> String {
let func = if params.len() == 1 || params.len() > 16 {
let func = if params.len() == 0 {
format!("(func (export \"echo\"))")
} else if params.len() == 1 || params.len() > 16 {
let primitive = if params.len() == 1 {
params[0].0.primitive()
} else {

View File

@@ -426,6 +426,22 @@ fn enum_derive() -> Result<()> {
#[test]
fn flags() -> Result<()> {
let engine = super::engine();
let mut store = Store::new(&engine, ());
// Edge case of 0 flags
wasmtime::component::flags! {
Flags0 {}
}
assert_eq!(Flags0::default(), Flags0::default());
let component = Component::new(&engine, make_echo_component(r#"(flags)"#, 0))?;
let instance = Linker::new(&engine).instantiate(&mut store, &component)?;
let func = instance.get_typed_func::<(Flags0,), Flags0, _>(&mut store, "echo")?;
let output = func.call_and_post_return(&mut store, (Flags0::default(),))?;
assert_eq!(output, Flags0::default());
// Simple 8-bit flags
wasmtime::component::flags! {
Foo {
#[component(name = "foo-bar-baz")]
@@ -442,9 +458,6 @@ fn flags() -> Result<()> {
assert_eq!(Foo::default(), Foo::A ^ Foo::A);
assert_eq!(Foo::B | Foo::C, !Foo::A);
let engine = super::engine();
let mut store = Store::new(&engine, ());
// Happy path: component type matches flag count and names
let component = Component::new(