Files
wasmtime/tests/all/component_model/bindgen.rs
Alex Crichton 545749b279 Fix some wit-bindgen-related issues with generated bindings (#5692)
* Prefix component-bindgen-generated-functions with `call_`

This fixes clashes between Rust-native methods and the methods
themselves. For example right now `new` is a Rust-generated function for
constructing the wrapper but this can conflict with a world-exported
function called `new`.

Closes #5585

* Fix types being both shared and owned

This refactors some inherited cruft from the original `wit-bindgen`
repository to be more Wasmtime-specific and fixes a codegen case where
a type was used in both a shared and an owned context.

Closes #5688
2023-02-02 11:54:35 -06:00

116 lines
2.9 KiB
Rust

use super::engine;
use anyhow::Result;
use wasmtime::{
component::{Component, Linker},
Store,
};
mod results;
mod no_imports {
use super::*;
wasmtime::component::bindgen!({
inline: "
default world no-imports {
export foo: interface {
foo: func()
}
export bar: func()
}
",
});
#[test]
fn run() -> Result<()> {
let engine = engine();
let component = Component::new(
&engine,
r#"
(component
(core module $m
(func (export ""))
)
(core instance $i (instantiate $m))
(func $f (export "bar") (canon lift (core func $i "")))
(instance $i (export "foo" (func $f)))
(export "foo" (instance $i))
)
"#,
)?;
let linker = Linker::new(&engine);
let mut store = Store::new(&engine, ());
let (no_imports, _) = NoImports::instantiate(&mut store, &component, &linker)?;
no_imports.call_bar(&mut store)?;
no_imports.foo().call_foo(&mut store)?;
Ok(())
}
}
mod one_import {
use super::*;
wasmtime::component::bindgen!({
inline: "
default world one-import {
import foo: interface {
foo: func()
}
export bar: func()
}
",
});
#[test]
fn run() -> Result<()> {
let engine = engine();
let component = Component::new(
&engine,
r#"
(component
(import "foo" (instance $i
(export "foo" (func))
))
(core module $m
(import "" "" (func))
(export "" (func 0))
)
(core func $f (canon lower (func $i "foo")))
(core instance $i (instantiate $m
(with "" (instance (export "" (func $f))))
))
(func $f (export "bar") (canon lift (core func $i "")))
)
"#,
)?;
#[derive(Default)]
struct MyImports {
hit: bool,
}
impl foo::Foo for MyImports {
fn foo(&mut self) -> Result<()> {
self.hit = true;
Ok(())
}
}
let mut linker = Linker::new(&engine);
foo::add_to_linker(&mut linker, |f: &mut MyImports| f)?;
let mut store = Store::new(&engine, MyImports::default());
let (one_import, _) = OneImport::instantiate(&mut store, &component, &linker)?;
one_import.call_bar(&mut store)?;
assert!(store.data().hit);
Ok(())
}
}