You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

175 lines
4.7 KiB

#![cfg(not(miri))]
use super::REALLOC_AND_FREE;
use anyhow::Result;
use wasmtime::component::*;
use wasmtime::{Module, Store, StoreContextMut};
#[test]
fn top_level_instance_two_level() -> Result<()> {
let component = r#"
(component
(import "c" (instance $i
(export "c" (instance
(export "m" (core module
(export "g" (global i32))
))
))
))
(component $c1
(import "c" (instance $i
(export "c" (instance
(export "m" (core module
(export "g" (global i32))
))
))
))
(core module $verify
(import "" "g" (global i32))
(func $start
global.get 0
i32.const 101
i32.ne
if unreachable end
)
(start $start)
)
(core instance $m (instantiate (module $i "c" "m")))
(core instance (instantiate $verify (with "" (instance $m))))
)
(instance (instantiate $c1 (with "c" (instance $i))))
)
"#;
let module = r#"
(module
(global (export "g") i32 i32.const 101)
)
"#;
let engine = super::engine();
let module = Module::new(&engine, module)?;
let component = Component::new(&engine, component)?;
let mut store = Store::new(&engine, ());
let mut linker = Linker::new(&engine);
linker.instance("c")?.instance("c")?.module("m", &module)?;
linker.instantiate(&mut store, &component)?;
Ok(())
}
#[test]
fn nested_many_instantiations() -> Result<()> {
let component = r#"
(component
(import "count" (func $count))
(component $c1
(import "count" (func $count))
(core func $count_lower (canon lower (func $count)))
(core module $m
(import "" "" (func $count))
(start $count)
)
(core instance (instantiate $m (with "" (instance (export "" (func $count_lower))))))
(core instance (instantiate $m (with "" (instance (export "" (func $count_lower))))))
)
(component $c2
(import "count" (func $count))
(instance (instantiate $c1 (with "count" (func $count))))
(instance (instantiate $c1 (with "count" (func $count))))
)
(component $c3
(import "count" (func $count))
(instance (instantiate $c2 (with "count" (func $count))))
(instance (instantiate $c2 (with "count" (func $count))))
)
(component $c4
(import "count" (func $count))
(instance (instantiate $c3 (with "count" (func $count))))
(instance (instantiate $c3 (with "count" (func $count))))
)
(instance (instantiate $c4 (with "count" (func $count))))
)
"#;
let engine = super::engine();
let component = Component::new(&engine, component)?;
let mut store = Store::new(&engine, 0);
let mut linker = Linker::new(&engine);
linker
.root()
.func_wrap("count", |mut store: StoreContextMut<'_, u32>, _: ()| {
*store.data_mut() += 1;
Ok(())
})?;
linker.instantiate(&mut store, &component)?;
assert_eq!(*store.data(), 16);
Ok(())
}
#[test]
fn thread_options_through_inner() -> Result<()> {
let component = format!(
r#"
(component
(import "hostfn" (func $host (param "a" u32) (result string)))
(component $c
(import "hostfn" (func $host (param "a" u32) (result string)))
(core module $libc
(memory (export "memory") 1)
{REALLOC_AND_FREE}
)
(core instance $libc (instantiate $libc))
(core func $host_lower
(canon lower
(func $host)
(memory $libc "memory")
(realloc (func $libc "realloc"))
)
)
(core module $m
(import "" "host" (func $host (param i32 i32)))
(import "libc" "memory" (memory 1))
(func (export "run") (param i32) (result i32)
i32.const 42
i32.const 100
call $host
i32.const 100
)
(export "memory" (memory 0))
)
(core instance $m (instantiate $m
(with "" (instance (export "host" (func $host_lower))))
(with "libc" (instance $libc))
))
(func (export "run") (param "a" u32) (result string)
(canon lift
(core func $m "run")
(memory $m "memory")
)
)
)
(instance $c (instantiate $c (with "hostfn" (func $host))))
(export "run" (func $c "run"))
)
"#
);
let engine = super::engine();
let component = Component::new(&engine, component)?;
let mut store = Store::new(&engine, 0);
let mut linker = Linker::new(&engine);
linker
.root()
.func_wrap("hostfn", |_, (param,): (u32,)| Ok((param.to_string(),)))?;
let instance = linker.instantiate(&mut store, &component)?;
let result = instance
.get_typed_func::<(u32,), (WasmStr,)>(&mut store, "run")?
.call(&mut store, (43,))?
.0;
assert_eq!(result.to_str(&store)?, "42");
Ok(())
}