Skip to content

Commit ad67bae

Browse files
committed
Add <typeidx> to {stream,future}.{read,write}
1 parent 45586b0 commit ad67bae

File tree

5 files changed

+72
-70
lines changed

5 files changed

+72
-70
lines changed

design/mvp/Binary.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -294,13 +294,13 @@ canon ::= 0x00 0x00 f:<core:funcidx> opts:<opts> ft:<typeidx> => (canon lift
294294
| 0x0c => (canon task.yield (core func)) 🔀
295295
| 0x0d => (canon waitable.drop (core func)) 🔀
296296
| 0x0e t:<typeidx> => (canon stream.new t (core func)) 🔀
297-
| 0x0f => (canon stream.read (core func)) 🔀
298-
| 0x10 => (canon stream.write (core func)) 🔀
297+
| 0x0f t:<typeidx> => (canon stream.read t (core func)) 🔀
298+
| 0x10 t:<typeidx> => (canon stream.write t (core func)) 🔀
299299
| 0x11 async?:<async?> => (canon stream.cancel-read async? (core func)) 🔀
300300
| 0x12 async?:<async?> => (canon stream.cancel-write async? (core func)) 🔀
301301
| 0x13 t:<typeidx> => (canon future.new t (core func)) 🔀
302-
| 0x14 => (canon future.read (core func)) 🔀
303-
| 0x15 => (canon future.write (core func)) 🔀
302+
| 0x14 t:<typeidx> => (canon future.read t (core func)) 🔀
303+
| 0x15 t:<typeidx> => (canon future.write t (core func)) 🔀
304304
| 0x16 async?:<async?> => (canon future.cancel-read async? (core func)) 🔀
305305
| 0x17 async?:<async?> => (canon future.cancel-write async? (core func)) 🔀
306306
async? ::= 0x00 =>

design/mvp/CanonicalABI.md

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2978,29 +2978,30 @@ likelihood of deadlock), there is no synchronous option for `read` or `write`.
29782978
The actual copy happens via polymorphic dispatch to `copy`, which has been
29792979
defined above by the 4 `{Readable,Writable}{Stream,Future}Handle` types:
29802980
```python
2981-
async def canon_stream_read(task, i, ptr, n):
2982-
return await async_copy(ReadableStreamHandle, WritableBufferGuestImpl,
2981+
async def canon_stream_read(t, task, i, ptr, n):
2982+
return await async_copy(ReadableStreamHandle, WritableBufferGuestImpl, t,
29832983
EventCode.STREAM_READ, task, i, ptr, n)
29842984

2985-
async def canon_stream_write(task, i, ptr, n):
2986-
return await async_copy(WritableStreamHandle, ReadableBufferGuestImpl,
2985+
async def canon_stream_write(t, task, i, ptr, n):
2986+
return await async_copy(WritableStreamHandle, ReadableBufferGuestImpl, t,
29872987
EventCode.STREAM_WRITE, task, i, ptr, n)
29882988

2989-
async def canon_future_read(task, i, ptr):
2990-
return await async_copy(ReadableFutureHandle, WritableBufferGuestImpl,
2989+
async def canon_future_read(t, task, i, ptr):
2990+
return await async_copy(ReadableFutureHandle, WritableBufferGuestImpl, t,
29912991
EventCode.FUTURE_READ, task, i, ptr, 1)
29922992

2993-
async def canon_future_write(task, i, ptr):
2994-
return await async_copy(WritableFutureHandle, ReadableBufferGuestImpl,
2993+
async def canon_future_write(t, task, i, ptr):
2994+
return await async_copy(WritableFutureHandle, ReadableBufferGuestImpl, t,
29952995
EventCode.FUTURE_WRITE, task, i, ptr, 1)
29962996

2997-
async def async_copy(HandleT, BufferT, event_code, task, i, ptr, n):
2997+
async def async_copy(HandleT, BufferT, t, event_code, task, i, ptr, n):
29982998
trap_if(not task.inst.may_leave)
29992999
h = task.inst.waitables.get(i)
30003000
trap_if(not isinstance(h, HandleT))
3001+
trap_if(h.t != t)
30013002
trap_if(not h.cx)
30023003
trap_if(h.copying_buffer)
3003-
buffer = BufferT(h.cx, h.t, ptr, n)
3004+
buffer = BufferT(h.cx, t, ptr, n)
30043005
if h.stream.closed():
30053006
flat_results = [CLOSED]
30063007
else:

design/mvp/Explainer.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1373,13 +1373,13 @@ canon ::= ...
13731373
| (canon task.poll (memory <core:memidx>) (core func <id>?)) 🔀
13741374
| (canon task.yield (core func <id>?)) 🔀
13751375
| (canon stream.new <typeidx> (core func <id>?)) 🔀
1376-
| (canon stream.read (core func <id>?)) 🔀
1377-
| (canon stream.write (core func <id>?)) 🔀
1376+
| (canon stream.read <typeidx> (core func <id>?)) 🔀
1377+
| (canon stream.write <typeidx> (core func <id>?)) 🔀
13781378
| (canon stream.cancel-read async? (core func <id>?)) 🔀
13791379
| (canon stream.cancel-write async? (core func <id>?)) 🔀
13801380
| (canon future.new <typeidx> (core func <id>?)) 🔀
1381-
| (canon future.read (core func <id>?)) 🔀
1382-
| (canon future.write (core func <id>?)) 🔀
1381+
| (canon future.read <typeidx> (core func <id>?)) 🔀
1382+
| (canon future.write <typeidx> (core func <id>?)) 🔀
13831383
| (canon future.cancel-read async? (core func <id>?)) 🔀
13841384
| (canon future.cancel-write async? (core func <id>?)) 🔀
13851385
| (canon waitable.drop (core func <id>?)) 🔀

design/mvp/canonical-abi/definitions.py

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1876,29 +1876,30 @@ async def canon_future_new(t, task):
18761876

18771877
### 🔀 `canon {stream,future}.{read,write}`
18781878

1879-
async def canon_stream_read(task, i, ptr, n):
1880-
return await async_copy(ReadableStreamHandle, WritableBufferGuestImpl,
1879+
async def canon_stream_read(t, task, i, ptr, n):
1880+
return await async_copy(ReadableStreamHandle, WritableBufferGuestImpl, t,
18811881
EventCode.STREAM_READ, task, i, ptr, n)
18821882

1883-
async def canon_stream_write(task, i, ptr, n):
1884-
return await async_copy(WritableStreamHandle, ReadableBufferGuestImpl,
1883+
async def canon_stream_write(t, task, i, ptr, n):
1884+
return await async_copy(WritableStreamHandle, ReadableBufferGuestImpl, t,
18851885
EventCode.STREAM_WRITE, task, i, ptr, n)
18861886

1887-
async def canon_future_read(task, i, ptr):
1888-
return await async_copy(ReadableFutureHandle, WritableBufferGuestImpl,
1887+
async def canon_future_read(t, task, i, ptr):
1888+
return await async_copy(ReadableFutureHandle, WritableBufferGuestImpl, t,
18891889
EventCode.FUTURE_READ, task, i, ptr, 1)
18901890

1891-
async def canon_future_write(task, i, ptr):
1892-
return await async_copy(WritableFutureHandle, ReadableBufferGuestImpl,
1891+
async def canon_future_write(t, task, i, ptr):
1892+
return await async_copy(WritableFutureHandle, ReadableBufferGuestImpl, t,
18931893
EventCode.FUTURE_WRITE, task, i, ptr, 1)
18941894

1895-
async def async_copy(HandleT, BufferT, event_code, task, i, ptr, n):
1895+
async def async_copy(HandleT, BufferT, t, event_code, task, i, ptr, n):
18961896
trap_if(not task.inst.may_leave)
18971897
h = task.inst.waitables.get(i)
18981898
trap_if(not isinstance(h, HandleT))
1899+
trap_if(h.t != t)
18991900
trap_if(not h.cx)
19001901
trap_if(h.copying_buffer)
1901-
buffer = BufferT(h.cx, h.t, ptr, n)
1902+
buffer = BufferT(h.cx, t, ptr, n)
19021903
if h.stream.closed():
19031904
flat_results = [CLOSED]
19041905
else:

design/mvp/canonical-abi/run_tests.py

Lines changed: 42 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1049,30 +1049,30 @@ async def core_func(task, args):
10491049
assert(rsi1 == 1)
10501050
[wsi1] = await canon_stream_new(U8Type(), task)
10511051
[] = await canon_task_return(task, CoreFuncType(['i32'],[]), [wsi1])
1052-
[ret] = await canon_stream_read(task, rsi1, 0, 4)
1052+
[ret] = await canon_stream_read(U8Type(), task, rsi1, 0, 4)
10531053
assert(ret == 4)
10541054
assert(mem[0:4] == b'\x01\x02\x03\x04')
10551055
[wsi2] = await canon_stream_new(U8Type(), task)
10561056
retp = 12
10571057
[ret] = await canon_lower(opts, ft, host_import, task, [wsi2, retp])
10581058
assert(ret == 0)
10591059
rsi2 = mem[retp]
1060-
[ret] = await canon_stream_write(task, wsi2, 0, 4)
1060+
[ret] = await canon_stream_write(U8Type(), task, wsi2, 0, 4)
10611061
assert(ret == 4)
1062-
[ret] = await canon_stream_read(task, rsi2, 0, 4)
1062+
[ret] = await canon_stream_read(U8Type(), task, rsi2, 0, 4)
10631063
assert(ret == 4)
1064-
[ret] = await canon_stream_write(task, wsi1, 0, 4)
1064+
[ret] = await canon_stream_write(U8Type(), task, wsi1, 0, 4)
10651065
assert(ret == 4)
1066-
[ret] = await canon_stream_read(task, rsi1, 0, 4)
1066+
[ret] = await canon_stream_read(U8Type(), task, rsi1, 0, 4)
10671067
assert(ret == 4)
1068-
[ret] = await canon_stream_read(task, rsi1, 0, 4)
1068+
[ret] = await canon_stream_read(U8Type(), task, rsi1, 0, 4)
10691069
assert(ret == definitions.CLOSED)
10701070
assert(mem[0:4] == b'\x05\x06\x07\x08')
1071-
[ret] = await canon_stream_write(task, wsi2, 0, 4)
1071+
[ret] = await canon_stream_write(U8Type(), task, wsi2, 0, 4)
10721072
assert(ret == 4)
1073-
[ret] = await canon_stream_read(task, rsi2, 0, 4)
1073+
[ret] = await canon_stream_read(U8Type(), task, rsi2, 0, 4)
10741074
assert(ret == 4)
1075-
[ret] = await canon_stream_write(task, wsi1, 0, 4)
1075+
[ret] = await canon_stream_write(U8Type(), task, wsi1, 0, 4)
10761076
assert(ret == 4)
10771077
[] = await canon_waitable_drop(task, rsi1)
10781078
[] = await canon_waitable_drop(task, rsi2)
@@ -1122,7 +1122,7 @@ async def core_func(task, args):
11221122
assert(rsi1 == 1)
11231123
[wsi1] = await canon_stream_new(U8Type(), task)
11241124
[] = await canon_task_return(task, CoreFuncType(['i32'],[]), [wsi1])
1125-
[ret] = await canon_stream_read(task, rsi1, 0, 4)
1125+
[ret] = await canon_stream_read(U8Type(), task, rsi1, 0, 4)
11261126
assert(ret == definitions.BLOCKED)
11271127
src_stream.write([1,2,3,4])
11281128
event, p1, p2 = await task.wait()
@@ -1137,16 +1137,16 @@ async def core_func(task, args):
11371137
assert(state == CallState.RETURNED)
11381138
rsi2 = mem[16]
11391139
assert(rsi2 == 4)
1140-
[ret] = await canon_stream_write(task, wsi2, 0, 4)
1140+
[ret] = await canon_stream_write(U8Type(), task, wsi2, 0, 4)
11411141
assert(ret == definitions.BLOCKED)
11421142
host_import_incoming.set_remain(100)
11431143
event, p1, p2 = await task.wait()
11441144
assert(event == EventCode.STREAM_WRITE)
11451145
assert(p1 == wsi2)
11461146
assert(p2 == 4)
1147-
[ret] = await canon_stream_read(task, rsi2, 0, 4)
1147+
[ret] = await canon_stream_read(U8Type(), task, rsi2, 0, 4)
11481148
assert(ret == 4)
1149-
[ret] = await canon_stream_write(task, wsi1, 0, 4)
1149+
[ret] = await canon_stream_write(U8Type(), task, wsi1, 0, 4)
11501150
assert(ret == definitions.BLOCKED)
11511151
dst_stream.set_remain(100)
11521152
event, p1, p2 = await task.wait()
@@ -1155,16 +1155,16 @@ async def core_func(task, args):
11551155
assert(p2 == 4)
11561156
src_stream.write([5,6,7,8])
11571157
src_stream.destroy_once_empty()
1158-
[ret] = await canon_stream_read(task, rsi1, 0, 4)
1158+
[ret] = await canon_stream_read(U8Type(), task, rsi1, 0, 4)
11591159
assert(ret == 4)
1160-
[ret] = await canon_stream_read(task, rsi1, 0, 4)
1160+
[ret] = await canon_stream_read(U8Type(), task, rsi1, 0, 4)
11611161
assert(ret == definitions.CLOSED)
11621162
[] = await canon_waitable_drop(task, rsi1)
11631163
assert(mem[0:4] == b'\x05\x06\x07\x08')
1164-
[ret] = await canon_stream_write(task, wsi2, 0, 4)
1164+
[ret] = await canon_stream_write(U8Type(), task, wsi2, 0, 4)
11651165
assert(ret == 4)
11661166
[] = await canon_waitable_drop(task, wsi2)
1167-
[ret] = await canon_stream_read(task, rsi2, 0, 4)
1167+
[ret] = await canon_stream_read(U8Type(), task, rsi2, 0, 4)
11681168
assert(ret == definitions.BLOCKED)
11691169
event, p1, p2 = await task.wait()
11701170
assert(event == EventCode.CALL_DONE)
@@ -1174,11 +1174,11 @@ async def core_func(task, args):
11741174
assert(event == EventCode.STREAM_READ)
11751175
assert(p1 == rsi2)
11761176
assert(p2 == 4)
1177-
[ret] = await canon_stream_read(task, rsi2, 0, 4)
1177+
[ret] = await canon_stream_read(U8Type(), task, rsi2, 0, 4)
11781178
assert(ret == definitions.CLOSED)
11791179
[] = await canon_waitable_drop(task, rsi2)
11801180
[] = await canon_waitable_drop(task, subi)
1181-
[ret] = await canon_stream_write(task, wsi1, 0, 4)
1181+
[ret] = await canon_stream_write(U8Type(), task, wsi1, 0, 4)
11821182
assert(ret == 4)
11831183
[] = await canon_waitable_drop(task, wsi1)
11841184
return []
@@ -1266,13 +1266,13 @@ async def core_func(task, args):
12661266
assert(ret == 0)
12671267
rsi = mem[retp]
12681268
assert(rsi == 1)
1269-
[ret] = await canon_stream_read(task, rsi, 0, 4)
1269+
[ret] = await canon_stream_read(U8Type(), task, rsi, 0, 4)
12701270
assert(ret == 2)
12711271
assert(mem[0:2] == b'\x01\x02')
1272-
[ret] = await canon_stream_read(task, rsi, 0, 4)
1272+
[ret] = await canon_stream_read(U8Type(), task, rsi, 0, 4)
12731273
assert(ret == 2)
12741274
assert(mem[0:2] == b'\x03\x04')
1275-
[ret] = await canon_stream_read(task, rsi, 0, 4)
1275+
[ret] = await canon_stream_read(U8Type(), task, rsi, 0, 4)
12761276
assert(ret == definitions.BLOCKED)
12771277
src.write([5,6])
12781278
event, p1, p2 = await task.wait()
@@ -1286,9 +1286,9 @@ async def core_func(task, args):
12861286
[ret] = await canon_lower(opts, sink_ft, host_sink, task, [wsi])
12871287
assert(ret == 0)
12881288
mem[0:6] = b'\x01\x02\x03\x04\x05\x06'
1289-
[ret] = await canon_stream_write(task, wsi, 0, 6)
1289+
[ret] = await canon_stream_write(U8Type(), task, wsi, 0, 6)
12901290
assert(ret == 2)
1291-
[ret] = await canon_stream_write(task, wsi, 2, 6)
1291+
[ret] = await canon_stream_write(U8Type(), task, wsi, 2, 6)
12921292
assert(ret == definitions.BLOCKED)
12931293
dst.set_remain(4)
12941294
event, p1, p2 = await task.wait()
@@ -1322,15 +1322,15 @@ async def core_func1(task, args):
13221322
await task.wait_on(fut1)
13231323

13241324
mem1[0:4] = b'\x01\x02\x03\x04'
1325-
[ret] = await canon_stream_write(task, wsi, 0, 2)
1325+
[ret] = await canon_stream_write(U8Type(), task, wsi, 0, 2)
13261326
assert(ret == 2)
1327-
[ret] = await canon_stream_write(task, wsi, 2, 2)
1327+
[ret] = await canon_stream_write(U8Type(), task, wsi, 2, 2)
13281328
assert(ret == 2)
13291329

13301330
await task.wait_on(fut2)
13311331

13321332
mem1[0:8] = b'\x05\x06\x07\x08\x09\x0a\x0b\x0c'
1333-
[ret] = await canon_stream_write(task, wsi, 0, 8)
1333+
[ret] = await canon_stream_write(U8Type(), task, wsi, 0, 8)
13341334
assert(ret == definitions.BLOCKED)
13351335

13361336
fut3.set_result(None)
@@ -1362,7 +1362,7 @@ async def core_func2(task, args):
13621362
rsi = mem2[0]
13631363
assert(rsi == 1)
13641364

1365-
[ret] = await canon_stream_read(task, rsi, 0, 8)
1365+
[ret] = await canon_stream_read(U8Type(), task, rsi, 0, 8)
13661366
assert(ret == definitions.BLOCKED)
13671367

13681368
fut1.set_result(None)
@@ -1377,16 +1377,16 @@ async def core_func2(task, args):
13771377
await task.wait_on(fut3)
13781378

13791379
mem2[0:8] = bytes(8)
1380-
[ret] = await canon_stream_read(task, rsi, 0, 2)
1380+
[ret] = await canon_stream_read(U8Type(), task, rsi, 0, 2)
13811381
assert(ret == 2)
13821382
assert(mem2[0:6] == b'\x05\x06\x00\x00\x00\x00')
1383-
[ret] = await canon_stream_read(task, rsi, 2, 2)
1383+
[ret] = await canon_stream_read(U8Type(), task, rsi, 2, 2)
13841384
assert(ret == 2)
13851385
assert(mem2[0:6] == b'\x05\x06\x07\x08\x00\x00')
13861386

13871387
await task.wait_on(fut4)
13881388

1389-
[ret] = await canon_stream_read(task, rsi, 0, 2)
1389+
[ret] = await canon_stream_read(U8Type(), task, rsi, 0, 2)
13901390
assert(ret == definitions.CLOSED)
13911391
[] = await canon_waitable_drop(task, rsi)
13921392

@@ -1410,14 +1410,14 @@ async def test_borrow_stream():
14101410
async def core_func1(task, args):
14111411
[rsi] = args
14121412

1413-
[ret] = await canon_stream_read(task, rsi, 4, 2)
1413+
[ret] = await canon_stream_read(BorrowType(rt), task, rsi, 4, 2)
14141414
assert(ret == definitions.BLOCKED)
14151415

14161416
event, p1, p2 = await task.wait()
14171417
assert(event == EventCode.STREAM_READ)
14181418
assert(p1 == rsi)
14191419
assert(p2 == 2)
1420-
[ret] = await canon_stream_read(task, rsi, 0, 2)
1420+
[ret] = await canon_stream_read(BorrowType(rt), task, rsi, 0, 2)
14211421
assert(ret == definitions.CLOSED)
14221422

14231423
[] = await canon_waitable_drop(task, rsi)
@@ -1451,7 +1451,7 @@ async def core_func2(task, args):
14511451
mem2[0] = h1
14521452
mem2[4] = h2
14531453

1454-
[ret] = await canon_stream_write(task, wsi, 0, 2)
1454+
[ret] = await canon_stream_write(BorrowType(rt), task, wsi, 0, 2)
14551455
assert(ret == 2)
14561456
[] = await canon_waitable_drop(task, wsi)
14571457

@@ -1493,7 +1493,7 @@ async def core_func(task, args):
14931493
[ret] = await canon_lower(lower_opts, host_ft1, host_func1, task, [wsi])
14941494
assert(ret == 0)
14951495
mem[0:4] = b'\x0a\x0b\x0c\x0d'
1496-
[ret] = await canon_stream_write(task, wsi, 0, 4)
1496+
[ret] = await canon_stream_write(U8Type(), task, wsi, 0, 4)
14971497
assert(ret == definitions.BLOCKED)
14981498
host_sink.set_remain(2)
14991499
got = await host_sink.consume(2)
@@ -1506,7 +1506,7 @@ async def core_func(task, args):
15061506
[ret] = await canon_lower(lower_opts, host_ft1, host_func1, task, [wsi])
15071507
assert(ret == 0)
15081508
mem[0:4] = b'\x01\x02\x03\x04'
1509-
[ret] = await canon_stream_write(task, wsi, 0, 4)
1509+
[ret] = await canon_stream_write(U8Type(), task, wsi, 0, 4)
15101510
assert(ret == definitions.BLOCKED)
15111511
host_sink.set_remain(2)
15121512
got = await host_sink.consume(2)
@@ -1519,7 +1519,7 @@ async def core_func(task, args):
15191519
[ret] = await canon_lower(lower_opts, host_ft2, host_func2, task, [retp])
15201520
assert(ret == 0)
15211521
rsi = mem[retp]
1522-
[ret] = await canon_stream_read(task, rsi, 0, 4)
1522+
[ret] = await canon_stream_read(U8Type(), task, rsi, 0, 4)
15231523
assert(ret == definitions.BLOCKED)
15241524
[ret] = await canon_stream_cancel_read(True, task, rsi)
15251525
assert(ret == 0)
@@ -1529,7 +1529,7 @@ async def core_func(task, args):
15291529
[ret] = await canon_lower(lower_opts, host_ft2, host_func2, task, [retp])
15301530
assert(ret == 0)
15311531
rsi = mem[retp]
1532-
[ret] = await canon_stream_read(task, rsi, 0, 4)
1532+
[ret] = await canon_stream_read(U8Type(), task, rsi, 0, 4)
15331533
assert(ret == definitions.BLOCKED)
15341534
host_source.eager_cancel.clear()
15351535
[ret] = await canon_stream_cancel_read(False, task, rsi)
@@ -1607,12 +1607,12 @@ async def core_func(task, args):
16071607
rfi = mem[retp]
16081608

16091609
readp = 0
1610-
[ret] = await canon_future_read(task, rfi, readp)
1610+
[ret] = await canon_future_read(U8Type(), task, rfi, readp)
16111611
assert(ret == definitions.BLOCKED)
16121612

16131613
writep = 8
16141614
mem[writep] = 42
1615-
[ret] = await canon_future_write(task, wfi, writep)
1615+
[ret] = await canon_future_write(U8Type(), task, wfi, writep)
16161616
assert(ret == 1)
16171617

16181618
event,p1,p2 = await task.wait()
@@ -1637,12 +1637,12 @@ async def core_func(task, args):
16371637
rfi = mem[retp]
16381638

16391639
readp = 0
1640-
[ret] = await canon_future_read(task, rfi, readp)
1640+
[ret] = await canon_future_read(U8Type(), task, rfi, readp)
16411641
assert(ret == definitions.BLOCKED)
16421642

16431643
writep = 8
16441644
mem[writep] = 42
1645-
[ret] = await canon_future_write(task, wfi, writep)
1645+
[ret] = await canon_future_write(U8Type(), task, wfi, writep)
16461646
assert(ret == 1)
16471647

16481648
event,p1,p2 = await task.wait()

0 commit comments

Comments
 (0)