From 10ab66b98b8bc1feac2227ea21f2a5799d30015a Mon Sep 17 00:00:00 2001 From: Alex Crichton Date: Mon, 25 Mar 2024 08:13:39 -0700 Subject: [PATCH] Slightly improve error message of feeding components to `Module` APIs This commit slightly improves the error message of feeding a component into a module-taking API. This at least tries to convey that a component was recognized but a module was expected. --- crates/environ/src/module_environ.rs | 22 +++++++++++----------- tests/all/module.rs | 12 ++++++++++++ 2 files changed, 23 insertions(+), 11 deletions(-) diff --git a/crates/environ/src/module_environ.rs b/crates/environ/src/module_environ.rs index 0c2868a48e46..c96c74b5c4da 100644 --- a/crates/environ/src/module_environ.rs +++ b/crates/environ/src/module_environ.rs @@ -8,6 +8,7 @@ use crate::{ Tunables, TypeConvert, TypeIndex, Unsigned, WasmError, WasmHeapType, WasmResult, WasmValType, WasmparserTypeConverter, }; +use anyhow::{bail, Result}; use std::borrow::Cow; use std::collections::HashMap; use std::path::PathBuf; @@ -182,7 +183,7 @@ impl<'a, 'data> ModuleEnvironment<'a, 'data> { mut self, parser: Parser, data: &'data [u8], - ) -> WasmResult> { + ) -> Result> { self.result.wasm = data; for payload in parser.parse_all(data) { @@ -192,7 +193,7 @@ impl<'a, 'data> ModuleEnvironment<'a, 'data> { Ok(self.result) } - fn translate_payload(&mut self, payload: Payload<'data>) -> WasmResult<()> { + fn translate_payload(&mut self, payload: Payload<'data>) -> Result<()> { match payload { Payload::Version { num, @@ -203,7 +204,7 @@ impl<'a, 'data> ModuleEnvironment<'a, 'data> { match encoding { Encoding::Module => {} Encoding::Component => { - return Err(WasmError::Unsupported(format!("component model"))); + bail!("expected a WebAssembly module but was given a WebAssembly component") } } } @@ -324,7 +325,7 @@ impl<'a, 'data> ModuleEnvironment<'a, 'data> { TableInitialValue::GlobalGet(index) } s => { - return Err(WasmError::Unsupported(format!( + bail!(WasmError::Unsupported(format!( "unsupported init expr in table section: {:?}", s ))); @@ -388,7 +389,7 @@ impl<'a, 'data> ModuleEnvironment<'a, 'data> { GlobalInit::GetGlobal(GlobalIndex::from_u32(global_index)) } s => { - return Err(WasmError::Unsupported(format!( + bail!(WasmError::Unsupported(format!( "unsupported init expr in global section: {:?}", s ))); @@ -479,7 +480,7 @@ impl<'a, 'data> ModuleEnvironment<'a, 'data> { TableElementExpression::GlobalGet(global) } s => { - return Err(WasmError::Unsupported(format!( + bail!(WasmError::Unsupported(format!( "unsupported init expr in element section: {:?}", s ))); @@ -504,7 +505,7 @@ impl<'a, 'data> ModuleEnvironment<'a, 'data> { (Some(GlobalIndex::from_u32(global_index)), 0) } ref s => { - return Err(WasmError::Unsupported(format!( + bail!(WasmError::Unsupported(format!( "unsupported init expr in element section: {:?}", s ))); @@ -625,7 +626,7 @@ impl<'a, 'data> ModuleEnvironment<'a, 'data> { (Some(GlobalIndex::from_u32(global_index)), 0) } s => { - return Err(WasmError::Unsupported(format!( + bail!(WasmError::Unsupported(format!( "unsupported init expr in data section: {:?}", s ))); @@ -673,7 +674,7 @@ impl<'a, 'data> ModuleEnvironment<'a, 'data> { Payload::CustomSection(s) if s.name() == "webidl-bindings" || s.name() == "wasm-interface-types" => { - return Err(WasmError::Unsupported( + bail!( "\ Support for interface types has temporarily been removed from `wasmtime`. @@ -685,8 +686,7 @@ and for re-adding support for interface types you can see this issue: https://github.com/bytecodealliance/wasmtime/issues/677 " - .to_string(), - )) + ) } Payload::CustomSection(s) => { diff --git a/tests/all/module.rs b/tests/all/module.rs index b9989b349729..05a74df8ff1a 100644 --- a/tests/all/module.rs +++ b/tests/all/module.rs @@ -238,3 +238,15 @@ fn large_add_chain_no_stack_overflow() -> Result<()> { Ok(()) } + +#[test] +fn compile_a_component() -> Result<()> { + let engine = Engine::default(); + let err = Module::new(&engine, "(component)").unwrap_err(); + let err = format!("{err:?}"); + assert!( + err.contains("expected a WebAssembly module but was given a WebAssembly component"), + "bad error: {err}" + ); + Ok(()) +}