#![cfg(not(miri))] use super::engine; use anyhow::Result; use wasmtime::{ component::{Component, Linker}, Store, }; mod ownership; mod results; mod no_imports { use super::*; wasmtime::component::bindgen!({ inline: " package foo:foo 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: " package foo:foo 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::Host 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(()) } }