|
1 | 1 | use wit_parser::abi::WasmType; |
2 | 2 | use wit_parser::{ |
3 | | - Function, LiftLowerAbi, ManglingAndAbi, Resolve, ResourceIntrinsic, TypeDefKind, TypeId, |
4 | | - WasmExport, WasmExportKind, WasmImport, WorldId, WorldItem, WorldKey, |
| 3 | + Function, FutureIntrinsic, LiftLowerAbi, ManglingAndAbi, Resolve, ResourceIntrinsic, |
| 4 | + StreamIntrinsic, TypeDefKind, TypeId, WasmExport, WasmExportKind, WasmImport, WorldId, |
| 5 | + WorldItem, WorldKey, |
5 | 6 | }; |
6 | 7 |
|
7 | 8 | /// Generate a dummy implementation core Wasm module for a given WIT document |
@@ -98,7 +99,7 @@ fn push_imported_func( |
98 | 99 | wat.push_str("))\n"); |
99 | 100 |
|
100 | 101 | if mangling.is_async() { |
101 | | - push_imported_future_and_stream_intrinsics(wat, resolve, "", interface, func); |
| 102 | + push_imported_future_and_stream_intrinsics(wat, resolve, mangling, false, interface, func); |
102 | 103 | } |
103 | 104 | } |
104 | 105 |
|
@@ -156,63 +157,122 @@ fn push_exported_func_intrinsics( |
156 | 157 | push_tys(wat, "result", &sig.results); |
157 | 158 | wat.push_str("))\n"); |
158 | 159 |
|
159 | | - push_imported_future_and_stream_intrinsics(wat, resolve, "[export]", interface, func); |
| 160 | + push_imported_future_and_stream_intrinsics(wat, resolve, mangling, true, interface, func); |
160 | 161 | } |
161 | 162 |
|
162 | 163 | fn push_imported_future_and_stream_intrinsics( |
163 | 164 | wat: &mut String, |
164 | 165 | resolve: &Resolve, |
165 | | - module_prefix: &str, |
| 166 | + mangling: ManglingAndAbi, |
| 167 | + exported: bool, |
166 | 168 | interface: Option<&WorldKey>, |
167 | 169 | func: &Function, |
168 | 170 | ) { |
169 | | - let module = match interface { |
170 | | - Some(key) => format!("{module_prefix}{}", resolve.name_world_key(key)), |
171 | | - None => format!("{module_prefix}$root"), |
172 | | - }; |
173 | | - let name = &func.name; |
174 | | - |
175 | | - for (i, id) in func |
176 | | - .find_futures_and_streams(resolve) |
177 | | - .into_iter() |
178 | | - .enumerate() |
179 | | - { |
| 171 | + for id in func.find_futures_and_streams(resolve).into_iter() { |
180 | 172 | match &resolve.types[id].kind { |
181 | 173 | TypeDefKind::Future(_) => { |
| 174 | + let mut module = None; |
| 175 | + let mut intrinsic_name = |intrinsic, async_| { |
| 176 | + let (m, name) = resolve.wasm_import_name( |
| 177 | + mangling, |
| 178 | + WasmImport::FutureIntrinsic { |
| 179 | + interface, |
| 180 | + func, |
| 181 | + ty: Some(id), |
| 182 | + intrinsic, |
| 183 | + exported, |
| 184 | + async_, |
| 185 | + }, |
| 186 | + ); |
| 187 | + if let Some(prev) = &module { |
| 188 | + debug_assert_eq!(prev, &m); |
| 189 | + } else { |
| 190 | + module = Some(m); |
| 191 | + } |
| 192 | + name |
| 193 | + }; |
| 194 | + |
| 195 | + let new = intrinsic_name(FutureIntrinsic::New, false); |
| 196 | + let read = intrinsic_name(FutureIntrinsic::Read, false); |
| 197 | + let write = intrinsic_name(FutureIntrinsic::Write, false); |
| 198 | + let cancel_read = intrinsic_name(FutureIntrinsic::CancelRead, false); |
| 199 | + let cancel_write = intrinsic_name(FutureIntrinsic::CancelWrite, false); |
| 200 | + let drop_readable = intrinsic_name(FutureIntrinsic::DropReadable, false); |
| 201 | + let drop_writable = intrinsic_name(FutureIntrinsic::DropWritable, false); |
| 202 | + let async_read = intrinsic_name(FutureIntrinsic::Read, true); |
| 203 | + let async_write = intrinsic_name(FutureIntrinsic::Write, true); |
| 204 | + let async_cancel_read = intrinsic_name(FutureIntrinsic::CancelRead, true); |
| 205 | + let async_cancel_write = intrinsic_name(FutureIntrinsic::CancelWrite, true); |
| 206 | + let module = module.unwrap(); |
| 207 | + |
182 | 208 | wat.push_str(&format!( |
183 | 209 | r#" |
184 | | -(import {module:?} "[future-new-{i}]{name}" (func (result i64))) |
185 | | -(import {module:?} "[future-read-{i}]{name}" (func (param i32 i32) (result i32))) |
186 | | -(import {module:?} "[future-write-{i}]{name}" (func (param i32 i32) (result i32))) |
187 | | -(import {module:?} "[future-cancel-read-{i}]{name}" (func (param i32) (result i32))) |
188 | | -(import {module:?} "[future-cancel-write-{i}]{name}" (func (param i32) (result i32))) |
189 | | -(import {module:?} "[future-drop-readable-{i}]{name}" (func (param i32))) |
190 | | -(import {module:?} "[future-drop-writable-{i}]{name}" (func (param i32))) |
191 | | -(import {module:?} "[async-lower][future-read-{i}]{name}" (func (param i32 i32) (result i32))) |
192 | | -(import {module:?} "[async-lower][future-write-{i}]{name}" (func (param i32 i32) (result i32))) |
| 210 | +(import {module:?} {new:?} (func (result i64))) |
| 211 | +(import {module:?} {read:?} (func (param i32 i32) (result i32))) |
| 212 | +(import {module:?} {write:?} (func (param i32 i32) (result i32))) |
| 213 | +(import {module:?} {cancel_read:?} (func (param i32) (result i32))) |
| 214 | +(import {module:?} {cancel_write:?} (func (param i32) (result i32))) |
| 215 | +(import {module:?} {drop_readable:?} (func (param i32))) |
| 216 | +(import {module:?} {drop_writable:?} (func (param i32))) |
| 217 | +(import {module:?} {async_read:?} (func (param i32 i32) (result i32))) |
| 218 | +(import {module:?} {async_write:?} (func (param i32 i32) (result i32))) |
193 | 219 |
|
194 | 220 | ;; deferred behind 🚝 |
195 | | -;;(import {module:?} "[async-lower][future-cancel-read-{i}]{name}" (func (param i32) (result i32))) |
196 | | -;;(import {module:?} "[async-lower][future-cancel-write-{i}]{name}" (func (param i32) (result i32))) |
| 221 | +;;(import {module:?} {async_cancel_read:?} (func (param i32) (result i32))) |
| 222 | +;;(import {module:?} {async_cancel_write:?} (func (param i32) (result i32))) |
197 | 223 | "# |
198 | 224 | )); |
199 | 225 | } |
200 | 226 | TypeDefKind::Stream(_) => { |
| 227 | + let mut module = None; |
| 228 | + let mut intrinsic_name = |intrinsic, async_| { |
| 229 | + let (m, name) = resolve.wasm_import_name( |
| 230 | + mangling, |
| 231 | + WasmImport::StreamIntrinsic { |
| 232 | + interface, |
| 233 | + func, |
| 234 | + ty: Some(id), |
| 235 | + intrinsic, |
| 236 | + exported, |
| 237 | + async_, |
| 238 | + }, |
| 239 | + ); |
| 240 | + if let Some(prev) = &module { |
| 241 | + debug_assert_eq!(prev, &m); |
| 242 | + } else { |
| 243 | + module = Some(m); |
| 244 | + } |
| 245 | + name |
| 246 | + }; |
| 247 | + |
| 248 | + let new = intrinsic_name(StreamIntrinsic::New, false); |
| 249 | + let read = intrinsic_name(StreamIntrinsic::Read, false); |
| 250 | + let write = intrinsic_name(StreamIntrinsic::Write, false); |
| 251 | + let cancel_read = intrinsic_name(StreamIntrinsic::CancelRead, false); |
| 252 | + let cancel_write = intrinsic_name(StreamIntrinsic::CancelWrite, false); |
| 253 | + let drop_readable = intrinsic_name(StreamIntrinsic::DropReadable, false); |
| 254 | + let drop_writable = intrinsic_name(StreamIntrinsic::DropWritable, false); |
| 255 | + let async_read = intrinsic_name(StreamIntrinsic::Read, true); |
| 256 | + let async_write = intrinsic_name(StreamIntrinsic::Write, true); |
| 257 | + let async_cancel_read = intrinsic_name(StreamIntrinsic::CancelRead, true); |
| 258 | + let async_cancel_write = intrinsic_name(StreamIntrinsic::CancelWrite, true); |
| 259 | + let module = module.unwrap(); |
| 260 | + |
201 | 261 | wat.push_str(&format!( |
202 | 262 | r#" |
203 | | -(import {module:?} "[stream-new-{i}]{name}" (func (result i64))) |
204 | | -(import {module:?} "[stream-read-{i}]{name}" (func (param i32 i32 i32) (result i32))) |
205 | | -(import {module:?} "[stream-write-{i}]{name}" (func (param i32 i32 i32) (result i32))) |
206 | | -(import {module:?} "[stream-cancel-read-{i}]{name}" (func (param i32) (result i32))) |
207 | | -(import {module:?} "[stream-cancel-write-{i}]{name}" (func (param i32) (result i32))) |
208 | | -(import {module:?} "[stream-drop-readable-{i}]{name}" (func (param i32))) |
209 | | -(import {module:?} "[stream-drop-writable-{i}]{name}" (func (param i32))) |
210 | | -(import {module:?} "[async-lower][stream-read-{i}]{name}" (func (param i32 i32 i32) (result i32))) |
211 | | -(import {module:?} "[async-lower][stream-write-{i}]{name}" (func (param i32 i32 i32) (result i32))) |
| 263 | +(import {module:?} {new:?} (func (result i64))) |
| 264 | +(import {module:?} {read:?} (func (param i32 i32 i32) (result i32))) |
| 265 | +(import {module:?} {write:?} (func (param i32 i32 i32) (result i32))) |
| 266 | +(import {module:?} {cancel_read:?} (func (param i32) (result i32))) |
| 267 | +(import {module:?} {cancel_write:?} (func (param i32) (result i32))) |
| 268 | +(import {module:?} {drop_readable:?} (func (param i32))) |
| 269 | +(import {module:?} {drop_writable:?} (func (param i32))) |
| 270 | +(import {module:?} {async_read:?} (func (param i32 i32 i32) (result i32))) |
| 271 | +(import {module:?} {async_write:?} (func (param i32 i32 i32) (result i32))) |
212 | 272 |
|
213 | 273 | ;; deferred behind 🚝 |
214 | | -;;(import {module:?} "[async-lower][stream-cancel-read-{i}]{name}" (func (param i32) (result i32))) |
215 | | -;;(import {module:?} "[async-lower][stream-cancel-write-{i}]{name}" (func (param i32) (result i32))) |
| 274 | +;;(import {module:?} {async_cancel_read:?} (func (param i32) (result i32))) |
| 275 | +;;(import {module:?} {async_cancel_write:?} (func (param i32) (result i32))) |
216 | 276 | "# |
217 | 277 | )); |
218 | 278 | } |
|
0 commit comments