Skip to content

Commit 419ada2

Browse files
committed
Add <typeidx> to {stream,future}.cancel-{read,write}
1 parent aa0163d commit 419ada2

File tree

5 files changed

+38
-36
lines changed

5 files changed

+38
-36
lines changed

design/mvp/Binary.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -297,15 +297,15 @@ canon ::= 0x00 0x00 f:<core:funcidx> opts:<opts> ft:<typeidx> => (canon lift
297297
| 0x0e t:<typeidx> => (canon stream.new t (core func)) 🔀
298298
| 0x0f t:<typeidx> opts:<opts> => (canon stream.read t opts (core func)) 🔀
299299
| 0x10 t:<typeidx> opts:<opts> => (canon stream.write t opts (core func)) 🔀
300-
| 0x11 async?:<async?> => (canon stream.cancel-read async? (core func)) 🔀
301-
| 0x12 async?:<async?> => (canon stream.cancel-write async? (core func)) 🔀
300+
| 0x11 t:<typeidx> async?:<async?> => (canon stream.cancel-read async? (core func)) 🔀
301+
| 0x12 t:<typeidx> async?:<async?> => (canon stream.cancel-write async? (core func)) 🔀
302302
| 0x13 t:<typeidx> => (canon stream.close-readable t (core func)) 🔀
303303
| 0x14 t:<typeidx> => (canon stream.close-writable t (core func)) 🔀
304304
| 0x15 t:<typeidx> => (canon future.new t (core func)) 🔀
305305
| 0x16 t:<typeidx> opts:<opts> => (canon future.read t opts (core func)) 🔀
306306
| 0x17 t:<typeidx> opts:<opts> => (canon future.write t opts (core func)) 🔀
307-
| 0x18 async?:<async?> => (canon future.cancel-read async? (core func)) 🔀
308-
| 0x19 async?:<async?> => (canon future.cancel-write async? (core func)) 🔀
307+
| 0x18 t:<typeidx> async?:<async?> => (canon future.cancel-read async? (core func)) 🔀
308+
| 0x19 t:<typeidx> async?:<async?> => (canon future.cancel-write async? (core func)) 🔀
309309
| 0x1a t:<typeidx> => (canon future.close-readable t (core func)) 🔀
310310
| 0x1b t:<typeidx> => (canon future.close-writable t (core func)) 🔀
311311
| 0x1c opts:<opts> => (canon error.new opts (core func)) 🔀

design/mvp/CanonicalABI.md

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3198,10 +3198,10 @@ an optional last value of the stream or future.
31983198

31993199
For canonical definitions:
32003200
```wasm
3201-
(canon stream.cancel-read $async? (core func $f))
3202-
(canon stream.cancel-write $async? (core func $f))
3203-
(canon future.cancel-read $async? (core func $f))
3204-
(canon future.cancel-write $async? (core func $f))
3201+
(canon stream.cancel-read $t $async? (core func $f))
3202+
(canon stream.cancel-write $t $async? (core func $f))
3203+
(canon future.cancel-read $t $async? (core func $f))
3204+
(canon future.cancel-write $t $async? (core func $f))
32053205
```
32063206
validation specifies:
32073207
* `$f` is given type `(func (param i32) (result i32))`
@@ -3217,22 +3217,23 @@ cancel a `read` or `write` (and regain ownership of the passed buffer) is
32173217
crucial since some languages will need to cancel reading or writing from
32183218
within the synchronous context of a destructor.
32193219
```python
3220-
async def canon_stream_cancel_read(sync, task, i):
3221-
return await cancel_async_copy(ReadableStreamHandle, sync, task, i)
3220+
async def canon_stream_cancel_read(t, sync, task, i):
3221+
return await cancel_async_copy(ReadableStreamHandle, t, sync, task, i)
32223222

3223-
async def canon_stream_cancel_write(sync, task, i):
3224-
return await cancel_async_copy(WritableStreamHandle, sync, task, i)
3223+
async def canon_stream_cancel_write(t, sync, task, i):
3224+
return await cancel_async_copy(WritableStreamHandle, t, sync, task, i)
32253225

3226-
async def canon_future_cancel_read(sync, task, i):
3227-
return await cancel_async_copy(ReadableFutureHandle, sync, task, i)
3226+
async def canon_future_cancel_read(t, sync, task, i):
3227+
return await cancel_async_copy(ReadableFutureHandle, t, sync, task, i)
32283228

3229-
async def canon_future_cancel_write(sync, task, i):
3230-
return await cancel_async_copy(WritableFutureHandle, sync, task, i)
3229+
async def canon_future_cancel_write(t, sync, task, i):
3230+
return await cancel_async_copy(WritableFutureHandle, t, sync, task, i)
32313231

3232-
async def cancel_async_copy(HandleT, sync, task, i):
3232+
async def cancel_async_copy(HandleT, t, sync, task, i):
32333233
trap_if(not task.inst.may_leave)
32343234
h = task.inst.waitables.get(i)
32353235
trap_if(not isinstance(h, HandleT))
3236+
trap_if(h.t != t)
32363237
trap_if(not h.copying_buffer)
32373238
if h.stream.closed():
32383239
flat_results = [pack_async_copy_result(task, h.copying_buffer, h)]

design/mvp/Explainer.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1403,15 +1403,15 @@ canon ::= ...
14031403
| (canon stream.new <typeidx> (core func <id>?)) 🔀
14041404
| (canon stream.read <typeidx> <canonopt>* (core func <id>?)) 🔀
14051405
| (canon stream.write <typeidx> <canonopt>* (core func <id>?)) 🔀
1406-
| (canon stream.cancel-read async? (core func <id>?)) 🔀
1407-
| (canon stream.cancel-write async? (core func <id>?)) 🔀
1406+
| (canon stream.cancel-read <typeidx> async? (core func <id>?)) 🔀
1407+
| (canon stream.cancel-write <typeidx> async? (core func <id>?)) 🔀
14081408
| (canon stream.close-readable <typeidx> (core func <id>?)) 🔀
14091409
| (canon stream.close-writable <typeidx> (core func <id>?)) 🔀
14101410
| (canon future.new <typeidx> (core func <id>?)) 🔀
14111411
| (canon future.read <typeidx> <canonopt>* (core func <id>?)) 🔀
14121412
| (canon future.write <typeidx> <canonopt>* (core func <id>?)) 🔀
1413-
| (canon future.cancel-read async? (core func <id>?)) 🔀
1414-
| (canon future.cancel-write async? (core func <id>?)) 🔀
1413+
| (canon future.cancel-read <typeidx> async? (core func <id>?)) 🔀
1414+
| (canon future.cancel-write <typeidx> async? (core func <id>?)) 🔀
14151415
| (canon future.close-readable <typeidx> (core func <id>?)) 🔀
14161416
| (canon future.close-writable <typeidx> (core func <id>?)) 🔀
14171417
| (canon error.new <canonopt>* (core func <id>?))

design/mvp/canonical-abi/definitions.py

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2029,22 +2029,23 @@ def pack_async_copy_result(task, buffer, h):
20292029

20302030
### 🔀 `canon {stream,future}.cancel-{read,write}`
20312031

2032-
async def canon_stream_cancel_read(sync, task, i):
2033-
return await cancel_async_copy(ReadableStreamHandle, sync, task, i)
2032+
async def canon_stream_cancel_read(t, sync, task, i):
2033+
return await cancel_async_copy(ReadableStreamHandle, t, sync, task, i)
20342034

2035-
async def canon_stream_cancel_write(sync, task, i):
2036-
return await cancel_async_copy(WritableStreamHandle, sync, task, i)
2035+
async def canon_stream_cancel_write(t, sync, task, i):
2036+
return await cancel_async_copy(WritableStreamHandle, t, sync, task, i)
20372037

2038-
async def canon_future_cancel_read(sync, task, i):
2039-
return await cancel_async_copy(ReadableFutureHandle, sync, task, i)
2038+
async def canon_future_cancel_read(t, sync, task, i):
2039+
return await cancel_async_copy(ReadableFutureHandle, t, sync, task, i)
20402040

2041-
async def canon_future_cancel_write(sync, task, i):
2042-
return await cancel_async_copy(WritableFutureHandle, sync, task, i)
2041+
async def canon_future_cancel_write(t, sync, task, i):
2042+
return await cancel_async_copy(WritableFutureHandle, t, sync, task, i)
20432043

2044-
async def cancel_async_copy(HandleT, sync, task, i):
2044+
async def cancel_async_copy(HandleT, t, sync, task, i):
20452045
trap_if(not task.inst.may_leave)
20462046
h = task.inst.waitables.get(i)
20472047
trap_if(not isinstance(h, HandleT))
2048+
trap_if(h.t != t)
20482049
trap_if(not h.copying_buffer)
20492050
if h.stream.closed():
20502051
flat_results = [pack_async_copy_result(task, h.copying_buffer, h)]

design/mvp/canonical-abi/run_tests.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1245,7 +1245,7 @@ async def core_func(task, args):
12451245
assert(ret == 0)
12461246
result = int.from_bytes(mem[retp : retp+4], 'little', signed=False)
12471247
assert(result == (wsi | 2**31))
1248-
[ret] = await canon_stream_cancel_write(True, task, wsi)
1248+
[ret] = await canon_stream_cancel_write(U8Type(), True, task, wsi)
12491249
assert(ret == 0)
12501250
[] = await canon_stream_close_writable(U8Type(), task, wsi, 0)
12511251
return []
@@ -1523,7 +1523,7 @@ async def core_func(task, args):
15231523
host_sink.set_remain(2)
15241524
got = await host_sink.consume(2)
15251525
assert(got == [0xa, 0xb])
1526-
[ret] = await canon_stream_cancel_write(True, task, wsi)
1526+
[ret] = await canon_stream_cancel_write(U8Type(), True, task, wsi)
15271527
assert(ret == 2)
15281528
[] = await canon_stream_close_writable(U8Type(), task, wsi, 0)
15291529
host_sink.set_remain(100)
@@ -1538,7 +1538,7 @@ async def core_func(task, args):
15381538
host_sink.set_remain(2)
15391539
got = await host_sink.consume(2)
15401540
assert(got == [1, 2])
1541-
[ret] = await canon_stream_cancel_write(False, task, wsi)
1541+
[ret] = await canon_stream_cancel_write(U8Type(), False, task, wsi)
15421542
assert(ret == 2)
15431543
[] = await canon_stream_close_writable(U8Type(), task, wsi, 0)
15441544
host_sink.set_remain(100)
@@ -1550,7 +1550,7 @@ async def core_func(task, args):
15501550
rsi = mem[retp]
15511551
[ret] = await canon_stream_read(U8Type(), lower_opts, task, rsi, 0, 4)
15521552
assert(ret == definitions.BLOCKED)
1553-
[ret] = await canon_stream_cancel_read(True, task, rsi)
1553+
[ret] = await canon_stream_cancel_read(U8Type(), True, task, rsi)
15541554
assert(ret == 0)
15551555
[] = await canon_stream_close_readable(U8Type(), task, rsi)
15561556

@@ -1561,7 +1561,7 @@ async def core_func(task, args):
15611561
[ret] = await canon_stream_read(U8Type(), lower_opts, task, rsi, 0, 4)
15621562
assert(ret == definitions.BLOCKED)
15631563
host_source.eager_cancel.clear()
1564-
[ret] = await canon_stream_cancel_read(False, task, rsi)
1564+
[ret] = await canon_stream_cancel_read(U8Type(), False, task, rsi)
15651565
assert(ret == definitions.BLOCKED)
15661566
host_source.write([7,8])
15671567
await asyncio.sleep(0)
@@ -1682,7 +1682,7 @@ async def core_func(task, args):
16821682
assert(p1 == subi)
16831683

16841684
await task.yield_(sync = False)
1685-
[ret] = await canon_future_cancel_read(True, task, rfi)
1685+
[ret] = await canon_future_cancel_read(U8Type(), True, task, rfi)
16861686
assert(ret == 1)
16871687
assert(mem[readp] == 43)
16881688

0 commit comments

Comments
 (0)