@@ -615,6 +615,37 @@ impl<'a> EncodingState<'a> {
615
615
CustomModule :: Main => & self . info . encoder . main_module_exports ,
616
616
CustomModule :: Adapter ( name) => & self . info . encoder . adapters [ name] . required_exports ,
617
617
} ;
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
+
618
649
let world = & resolve. worlds [ self . info . encoder . metadata . world ] ;
619
650
for export_name in exports {
620
651
let export_string = resolve. name_world_key ( export_name) ;
@@ -623,13 +654,14 @@ impl<'a> EncodingState<'a> {
623
654
let ty = self
624
655
. root_import_type_encoder ( None )
625
656
. encode_func_type ( resolve, func) ?;
626
- let core_name = func. core_export_name ( None ) ;
657
+ let core_name = world_func_core_names [ & func. name ] ;
627
658
let idx = self . encode_lift ( module, & core_name, None , func, ty) ?;
628
659
self . component
629
660
. export ( & export_string, ComponentExportKind :: Func , idx, None ) ;
630
661
}
631
662
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) ?;
633
665
}
634
666
WorldItem :: Type ( _) => unreachable ! ( ) ,
635
667
}
@@ -643,6 +675,7 @@ impl<'a> EncodingState<'a> {
643
675
export_name : & str ,
644
676
module : CustomModule < ' _ > ,
645
677
export : InterfaceId ,
678
+ interface_func_core_names : Option < & IndexMap < & str , & str > > ,
646
679
) -> Result < ( ) > {
647
680
log:: trace!( "encode interface export `{export_name}`" ) ;
648
681
let resolve = & self . info . encoder . metadata . resolve ;
@@ -656,7 +689,7 @@ impl<'a> EncodingState<'a> {
656
689
let mut imports = Vec :: new ( ) ;
657
690
let mut root = self . root_export_type_encoder ( Some ( export) ) ;
658
691
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 ( ) ] ;
660
693
let ty = root. encode_func_type ( resolve, func) ?;
661
694
let func_index = root
662
695
. state
0 commit comments