From 73f42bf81716a38dd6b0b586c3b86ac9324ed184 Mon Sep 17 00:00:00 2001 From: Peter Huene Date: Mon, 27 Mar 2023 17:18:48 -0700 Subject: [PATCH] Fix export translation for components. (#6108) * Fix export translation for components. Exports in the component model cause a new index to be added to the index space of the item being exported. This commit updates component translation so that translation of component export sections properly updates internal lists representing those index spaces. * Code review feedback. --- crates/environ/src/component/translate.rs | 27 +++++++++++++++-- .../component-model/aliasing.wast | 29 +++++++++++++++++++ 2 files changed, 54 insertions(+), 2 deletions(-) create mode 100644 tests/misc_testsuite/component-model/aliasing.wast 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)) +)