xref: /wasmtime-44.0.1/examples/multi.rs (revision 94740588)
1 //! This is an example of working with multi-value modules and dealing with
2 //! multi-value functions.
3 //!
4 //! Note that the `Func::wrap*` interfaces cannot be used to return multiple
5 //! values just yet, so we need to use the more dynamic `Func::new` and
6 //! `Func::call` methods.
7 
8 // You can execute this example with `cargo run --example multi`
9 
10 use wasmtime::Result;
11 
main() -> Result<()>12 fn main() -> Result<()> {
13     use wasmtime::*;
14 
15     println!("Initializing...");
16     let engine = Engine::default();
17     let mut store = Store::new(&engine, ());
18 
19     // Compile.
20     println!("Compiling module...");
21     let module = Module::from_file(&engine, "examples/multi.wat")?;
22 
23     // Create a host function which takes multiple parameters and returns
24     // multiple results.
25     println!("Creating callback...");
26     let callback_func = Func::wrap(&mut store, |a: i32, b: i64| -> (i64, i32) {
27         (b + 1, a + 1)
28     });
29 
30     // Instantiate.
31     println!("Instantiating module...");
32     let instance = Instance::new(&mut store, &module, &[callback_func.into()])?;
33 
34     // Extract exports.
35     println!("Extracting export...");
36     let g = instance.get_typed_func::<(i32, i64), (i64, i32)>(&mut store, "g")?;
37 
38     // Call `$g`.
39     println!("Calling export \"g\"...");
40     let (a, b) = g.call(&mut store, (1, 3))?;
41 
42     println!("Printing result...");
43     println!("> {a} {b}");
44 
45     assert_eq!(a, 4);
46     assert_eq!(b, 2);
47 
48     // Call `$round_trip_many`.
49     println!("Calling export \"round_trip_many\"...");
50     let round_trip_many = instance
51         .get_typed_func::<
52         (i64, i64, i64, i64, i64, i64, i64, i64, i64, i64),
53         (i64, i64, i64, i64, i64, i64, i64, i64, i64, i64),
54         >
55         (&mut store, "round_trip_many")?;
56     let results = round_trip_many.call(&mut store, (0, 1, 2, 3, 4, 5, 6, 7, 8, 9))?;
57 
58     println!("Printing result...");
59     println!("> {results:?}");
60     assert_eq!(results, (0, 1, 2, 3, 4, 5, 6, 7, 8, 9));
61 
62     Ok(())
63 }
64