diff --git a/crates/wit-component/src/encoding.rs b/crates/wit-component/src/encoding.rs index 2665fbe2e2..92d03c3501 100644 --- a/crates/wit-component/src/encoding.rs +++ b/crates/wit-component/src/encoding.rs @@ -550,7 +550,7 @@ impl<'a> EncodingState<'a> { let info = &self.info.info; // Encode a shim instantiation if needed - let shims = self.encode_shim_instantiation(); + let shims = self.encode_shim_instantiation()?; // For each instance import into the main module create a // pseudo-core-wasm-module via a bag-of-exports. @@ -1117,7 +1117,7 @@ impl<'a> EncodingState<'a> { Ok(func_index) } - fn encode_shim_instantiation(&mut self) -> Shims<'a> { + fn encode_shim_instantiation(&mut self) -> Result> { let mut signatures = Vec::new(); let mut ret = Shims::default(); let info = &self.info.info; @@ -1138,7 +1138,8 @@ impl<'a> EncodingState<'a> { &required.funcs, info.metadata, &mut signatures, - ); + ) + .context("failed to register indirect shims for main module")?; } // For all required adapter modules a shim is created for each required @@ -1159,7 +1160,10 @@ impl<'a> EncodingState<'a> { &required.funcs, adapter.info.metadata, &mut signatures, - ); + ) + .with_context(|| { + format!("failed to register indirect shims for adapter {adapter_name}") + })?; } self.encode_resource_dtors( @@ -1205,7 +1209,7 @@ impl<'a> EncodingState<'a> { ); if ret.list.is_empty() { - return ret; + return Ok(ret); } for shim in ret.list.iter() { @@ -1302,7 +1306,7 @@ impl<'a> EncodingState<'a> { self.fixups_module_index = Some(self.component.core_module(&fixups)); self.shim_instance_index = Some(self.component.core_instantiate(shim_module_index, [])); - return ret; + return Ok(ret); fn to_wasm_type(ty: &wasmparser::ValType) -> WasmType { match ty { @@ -1792,7 +1796,7 @@ impl<'a> Shims<'a> { required: &IndexSet, metadata: &ModuleMetadata, sigs: &mut Vec, - ) { + ) -> Result<()> { let interface = if core_wasm_module == BARE_FUNC_MODULE_NAME { None } else { @@ -1811,8 +1815,15 @@ impl<'a> Shims<'a> { Lowering::Indirect { sig, options } => { sigs.push(sig.clone()); - let encoding = - metadata.import_encodings[&(core_wasm_module.to_string(), name.clone())]; + let encoding = *metadata + .import_encodings + .get(&(core_wasm_module.to_string(), name.clone())) + .ok_or_else(|| { + anyhow::anyhow!( + "missing component metadata for import of \ + `{core_wasm_module}::{name}`" + ) + })?; self.list.push(Shim { name: shim_name, debug_name: format!("indirect-{core_wasm_module}-{name}"), @@ -1827,6 +1838,7 @@ impl<'a> Shims<'a> { } } } + Ok(()) } } diff --git a/crates/wit-component/tests/components/error-missing-module-metadata/adapt-old.wat b/crates/wit-component/tests/components/error-missing-module-metadata/adapt-old.wat new file mode 100644 index 0000000000..deb5d349d6 --- /dev/null +++ b/crates/wit-component/tests/components/error-missing-module-metadata/adapt-old.wat @@ -0,0 +1,4 @@ +(module + (import "new" "log" (func $log (param i32 i32))) + (export "log" (func $log)) +) diff --git a/crates/wit-component/tests/components/error-missing-module-metadata/adapt-old.wit b/crates/wit-component/tests/components/error-missing-module-metadata/adapt-old.wit new file mode 100644 index 0000000000..5e15bfaeb0 --- /dev/null +++ b/crates/wit-component/tests/components/error-missing-module-metadata/adapt-old.wit @@ -0,0 +1,5 @@ +world adapt-old { + import new: interface { + log: func(s: string); + } +} diff --git a/crates/wit-component/tests/components/error-missing-module-metadata/error.txt b/crates/wit-component/tests/components/error-missing-module-metadata/error.txt new file mode 100644 index 0000000000..16f7797650 --- /dev/null +++ b/crates/wit-component/tests/components/error-missing-module-metadata/error.txt @@ -0,0 +1,4 @@ +failed to register indirect shims for main module + +Caused by: + missing component metadata for import of `new::log` \ No newline at end of file diff --git a/crates/wit-component/tests/components/error-missing-module-metadata/module.wat b/crates/wit-component/tests/components/error-missing-module-metadata/module.wat new file mode 100644 index 0000000000..d3cca54e6e --- /dev/null +++ b/crates/wit-component/tests/components/error-missing-module-metadata/module.wat @@ -0,0 +1,4 @@ +(module + (import "new" "log" (func $log (param i32 i32))) + (import "old" "log" (func (param i32 i32))) +) diff --git a/crates/wit-component/tests/components/error-missing-module-metadata/module.wit b/crates/wit-component/tests/components/error-missing-module-metadata/module.wit new file mode 100644 index 0000000000..84d41669ac --- /dev/null +++ b/crates/wit-component/tests/components/error-missing-module-metadata/module.wit @@ -0,0 +1,4 @@ +package foo:foo; + +world module { +}