diff --git a/crates/cli-support/src/webidl/standard.rs b/crates/cli-support/src/webidl/standard.rs index 4ea750bb4fc..674f564d2e5 100644 --- a/crates/cli-support/src/webidl/standard.rs +++ b/crates/cli-support/src/webidl/standard.rs @@ -54,22 +54,32 @@ pub fn add_multi_value( // Finally, unset `return_via_outptr`, fix up its incoming bindings' // argument numberings, and update its function type. for (id, binding) in &mut bindings.exports { - if binding.return_via_outptr.take().is_some() { - if binding.incoming.is_empty() { - bail!("missing incoming binding expression for return pointer parameter"); - } - if !is_ret_ptr_bindings(binding.incoming.remove(0)) { - bail!("unexpected incoming binding expression for return pointer parameter"); - } + if binding.return_via_outptr.take().is_none() { + continue; + } + if binding.incoming.is_empty() { + bail!("missing incoming binding expression for return pointer parameter"); + } + if !is_ret_ptr_bindings(binding.incoming.remove(0)) { + bail!("unexpected incoming binding expression for return pointer parameter"); + } - fixup_binding_argument_gets(&mut binding.incoming)?; + fixup_binding_argument_gets(&mut binding.incoming)?; - let func = match module.exports.get(*id).item { - walrus::ExportItem::Function(f) => f, - _ => unreachable!(), - }; - binding.wasm_ty = module.funcs.get(func).ty(); - } + let func = match module.exports.get(*id).item { + walrus::ExportItem::Function(f) => f, + _ => unreachable!(), + }; + binding.wasm_ty = module.funcs.get(func).ty(); + + // Be sure to delete the out-param pointer from the WebIDL type as well. + let webidl_ty = bindings + .types + .get::(binding.webidl_ty) + .unwrap(); + let mut new_ty = webidl_ty.clone(); + new_ty.params.remove(0); + binding.webidl_ty = bindings.types.insert(new_ty); } Ok(())