diff --git a/crates/environ/src/component/translate.rs b/crates/environ/src/component/translate.rs index d7fbb173b3..387bd48bb5 100644 --- a/crates/environ/src/component/translate.rs +++ b/crates/environ/src/component/translate.rs @@ -622,8 +622,31 @@ impl<'a, 'data> Translator<'a, 'data> { self.result .initializers .push(LocalInitializer::Export(item)); - if let ComponentItem::Type(ty) = item { - self.types.push_component_typedef(ty); + + // Exports create a new index, so push the item onto the + // appropriate list. + match item { + ComponentItem::Func(idx) => { + self.result + .component_funcs + .push(self.result.component_funcs[idx]); + } + ComponentItem::Module(_idx) => { + // We don't need to do anything here for modules as + // the type information isn't tracked in the initial + // translation pass. + } + ComponentItem::Component(idx) => { + self.result.components.push(self.result.components[idx]); + } + ComponentItem::ComponentInstance(idx) => { + self.result + .component_instances + .push(self.result.component_instances[idx]); + } + ComponentItem::Type(ty) => { + self.types.push_component_typedef(ty); + } } } } diff --git a/tests/misc_testsuite/component-model/aliasing.wast b/tests/misc_testsuite/component-model/aliasing.wast new file mode 100644 index 0000000000..ad18f9354c --- /dev/null +++ b/tests/misc_testsuite/component-model/aliasing.wast @@ -0,0 +1,29 @@ +(component + (component + (component + (component) + (instance (instantiate 0)) + (export "a" (instance 0)) + ) + (instance (instantiate 0)) + (export "a" (instance 0)) + ) + + (instance (instantiate 0)) ;; instance 0 + (alias export 0 "a" (instance)) ;; instance 1 + (export "a" (instance 1)) ;; instance 2 + (alias export 2 "a" (instance)) ;; instance 3 + (export "inner-a" (instance 3)) ;; instance 4 +) + +(component + (component + (core module) + (export "a" (core module 0)) + ) + + (instance (instantiate 0)) + (alias export 0 "a" (core module)) ;; module 0 + (export "a" (core module 0)) ;; module 1 + (core instance (instantiate 1)) +)