From e934a0f3d3c1de31eaf240a9c4861aefe6a15894 Mon Sep 17 00:00:00 2001 From: Alex Crichton Date: Tue, 19 Nov 2019 10:44:56 -0600 Subject: [PATCH] Support multi-value JS engines (#1863) This commit adds support to wasm-bindgen to run over interface types-enabled modules that use multi-value returns and returns are loaded from the returned array rather than from memory. --- crates/cli-support/src/js/binding.rs | 19 ++++++++++++++++--- crates/cli-support/src/wasm2es6js.rs | 2 +- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/crates/cli-support/src/js/binding.rs b/crates/cli-support/src/js/binding.rs index 5e62b5960ef..2154d7618a9 100644 --- a/crates/cli-support/src/js/binding.rs +++ b/crates/cli-support/src/js/binding.rs @@ -282,9 +282,22 @@ impl<'a, 'b> Builder<'a, 'b> { } } - // No return pointer? That's much easier! We just have one input - // of `ret` which is created in the JS shim below. - None => ret_args.push("ret".to_string()), + // No return pointer? That's much easier! + // + // If there's one return value we just have one input of `ret` + // which is created in the JS shim below. If there's multiple + // return values (a multi-value module) then we'll pull results + // from the returned array. + None => { + let amt = self.cx.module.types.get(binding.wasm_ty).results().len(); + if amt == 1 { + ret_args.push("ret".to_string()); + } else { + for i in 0..amt { + ret_args.push(format!("ret[{}]", i)); + } + } + } } js = JsBuilder::new(ret_args); let mut ret = outgoing::Outgoing::new(self.cx, &mut js); diff --git a/crates/cli-support/src/wasm2es6js.rs b/crates/cli-support/src/wasm2es6js.rs index b928bdbf4e2..07517af83fe 100644 --- a/crates/cli-support/src/wasm2es6js.rs +++ b/crates/cli-support/src/wasm2es6js.rs @@ -85,7 +85,7 @@ pub fn typescript(module: &Module) -> Result { ret = match ty.results().len() { 0 => "void", 1 => "number", - _ => bail!("cannot support multi-return yet"), + _ => "Array", }, )); }