@@ -551,19 +551,8 @@ def_instruction! {
551
551
blocks: usize ,
552
552
} : [ 1 ] => [ 0 ] ,
553
553
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
-
562
554
/// 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 ] ,
567
556
568
557
/// Generate code to run after `CallInterface` for an async-lifted export.
569
558
///
@@ -913,18 +902,15 @@ impl<'a, B: Bindgen> Generator<'a, B> {
913
902
self_. stack . push ( ptr) ;
914
903
} ;
915
904
916
- let params_size_align = if self . async_ {
905
+ if self . async_ {
917
906
let ElementInfo { size, align } = self
918
907
. bindgen
919
908
. sizes ( )
920
909
. 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 ( ) ) ;
926
913
lower_to_memory ( self , ptr) ;
927
- Some ( ( size, align) )
928
914
} else {
929
915
if !sig. indirect_params {
930
916
// If the parameters for this function aren't indirect
@@ -966,47 +952,39 @@ impl<'a, B: Bindgen> Generator<'a, B> {
966
952
} ;
967
953
lower_to_memory ( self , ptr) ;
968
954
}
969
- None
970
- } ;
955
+ }
971
956
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 ( ) ) ;
983
978
self . return_pointer = Some ( ptr. clone ( ) ) ;
984
979
self . stack . push ( ptr) ;
980
+ }
985
981
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
+ }
1010
988
1011
989
if !( sig. retptr || self . async_ ) {
1012
990
// With no return pointer in use we can simply lift the
@@ -1043,14 +1021,6 @@ impl<'a, B: Bindgen> Generator<'a, B> {
1043
1021
self . emit ( & Instruction :: Flush {
1044
1022
amt : usize:: from ( func. result . is_some ( ) ) ,
1045
1023
} ) ;
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
- }
1054
1024
}
1055
1025
1056
1026
self . emit ( & Instruction :: Return {
0 commit comments