diff --git a/lib/blob.asm b/lib/blob.asm index a9187b0e..37680b35 100644 --- a/lib/blob.asm +++ b/lib/blob.asm @@ -298,454 +298,6 @@ k_pair_source2: ; -- nth -1 ; base'',len',cust tail ref std.send_msg -; -; input stream-requestor interface to a blob -; cust,blob -> stream -; - -reader_factory: ; _ <- cust,blob - msg 0 ; cust,blob - push k_reader_init ; cust,blob k_reader_init - actor create ; k=k_reader_init.cust,blob - msg -1 ; k blob - ref std.send_msg -k_reader_init: ; cust,blob <- size - state -1 ; blob - msg 0 ; blob size - push 0 ; blob size ofs=0 - pair 2 ; ofs,size,blob - push reader ; ofs,size,blob reader - actor become ; -- - actor self ; SELF - state 1 ; SELF cust - ref std.send_msg - -reader: ; ofs,size,blob <- can,cb,req | data,cb | (len,blob'),k - msg 0 ; msg - typeq #pair_t ; is_pair(msg) - if_not std.abort ; -- - msg 1 ; (len,blob) - typeq #pair_t ; is_pair((len,blob)) - if reader_grow ; -- - msg 1 ; data - typeq #fixnum_t ; is_fix(data) - if reader_ok ; -- - msg 2 ; cb - typeq #actor_t ; is_cap(cb) - if_not std.abort ; -- - msg -2 ; req - eq #? ; req==#? - if reader_read ; -- -reader_fail: ; -- - push #? ; #? - push #f ; #? #f - pair 1 ; #f,#? - msg 2 ; #f,#? cb - ref std.send_msg -reader_read: ; -- - state 1 ; ofs - state 2 ; ofs size - cmp lt ; ofs stream -; - -writer_factory: ; blob_dev <- cust,blk_size - msg -1 ; len=blk_size - state 0 ; len blob_dev - msg 0 ; len blob_dev cust,blk_size - part 1 ; len blob_dev blk_size cust - pair 2 ; len cust,blk_size,blob_dev - push k_writer_init ; len cust,blk_size,blob_dev k_writer_init - actor create ; len k=k_writer_init.cust,blk_size,blob_dev - pair 1 ; k,len - state 0 ; k,len blob_dev - ref std.send_msg - -k_writer_init: ; cust,blk_size,blob_dev <- blob - msg 0 ; blob - typeq #actor_t ; is_cap(blob) - if_not writer_init_fail ; -- - state -2 ; blob_dev - msg 0 ; blob_dev blob - push wr_blob ; blob_dev blob wr_blob - actor create ; blob_dev first=wr_blob.blob - state 2 ; blob_dev first size=blk_size - pick 2 ; blob_dev first size first - push 0 ; blob_dev first size first ofs=0 - pair 4 ; ofs,first,size,first,blob_dev - push writer ; ofs,first,size,first,blob_dev writer - actor become ; -- - actor self ; SELF - state 1 ; SELF cust - ref std.send_msg -writer_init_fail: ; -- - push #? ; #? - state 1 ; #? cust - ref std.send_msg - -wr_blob: ; blob <- cust,len | cust,next | cust,ofs,data - msg 1 ; cust - typeq #actor_t ; is_cap(cust) - if_not std.abort ; -- - msg -1 ; req - typeq #fixnum_t ; is_fix(req) - if wr_slice ; -- - msg -1 ; req - typeq #actor_t ; is_cap(req) - if wr_pair ; -- - msg -1 ; req - typeq #pair_t ; is_pair(req) - if_not std.abort ; -- -wr_write: ; write into blob - msg 0 ; cust,ofs,data - state 0 ; cust,ofs,data blob - ref std.send_msg -wr_slice: ; convert to blob.slice -; msg 0 ; cust,len - state 0 ; blob - msg -1 ; blob len - push 0 ; blob len base=0 - pair 2 ; base,len,blob - push slice ; base,len,blob slice - actor become ; -- - actor self ; SELF - msg 1 ; SELF cust - ref std.send_msg -wr_pair: ; convert to blob.pair -; msg 0 ; cust,next - msg -1 ; tail=next - state 0 ; tail head=blob - pair 1 ; head,tail - push pair ; head,tail pair - actor become ; -- - msg 0 ; cust,next - part 1 ; next cust - ref std.send_msg - -writer: ; ofs,blob,size,blobs,blob_dev <- can,cb,req | ok,cb | (can,cb,req),blob'' - msg 0 ; msg - typeq #pair_t ; is_pair(msg) - if_not std.abort ; -- - msg 1 ; (can,cb,req) - typeq #pair_t ; is_pair((can,cb,req)) - if writer_grown ; -- - msg -1 ; cb - typeq #actor_t ; is_cap(cb) - if writer_done ; -- - msg -2 ; req - eq #? ; req==#? - if writer_read ; -- - msg -2 ; req - typeq #fixnum_t ; is_fix(req) - if writer_write ; -- - ref std.abort - -writer_read: ; -- - state 1 ; len=ofs - state 4 ; len blobs - msg 2 ; len blobs cb - pair 1 ; len cb,blobs - push writer_stone ; len cb,blobs writer_stone - actor create ; len cust=writer_stone.cb,blobs - pair 1 ; cust,len - state 2 ; cust,len blob - ref std.send_msg -writer_stone: ; cb,blobs <- slice - state -1 ; blobs - push #t ; blobs #t - pair 1 ; #t,blobs - state 1 ; #t,blobs cb - ref std.send_msg - -writer_write: ; -- - state 1 ; ofs - state 3 ; ofs size - cmp lt ; ofs stream +; + +reader_factory: ; _ <- cust,blob + msg 0 ; cust,blob + push k_reader_init ; cust,blob k_reader_init + actor create ; k=k_reader_init.cust,blob + msg -1 ; k blob + ref std.send_msg +k_reader_init: ; cust,blob <- size + state -1 ; blob + msg 0 ; blob size + push 0 ; blob size ofs=0 + pair 2 ; ofs,size,blob + push reader ; ofs,size,blob reader + actor become ; -- + actor self ; SELF + state 1 ; SELF cust + ref std.send_msg + +reader: ; ofs,size,blob <- can,cb,req | data,cb | (len,blob'),k + msg 0 ; msg + typeq #pair_t ; is_pair(msg) + if_not std.abort ; -- + msg 1 ; (len,blob) + typeq #pair_t ; is_pair((len,blob)) + if reader_grow ; -- + msg 1 ; data + typeq #fixnum_t ; is_fix(data) + if reader_ok ; -- + msg 2 ; cb + typeq #actor_t ; is_cap(cb) + if_not std.abort ; -- + msg -2 ; req + eq #? ; req==#? + if reader_read ; -- +reader_fail: ; -- + push #? ; #? + push #f ; #? #f + pair 1 ; #f,#? + msg 2 ; #f,#? cb + ref std.send_msg +reader_read: ; -- + state 1 ; ofs + state 2 ; ofs size + cmp lt ; ofs stream +; + +writer_factory: ; blob_dev <- cust,blk_size + msg -1 ; len=blk_size + state 0 ; len blob_dev + msg 0 ; len blob_dev cust,blk_size + part 1 ; len blob_dev blk_size cust + pair 2 ; len cust,blk_size,blob_dev + push k_writer_init ; len cust,blk_size,blob_dev k_writer_init + actor create ; len k=k_writer_init.cust,blk_size,blob_dev + pair 1 ; k,len + state 0 ; k,len blob_dev + ref std.send_msg + +k_writer_init: ; cust,blk_size,blob_dev <- blob + msg 0 ; blob + typeq #actor_t ; is_cap(blob) + if_not writer_init_fail ; -- + state -2 ; blob_dev + msg 0 ; blob_dev blob + push wr_blob ; blob_dev blob wr_blob + actor create ; blob_dev first=wr_blob.blob + state 2 ; blob_dev first size=blk_size + pick 2 ; blob_dev first size first + push 0 ; blob_dev first size first ofs=0 + pair 4 ; ofs,first,size,first,blob_dev + push writer ; ofs,first,size,first,blob_dev writer + actor become ; -- + actor self ; SELF + state 1 ; SELF cust + ref std.send_msg +writer_init_fail: ; -- + push #? ; #? + state 1 ; #? cust + ref std.send_msg + +wr_blob: ; blob <- cust,len | cust,next | cust,ofs,data + msg 1 ; cust + typeq #actor_t ; is_cap(cust) + if_not std.abort ; -- + msg -1 ; req + typeq #fixnum_t ; is_fix(req) + if wr_slice ; -- + msg -1 ; req + typeq #actor_t ; is_cap(req) + if wr_pair ; -- + msg -1 ; req + typeq #pair_t ; is_pair(req) + if_not std.abort ; -- +wr_write: ; write into blob + msg 0 ; cust,ofs,data + state 0 ; cust,ofs,data blob + ref std.send_msg +wr_slice: ; convert to blob.slice +; msg 0 ; cust,len + state 0 ; blob + msg -1 ; blob len + push 0 ; blob len base=0 + pair 2 ; base,len,blob + push blob.slice ; base,len,blob slice + actor become ; -- + actor self ; SELF + msg 1 ; SELF cust + ref std.send_msg +wr_pair: ; convert to blob.pair +; msg 0 ; cust,next + msg -1 ; tail=next + state 0 ; tail head=blob + pair 1 ; head,tail + push blob.pair ; head,tail pair + actor become ; -- + msg 0 ; cust,next + part 1 ; next cust + ref std.send_msg + +writer: ; ofs,blob,size,blobs,blob_dev <- can,cb,req | ok,cb | (can,cb,req),blob'' + msg 0 ; msg + typeq #pair_t ; is_pair(msg) + if_not std.abort ; -- + msg 1 ; (can,cb,req) + typeq #pair_t ; is_pair((can,cb,req)) + if writer_grown ; -- + msg -1 ; cb + typeq #actor_t ; is_cap(cb) + if writer_done ; -- + msg -2 ; req + eq #? ; req==#? + if writer_read ; -- + msg -2 ; req + typeq #fixnum_t ; is_fix(req) + if writer_write ; -- + ref std.abort + +writer_read: ; -- + state 1 ; len=ofs + state 4 ; len blobs + msg 2 ; len blobs cb + pair 1 ; len cb,blobs + push writer_stone ; len cb,blobs writer_stone + actor create ; len cust=writer_stone.cb,blobs + pair 1 ; cust,len + state 2 ; cust,len blob + ref std.send_msg +writer_stone: ; cb,blobs <- slice + state -1 ; blobs + push #t ; blobs #t + pair 1 ; #t,blobs + state 1 ; #t,blobs cb + ref std.send_msg + +writer_write: ; -- + state 1 ; ofs + state 3 ; ofs size + cmp lt ; ofs