From a29303dedd4face76b2f58ebc767f2013e8c7d13 Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Tue, 29 Oct 2019 14:24:36 -0700 Subject: [PATCH] Expand the muli-value example for wasmtime-api to use many return values This should exercise the Rust-calling-Wasm code path for when there are more return values than fit into return registers. --- crates/api/examples/multi.rs | 47 ++++++++++++++++++++++++++++----- crates/api/examples/multi.wasm | Bin 49 -> 114 bytes crates/api/examples/multi.wat | 15 +++++++++++ 3 files changed, 56 insertions(+), 6 deletions(-) diff --git a/crates/api/examples/multi.rs b/crates/api/examples/multi.rs index 9506c18ebe..e3d35c296e 100644 --- a/crates/api/examples/multi.rs +++ b/crates/api/examples/multi.rs @@ -51,19 +51,22 @@ fn main() -> Result<()> { .context("Error instantiating module!")?, ); - // Extract export. + // Extract exports. println!("Extracting export..."); let exports = Ref::map(instance.borrow(), |instance| instance.exports()); ensure!(!exports.is_empty(), "Error accessing exports!"); - let run_func = exports[0].func().context("Error accessing exports!")?; + let g = exports[0].func().context("> Error accessing export $g!")?; + let round_trip_many = exports[1] + .func() + .context("> Error accessing export $round_trip_many")?; - // Call. - println!("Calling export..."); + // Call `$g`. + println!("Calling export \"g\"..."); let args = vec![Val::I32(1), Val::I64(3)]; - let results = run_func + let results = g .borrow() .call(&args) - .map_err(|e| format_err!("> Error calling function: {:?}", e))?; + .map_err(|e| format_err!("> Error calling g! {:?}", e))?; println!("Printing result..."); println!("> {} {}", results[0].i64(), results[1].i32()); @@ -71,6 +74,38 @@ fn main() -> Result<()> { debug_assert_eq!(results[0].i64(), 4); debug_assert_eq!(results[1].i32(), 2); + // Call `$round_trip_many`. + println!("Calling export \"round_trip_many\"..."); + let args = vec![ + Val::I64(0), + Val::I64(1), + Val::I64(2), + Val::I64(3), + Val::I64(4), + Val::I64(5), + Val::I64(6), + Val::I64(7), + Val::I64(8), + Val::I64(9), + ]; + let results = round_trip_many + .borrow() + .call(&args) + .map_err(|e| format_err!("> Error calling round_trip_many! {:?}", e))?; + + println!("Printing result..."); + print!(">"); + for r in results.iter() { + print!(" {}", r.i64()); + } + println!(); + + debug_assert_eq!(results.len(), 10); + debug_assert!(args + .iter() + .zip(results.iter()) + .all(|(a, r)| a.i64() == r.i64())); + // Shut down. println!("Shutting down..."); drop(store); diff --git a/crates/api/examples/multi.wasm b/crates/api/examples/multi.wasm index 2b117daa8628f0fb9fe3e69d508571f718f81b12..9684f9fa1d998c4a3c10f104e634f80f8c454b8c 100644 GIT binary patch literal 114 zcmYkuy9$Fq6a>(@v&LtURHk(NG8IHgp%EWNn%!R)EP|&x=(foKSjCpX(}y2GtB}$bQCvb}wn*aa+ literal 49 zcmV~$u@QhE5CFluXHW(bN}x1NBr-CG*4^d)UIB|&>=kRrAwG~o&a4w_wJ;cV+7G1c B1rPuL diff --git a/crates/api/examples/multi.wat b/crates/api/examples/multi.wat index f26a857e17..cacd95504a 100644 --- a/crates/api/examples/multi.wat +++ b/crates/api/examples/multi.wat @@ -4,4 +4,19 @@ (func $g (export "g") (param i32 i64) (result i64 i32) (call $f (local.get 0) (local.get 1)) ) + + (func $round_trip_many + (export "round_trip_many") + (param i64 i64 i64 i64 i64 i64 i64 i64 i64 i64) + (result i64 i64 i64 i64 i64 i64 i64 i64 i64 i64) + local.get 0 + local.get 1 + local.get 2 + local.get 3 + local.get 4 + local.get 5 + local.get 6 + local.get 7 + local.get 8 + local.get 9) )