|
1 | 1 | pub use wit_parser::abi::{AbiVariant, WasmSignature, WasmType}; |
2 | 2 | use wit_parser::{ |
3 | 3 | align_to_arch, Alignment, ArchitectureSize, ElementInfo, Enum, Flags, FlagsRepr, Function, |
4 | | - Handle, Int, Record, Resolve, Result_, SizeAlign, Tuple, Type, TypeDefKind, TypeId, |
5 | | - Variant, |
| 4 | + Handle, Int, Record, Resolve, Result_, SizeAlign, Tuple, Type, TypeDefKind, TypeId, Variant, |
6 | 5 | }; |
7 | 6 |
|
8 | 7 | // Helper macro for defining instructions without having to have tons of |
@@ -970,38 +969,38 @@ impl<'a, B: Bindgen> Generator<'a, B> { |
970 | 969 |
|
971 | 970 | // If necessary we may need to prepare a return pointer for |
972 | 971 | // this ABI. |
973 | | - let dealloc_size_align = |
974 | | - if let Some((params_size, params_align)) = params_size_align { |
975 | | - let ElementInfo { size, align } = |
976 | | - self.bindgen.sizes().record(func.result.iter()); |
977 | | - self.emit(&Instruction::AsyncMalloc { size, align }); |
978 | | - let ptr = self.stack.pop().unwrap(); |
| 972 | + let dealloc_size_align = if let Some((params_size, params_align)) = |
| 973 | + params_size_align |
| 974 | + { |
| 975 | + let ElementInfo { size, align } = |
| 976 | + self.bindgen.sizes().record(func.result.iter()); |
| 977 | + self.emit(&Instruction::AsyncMalloc { size, align }); |
| 978 | + let ptr = self.stack.pop().unwrap(); |
| 979 | + self.return_pointer = Some(ptr.clone()); |
| 980 | + self.stack.push(ptr); |
| 981 | + |
| 982 | + assert_eq!(self.stack.len(), 2); |
| 983 | + self.emit(&Instruction::AsyncCallWasm { |
| 984 | + name: &format!("[async]{}", func.name), |
| 985 | + size: params_size, |
| 986 | + align: params_align, |
| 987 | + }); |
| 988 | + Some((size, align)) |
| 989 | + } else { |
| 990 | + if self.variant == AbiVariant::GuestImport && sig.retptr { |
| 991 | + let ElementInfo { size, align } = self.bindgen.sizes().params(&func.result); |
| 992 | + let ptr = self.bindgen.return_pointer(size, align); |
979 | 993 | self.return_pointer = Some(ptr.clone()); |
980 | 994 | self.stack.push(ptr); |
| 995 | + } |
981 | 996 |
|
982 | | - assert_eq!(self.stack.len(), 2); |
983 | | - self.emit(&Instruction::AsyncCallWasm { |
984 | | - name: &format!("[async]{}", func.name), |
985 | | - size: params_size, |
986 | | - align: params_align, |
987 | | - }); |
988 | | - Some((size, align)) |
989 | | - } else { |
990 | | - if self.variant == AbiVariant::GuestImport && sig.retptr { |
991 | | - let ElementInfo { size, align } = |
992 | | - self.bindgen.sizes().params(&func.result); |
993 | | - let ptr = self.bindgen.return_pointer(size, align); |
994 | | - self.return_pointer = Some(ptr.clone()); |
995 | | - self.stack.push(ptr); |
996 | | - } |
997 | | - |
998 | | - assert_eq!(self.stack.len(), sig.params.len()); |
999 | | - self.emit(&Instruction::CallWasm { |
1000 | | - name: &func.name, |
1001 | | - sig: &sig, |
1002 | | - }); |
1003 | | - None |
1004 | | - }; |
| 997 | + assert_eq!(self.stack.len(), sig.params.len()); |
| 998 | + self.emit(&Instruction::CallWasm { |
| 999 | + name: &func.name, |
| 1000 | + sig: &sig, |
| 1001 | + }); |
| 1002 | + None |
| 1003 | + }; |
1005 | 1004 |
|
1006 | 1005 | if !(sig.retptr || self.async_) { |
1007 | 1006 | // With no return pointer in use we can simply lift the |
@@ -1143,11 +1142,7 @@ impl<'a, B: Bindgen> Generator<'a, B> { |
1143 | 1142 | nth: sig.params.len() - 1, |
1144 | 1143 | }); |
1145 | 1144 | let ptr = self.stack.pop().unwrap(); |
1146 | | - self.write_params_to_memory( |
1147 | | - &func.result, |
1148 | | - ptr, |
1149 | | - Default::default(), |
1150 | | - ); |
| 1145 | + self.write_params_to_memory(&func.result, ptr, Default::default()); |
1151 | 1146 | } |
1152 | 1147 |
|
1153 | 1148 | // For a guest import this is a function defined in |
@@ -1214,11 +1209,7 @@ impl<'a, B: Bindgen> Generator<'a, B> { |
1214 | 1209 |
|
1215 | 1210 | self.emit(&Instruction::GetArg { nth: 0 }); |
1216 | 1211 | let addr = self.stack.pop().unwrap(); |
1217 | | - for (offset, ty) in self |
1218 | | - .bindgen |
1219 | | - .sizes() |
1220 | | - .field_offsets(&func.result) |
1221 | | - { |
| 1212 | + for (offset, ty) in self.bindgen.sizes().field_offsets(&func.result) { |
1222 | 1213 | self.deallocate(ty, addr.clone(), offset); |
1223 | 1214 | } |
1224 | 1215 | self.emit(&Instruction::Return { func, amt: 0 }); |
|
0 commit comments