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.
This commit is contained in:
Peter Huene
2023-03-27 17:18:48 -07:00
committed by GitHub
parent 82fcf3e562
commit 73f42bf817
2 changed files with 54 additions and 2 deletions

View File

@@ -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);
}
}
}
}

View File

@@ -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))
)