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.
63 lines
1.9 KiB
63 lines
1.9 KiB
//! This is an example of working with multi-value modules and dealing with
|
|
//! multi-value functions.
|
|
//!
|
|
//! Note that the `Func::wrap*` interfaces cannot be used to return multiple
|
|
//! values just yet, so we need to use the more dynamic `Func::new` and
|
|
//! `Func::call` methods.
|
|
|
|
// You can execute this example with `cargo run --example multi`
|
|
|
|
use anyhow::Result;
|
|
|
|
fn main() -> Result<()> {
|
|
use wasmtime::*;
|
|
|
|
println!("Initializing...");
|
|
let engine = Engine::default();
|
|
let mut store = Store::new(&engine, ());
|
|
|
|
// Compile.
|
|
println!("Compiling module...");
|
|
let module = Module::from_file(&engine, "examples/multi.wat")?;
|
|
|
|
// Create a host function which takes multiple parameters and returns
|
|
// multiple results.
|
|
println!("Creating callback...");
|
|
let callback_func = Func::wrap(&mut store, |a: i32, b: i64| -> (i64, i32) {
|
|
(b + 1, a + 1)
|
|
});
|
|
|
|
// Instantiate.
|
|
println!("Instantiating module...");
|
|
let instance = Instance::new(&mut store, &module, &[callback_func.into()])?;
|
|
|
|
// Extract exports.
|
|
println!("Extracting export...");
|
|
let g = instance.get_typed_func::<(i32, i64), (i64, i32)>(&mut store, "g")?;
|
|
|
|
// Call `$g`.
|
|
println!("Calling export \"g\"...");
|
|
let (a, b) = g.call(&mut store, (1, 3))?;
|
|
|
|
println!("Printing result...");
|
|
println!("> {} {}", a, b);
|
|
|
|
assert_eq!(a, 4);
|
|
assert_eq!(b, 2);
|
|
|
|
// Call `$round_trip_many`.
|
|
println!("Calling export \"round_trip_many\"...");
|
|
let round_trip_many = instance
|
|
.get_typed_func::<
|
|
(i64, i64, i64, i64, i64, i64, i64, i64, i64, i64),
|
|
(i64, i64, i64, i64, i64, i64, i64, i64, i64, i64),
|
|
>
|
|
(&mut store, "round_trip_many")?;
|
|
let results = round_trip_many.call(&mut store, (0, 1, 2, 3, 4, 5, 6, 7, 8, 9))?;
|
|
|
|
println!("Printing result...");
|
|
println!("> {:?}", results);
|
|
assert_eq!(results, (0, 1, 2, 3, 4, 5, 6, 7, 8, 9));
|
|
|
|
Ok(())
|
|
}
|
|
|