@@ -551,19 +551,8 @@ def_instruction! {
551551 blocks: usize ,
552552 } : [ 1 ] => [ 0 ] ,
553553
554- /// Allocate the parameter and/or return areas to use for an
555- /// async-lowered import call.
556- ///
557- /// This cannot be allocated on the (shadow-)stack since it needs to
558- /// remain valid until the callee has finished using the buffers, which
559- /// may be after we pop the current stack frame.
560- AsyncMalloc { size: usize , align: usize } : [ 0 ] => [ 1 ] ,
561-
562554 /// Call an async-lowered import.
563- ///
564- /// `size` and `align` are used to deallocate the parameter area
565- /// allocated using `AsyncMalloc` after the callee task returns a value.
566- AsyncCallWasm { name: & ' a str , size: usize , align: usize } : [ 2 ] => [ 0 ] ,
555+ AsyncCallWasm { name: & ' a str } : [ 2 ] => [ 0 ] ,
567556
568557 /// Generate code to run after `CallInterface` for an async-lifted export.
569558 ///
@@ -913,18 +902,15 @@ impl<'a, B: Bindgen> Generator<'a, B> {
913902 self_. stack . push ( ptr) ;
914903 } ;
915904
916- let params_size_align = if self . async_ {
905+ if self . async_ {
917906 let ElementInfo { size, align } = self
918907 . bindgen
919908 . sizes ( )
920909 . record ( func. params . iter ( ) . map ( |( _, ty) | ty) ) ;
921- self . emit ( & Instruction :: AsyncMalloc {
922- size : size. size_wasm32 ( ) ,
923- align : align. align_wasm32 ( ) ,
924- } ) ;
925- let ptr = self . stack . pop ( ) . unwrap ( ) ;
910+ let ptr = self
911+ . bindgen
912+ . return_pointer ( size. size_wasm32 ( ) , align. align_wasm32 ( ) ) ;
926913 lower_to_memory ( self , ptr) ;
927- Some ( ( size, align) )
928914 } else {
929915 if !sig. indirect_params {
930916 // If the parameters for this function aren't indirect
@@ -966,47 +952,39 @@ impl<'a, B: Bindgen> Generator<'a, B> {
966952 } ;
967953 lower_to_memory ( self , ptr) ;
968954 }
969- None
970- } ;
955+ }
971956
972- // If necessary we may need to prepare a return pointer for
973- // this ABI.
974- let dealloc_size_align =
975- if let Some ( ( params_size, params_align) ) = params_size_align {
976- let ElementInfo { size, align } =
977- self . bindgen . sizes ( ) . record ( func. result . iter ( ) ) ;
978- self . emit ( & Instruction :: AsyncMalloc {
979- size : size. size_wasm32 ( ) ,
980- align : align. align_wasm32 ( ) ,
981- } ) ;
982- let ptr = self . stack . pop ( ) . unwrap ( ) ;
957+ if self . async_ {
958+ let ElementInfo { size, align } =
959+ self . bindgen . sizes ( ) . record ( func. result . iter ( ) ) ;
960+ let ptr = self
961+ . bindgen
962+ . return_pointer ( size. size_wasm32 ( ) , align. align_wasm32 ( ) ) ;
963+ self . return_pointer = Some ( ptr. clone ( ) ) ;
964+ self . stack . push ( ptr) ;
965+
966+ assert_eq ! ( self . stack. len( ) , 2 ) ;
967+ self . emit ( & Instruction :: AsyncCallWasm {
968+ name : & format ! ( "[async-lower]{}" , func. name) ,
969+ } ) ;
970+ } else {
971+ // If necessary we may need to prepare a return pointer for
972+ // this ABI.
973+ if self . variant == AbiVariant :: GuestImport && sig. retptr {
974+ let info = self . bindgen . sizes ( ) . params ( & func. result ) ;
975+ let ptr = self
976+ . bindgen
977+ . return_pointer ( info. size . size_wasm32 ( ) , info. align . align_wasm32 ( ) ) ;
983978 self . return_pointer = Some ( ptr. clone ( ) ) ;
984979 self . stack . push ( ptr) ;
980+ }
985981
986- assert_eq ! ( self . stack. len( ) , 2 ) ;
987- self . emit ( & Instruction :: AsyncCallWasm {
988- name : & format ! ( "[async-lower]{}" , func. name) ,
989- size : params_size. size_wasm32 ( ) ,
990- align : params_align. align_wasm32 ( ) ,
991- } ) ;
992- Some ( ( size, align) )
993- } else {
994- if self . variant == AbiVariant :: GuestImport && sig. retptr {
995- let info = self . bindgen . sizes ( ) . params ( & func. result ) ;
996- let ptr = self
997- . bindgen
998- . return_pointer ( info. size . size_wasm32 ( ) , info. align . align_wasm32 ( ) ) ;
999- self . return_pointer = Some ( ptr. clone ( ) ) ;
1000- self . stack . push ( ptr) ;
1001- }
1002-
1003- assert_eq ! ( self . stack. len( ) , sig. params. len( ) ) ;
1004- self . emit ( & Instruction :: CallWasm {
1005- name : & func. name ,
1006- sig : & sig,
1007- } ) ;
1008- None
1009- } ;
982+ assert_eq ! ( self . stack. len( ) , sig. params. len( ) ) ;
983+ self . emit ( & Instruction :: CallWasm {
984+ name : & func. name ,
985+ sig : & sig,
986+ } ) ;
987+ }
1010988
1011989 if !( sig. retptr || self . async_ ) {
1012990 // With no return pointer in use we can simply lift the
@@ -1043,14 +1021,6 @@ impl<'a, B: Bindgen> Generator<'a, B> {
10431021 self . emit ( & Instruction :: Flush {
10441022 amt : usize:: from ( func. result . is_some ( ) ) ,
10451023 } ) ;
1046-
1047- if let Some ( ( size, align) ) = dealloc_size_align {
1048- self . stack . push ( ptr) ;
1049- self . emit ( & Instruction :: GuestDeallocate {
1050- size : size. size_wasm32 ( ) ,
1051- align : align. align_wasm32 ( ) ,
1052- } ) ;
1053- }
10541024 }
10551025
10561026 self . emit ( & Instruction :: Return {
0 commit comments