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