Skip to content

Commit 464aeab

Browse files
committed
Use ExportMap for naming component exports
Use the map's metadata to determine what the core wasm name is for each export instead of recalculating it in the encoder which would duplicate work done in validation.
1 parent c6c6792 commit 464aeab

File tree

1 file changed

+36
-3
lines changed

1 file changed

+36
-3
lines changed

crates/wit-component/src/encoding.rs

Lines changed: 36 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -615,6 +615,37 @@ impl<'a> EncodingState<'a> {
615615
CustomModule::Main => &self.info.encoder.main_module_exports,
616616
CustomModule::Adapter(name) => &self.info.encoder.adapters[name].required_exports,
617617
};
618+
if exports.is_empty() {
619+
return Ok(());
620+
}
621+
622+
let mut interface_func_core_names = IndexMap::new();
623+
let mut world_func_core_names = IndexMap::new();
624+
for (core_name, export) in self.info.exports_for(module).iter() {
625+
match export {
626+
Export::WorldFunc(name) => {
627+
let prev = world_func_core_names.insert(name, core_name);
628+
assert!(prev.is_none());
629+
}
630+
Export::InterfaceFunc(id, name) => {
631+
let prev = interface_func_core_names
632+
.entry(id)
633+
.or_insert(IndexMap::new())
634+
.insert(name.as_str(), core_name);
635+
assert!(prev.is_none());
636+
}
637+
Export::WorldFuncPostReturn(..)
638+
| Export::InterfaceFuncPostReturn(..)
639+
| Export::ResourceDtor(..)
640+
| Export::Memory
641+
| Export::GeneralPurposeRealloc
642+
| Export::GeneralPurposeExportRealloc
643+
| Export::GeneralPurposeImportRealloc
644+
| Export::Initialize
645+
| Export::ReallocForAdapter => continue,
646+
}
647+
}
648+
618649
let world = &resolve.worlds[self.info.encoder.metadata.world];
619650
for export_name in exports {
620651
let export_string = resolve.name_world_key(export_name);
@@ -623,13 +654,14 @@ impl<'a> EncodingState<'a> {
623654
let ty = self
624655
.root_import_type_encoder(None)
625656
.encode_func_type(resolve, func)?;
626-
let core_name = func.core_export_name(None);
657+
let core_name = world_func_core_names[&func.name];
627658
let idx = self.encode_lift(module, &core_name, None, func, ty)?;
628659
self.component
629660
.export(&export_string, ComponentExportKind::Func, idx, None);
630661
}
631662
WorldItem::Interface { id, .. } => {
632-
self.encode_interface_export(&export_string, module, *id)?;
663+
let core_names = interface_func_core_names.get(id);
664+
self.encode_interface_export(&export_string, module, *id, core_names)?;
633665
}
634666
WorldItem::Type(_) => unreachable!(),
635667
}
@@ -643,6 +675,7 @@ impl<'a> EncodingState<'a> {
643675
export_name: &str,
644676
module: CustomModule<'_>,
645677
export: InterfaceId,
678+
interface_func_core_names: Option<&IndexMap<&str, &str>>,
646679
) -> Result<()> {
647680
log::trace!("encode interface export `{export_name}`");
648681
let resolve = &self.info.encoder.metadata.resolve;
@@ -656,7 +689,7 @@ impl<'a> EncodingState<'a> {
656689
let mut imports = Vec::new();
657690
let mut root = self.root_export_type_encoder(Some(export));
658691
for (_, func) in &resolve.interfaces[export].functions {
659-
let core_name = func.core_export_name(Some(export_name));
692+
let core_name = interface_func_core_names.unwrap()[func.name.as_str()];
660693
let ty = root.encode_func_type(resolve, func)?;
661694
let func_index = root
662695
.state

0 commit comments

Comments
 (0)