@@ -1062,6 +1062,7 @@ def write(self, vs):
1062
1062
1063
1063
class HostSink :
1064
1064
stream : ReadableStream
1065
+ t : ValType
1065
1066
received : list [int ]
1066
1067
chunk : int
1067
1068
write_remain : int
@@ -1070,6 +1071,7 @@ class HostSink:
1070
1071
1071
1072
def __init__ (self , stream , chunk , remain = 2 ** 64 ):
1072
1073
self .stream = stream
1074
+ self .t = stream .t
1073
1075
self .received = []
1074
1076
self .chunk = chunk
1075
1077
self .write_remain = remain
@@ -1781,10 +1783,12 @@ async def core_func(task, args):
1781
1783
1782
1784
1783
1785
class HostFutureSink :
1786
+ t : ValType
1784
1787
v : Optional [any ]
1785
1788
has_v : asyncio .Event
1786
1789
1787
- def __init__ (self ):
1790
+ def __init__ (self , t ):
1791
+ self .t = t
1788
1792
self .v = None
1789
1793
self .has_v = asyncio .Event ()
1790
1794
@@ -1849,7 +1853,7 @@ async def host_func(task, on_start, on_resolve, on_block):
1849
1853
[future ] = on_start ()
1850
1854
outgoing = HostFutureSource (U8Type ())
1851
1855
on_resolve ([outgoing ])
1852
- incoming = HostFutureSink ()
1856
+ incoming = HostFutureSink (U8Type () )
1853
1857
future .read (None , incoming , lambda :(), lambda why :())
1854
1858
wait = asyncio .create_task (incoming .has_v .wait ())
1855
1859
await on_block (wait )
@@ -2169,6 +2173,63 @@ def on_resolve(results):
2169
2173
assert (len (got ) == 1 )
2170
2174
assert (got [0 ] == 42 )
2171
2175
2176
+ async def test_self_empty ():
2177
+ inst = ComponentInstance ()
2178
+ mem = bytearray (24 )
2179
+ sync_opts = mk_opts (memory = mem , sync = True )
2180
+ async_opts = mk_opts (memory = mem , sync = False )
2181
+
2182
+ ft = FuncType ([],[])
2183
+ async def core_func (task , args ):
2184
+ [seti ] = await canon_waitable_set_new (task )
2185
+
2186
+ [packed ] = await canon_future_new (None , task )
2187
+ rfi ,wfi = unpack_new_ends (packed )
2188
+
2189
+ [ret ] = await canon_future_write (None , async_opts , task , wfi , 10000 )
2190
+ assert (ret == definitions .BLOCKED )
2191
+
2192
+ [ret ] = await canon_future_read (None , async_opts , task , rfi , 20000 )
2193
+ result ,n = unpack_result (ret )
2194
+ assert (n == 1 and result == definitions .CLOSED )
2195
+ [] = await canon_future_close_readable (None , task , rfi )
2196
+
2197
+ [] = await canon_waitable_join (task , wfi , seti )
2198
+ [event ] = await canon_waitable_set_wait (True , mem , task , seti , 0 )
2199
+ assert (event == EventCode .FUTURE_WRITE )
2200
+ assert (mem [0 ] == wfi )
2201
+ result ,n = unpack_result (mem [4 ])
2202
+ assert (result == definitions .CLOSED )
2203
+ assert (n == 1 )
2204
+ [] = await canon_future_close_writable (None , task , wfi )
2205
+
2206
+ [packed ] = await canon_stream_new (None , task )
2207
+ rsi ,wsi = unpack_new_ends (packed )
2208
+ [ret ] = await canon_stream_write (None , async_opts , task , wsi , 10000 , 3 )
2209
+ assert (ret == definitions .BLOCKED )
2210
+
2211
+ [ret ] = await canon_stream_read (None , async_opts , task , rsi , 2000 , 1 )
2212
+ result ,n = unpack_result (ret )
2213
+ assert (n == 1 and result == definitions .COMPLETED )
2214
+ [ret ] = await canon_stream_read (None , async_opts , task , rsi , 2000 , 4 )
2215
+ result ,n = unpack_result (ret )
2216
+ assert (n == 2 and result == definitions .COMPLETED )
2217
+ [] = await canon_stream_close_readable (None , task , rsi )
2218
+
2219
+ [] = await canon_waitable_join (task , wsi , seti )
2220
+ [event ] = await canon_waitable_set_wait (True , mem , task , seti , 0 )
2221
+ assert (event == EventCode .STREAM_WRITE )
2222
+ assert (mem [0 ] == wsi )
2223
+ result ,n = unpack_result (mem [4 ])
2224
+ assert (result == definitions .CLOSED )
2225
+ assert (n == 3 )
2226
+ [] = await canon_stream_close_writable (None , task , wsi )
2227
+
2228
+ [] = await canon_waitable_set_drop (task , seti )
2229
+ return []
2230
+
2231
+ await canon_lift (sync_opts , inst , ft , core_func , None , lambda :[], lambda _ :(), host_on_block )
2232
+
2172
2233
async def run_async_tests ():
2173
2234
await test_roundtrips ()
2174
2235
await test_handles ()
@@ -2187,6 +2248,7 @@ async def run_async_tests():
2187
2248
await test_cancel_copy ()
2188
2249
await test_futures ()
2189
2250
await test_cancel_subtask ()
2251
+ await test_self_empty ()
2190
2252
2191
2253
asyncio .run (run_async_tests ())
2192
2254
0 commit comments