* 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
116 lines
2.9 KiB
Rust
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(())
|
|
}
|
|
}
|