about summary refs log blame commit diff stats
path: root/arc/.traces/new-fn-reply-oarg-multiple
blob: 59d7e94fe893084383945ec9c65d8d8f5176fdac (plain) (tree)































































































                                                                                    
c{0: 0 (((1 integer)) <- ((copy)) ((1 literal))) -- nil
c{0: 1 (((2 integer)) <- ((copy)) ((3 literal))) -- nil
c{0: 2 (((3 integer)) ((7 integer)) <- ((test1)) ((1 integer)) ((2 integer))) -- nil
c{1: 0 ✓ (((1 integer)) <- ((copy)) ((1 literal)))
c{1: 1 ✓ (((2 integer)) <- ((copy)) ((3 literal)))
c{1: 2 ✓ (((3 integer)) ((7 integer)) <- ((test1)) ((1 integer)) ((2 integer)))
c{0: 0 (((4 integer)) <- ((next-input))) -- nil
c{0: 1 (((5 integer)) <- ((next-input))) -- nil
c{0: 2 (((6 integer)) <- ((add)) ((4 integer)) ((5 integer))) -- nil
c{0: 3 (((reply)) ((6 integer)) ((5 integer))) -- nil
c{0: 4 (((4 integer)) <- ((copy)) ((34 literal))) -- nil
c{1: 0 ✓ (((4 integer)) <- ((next-input)))
c{1: 1 ✓ (((5 integer)) <- ((next-input)))
c{1: 2 ✓ (((6 integer)) <- ((add)) ((4 integer)) ((5 integer)))
c{1: 3 ✓ (((reply)) ((6 integer)) ((5 integer)))
c{1: 4 ✓ (((4 integer)) <- ((copy)) ((34 literal)))
cn0: convert-names in main
cn0: (((1 integer)) <- ((copy)) ((1 literal))) nil nil
cn0: checking arg ((1 literal))
cn0: checking oarg ((1 integer))
maybe-add: ((1 integer))
cn0: (((2 integer)) <- ((copy)) ((3 literal))) nil nil
cn0: checking arg ((3 literal))
cn0: checking oarg ((2 integer))
maybe-add: ((2 integer))
cn0: (((3 integer)) ((7 integer)) <- ((test1)) ((1 integer)) ((2 integer))) nil nil
cn0: checking arg ((1 integer))
maybe-add: ((1 integer))
cn0: checking arg ((2 integer))
maybe-add: ((2 integer))
cn0: checking oarg ((3 integer))
maybe-add: ((3 integer))
cn0: checking oarg ((7 integer))
maybe-add: ((7 integer))
cn0: convert-names in test1
cn0: (((4 integer)) <- ((next-input))) nil nil
cn0: checking oarg ((4 integer))
maybe-add: ((4 integer))
cn0: (((5 integer)) <- ((next-input))) nil nil
cn0: checking oarg ((5 integer))
maybe-add: ((5 integer))
cn0: (((6 integer)) <- ((add)) ((4 integer)) ((5 integer))) nil nil
cn0: checking arg ((4 integer))
maybe-add: ((4 integer))
cn0: checking arg ((5 integer))
maybe-add: ((5 integer))
cn0: checking oarg ((6 integer))
maybe-add: ((6 integer))
cn0: (((reply)) ((6 integer)) ((5 integer))) nil nil
cn0: checking arg ((6 integer))
maybe-add: ((6 integer))
cn0: checking arg ((5 integer))
maybe-add: ((5 integer))
cn0: (((4 integer)) <- ((copy)) ((34 literal))) nil nil
cn0: checking arg ((34 literal))
cn0: checking oarg ((4 integer))
maybe-add: ((4 integer))
cn1: (((1 integer)) <- ((copy)) ((1 literal)))
cn1: (((2 integer)) <- ((copy)) ((3 literal)))
cn1: (((3 integer)) ((7 integer)) <- ((test1)) ((1 integer)) ((2 integer)))
cn1: (((4 integer)) <- ((next-input)))
cn1: (((5 integer)) <- ((next-input)))
cn1: (((6 integer)) <- ((add)) ((4 integer)) ((5 integer)))
cn1: (((reply)) ((6 integer)) ((5 integer)))
cn1: (((4 integer)) <- ((copy)) ((34 literal)))
schedule: main
run: main 0: (((1 integer)) <- ((copy)) ((1 literal)))
run: main 0: 1 => ((1 integer))
mem: ((1 integer)): 1 <= 1
run: main 1: (((2 integer)) <- ((copy)) ((3 literal)))
run: main 1: 3 => ((2 integer))
mem: ((2 integer)): 2 <= 3
run: main 2: (((3 integer)) ((7 integer)) <- ((test1)) ((1 integer)) ((2 integer)))
mem: ((1 integer)) => 1
mem: ((2 integer)) => 3
run: test1/main 0: (((4 integer)) <- ((next-input)))
arg: nil 0 (1 3)
run: test1/main 0: 1 => ((4 integer))
mem: ((4 integer)): 4 <= 1
run: test1/main 1: (((5 integer)) <- ((next-input)))
arg: nil 1 (1 3)
run: test1/main 1: 3 => ((5 integer))
mem: ((5 integer)): 5 <= 3
run: test1/main 2: (((6 integer)) <- ((add)) ((4 integer)) ((5 integer)))
mem: ((4 integer)) => 1
mem: ((5 integer)) => 3
run: test1/main 2: 4 => ((6 integer))
mem: ((6 integer)): 6 <= 4
run: test1/main 3: (((reply)) ((6 integer)) ((5 integer)))
mem: ((6 integer)) => 4
mem: ((5 integer)) => 3
run: main 2: 4 => ((3 integer))
mem: ((3 integer)): 3 <= 4
run: main 2: 3 => ((7 integer))
mem: ((7 integer)): 7 <= 3
schedule: done with routine nil
3/mod/direct 5/rm32/ebp . . . 4/r32/esp . . # copy esp to ebp # . save registers 50/push-eax 51/push-ecx 52/push-edx 53/push-ebx 56/push-esi 57/push-edi # eax = msg 8b/copy 1/mod/*+disp8 5/rm32/ebp . . 0/r32/eax 0xc/disp8 . # copy *(ebp+12) to eax # var in/esi: (addr byte) = msg->data 8d/copy-address 1/mod/*+disp8 0/rm32/eax . . . 6/r32/esi 4/disp8 . # copy eax+4 to esi # var inend/ecx: (addr byte) = &msg->data[msg->size] 8b/copy 0/mod/indirect 0/rm32/eax . . . 1/r32/ecx . . # copy *eax to ecx 8d/copy-address 0/mod/indirect 4/rm32/sib 6/base/esi 1/index/ecx . 1/r32/ecx . . # copy esi+ecx to ecx # edi = f 8b/copy 1/mod/*+disp8 5/rm32/ebp . . 7/r32/edi 8/disp8 . # copy *(ebp+8) to edi # edx = f->size 8b/copy 1/mod/*+disp8 7/rm32/edi . . . 2/r32/edx 0xc/disp8 . # copy *(edi+12) to edx # ebx = f->write 8b/copy 1/mod/*+disp8 7/rm32/edi . . . 3/r32/ebx 4/disp8 . # copy *(edi+4) to ebx $write-buffered:loop: # if (in >= inend) break 39/compare 3/mod/direct 6/rm32/esi . . . 1/r32/ecx . . # compare esi with ecx 73/jump-if-addr>= $write-buffered:loop-end/disp8 # if (f->write >= f->size) flush and clear f's stream 39/compare 3/mod/direct 3/rm32/ebx . . . 2/r32/edx . . # compare ebx with edx 7c/jump-if-< $write-buffered:to-stream/disp8 # . persist f->write 89/copy 1/mod/*+disp8 7/rm32/edi . . . 3/r32/ebx 4/disp8 . # copy ebx to *(edi+4) # . flush(f) # . . push args 57/push-edi # . . call e8/call flush/disp32 # . . discard args 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32 # add to esp # . clear-stream(stream = f+4) # . . push args 8d/copy-address 1/mod/*+disp8 7/rm32/edi . . . 0/r32/eax 4/disp8 . # copy edi+4 to eax 50/push-eax # . . call e8/call clear-stream/disp32 # . . discard args 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32 # add to esp # . f->write must now be 0; update its cache at ebx 31/xor 3/mod/direct 3/rm32/ebx . . . 3/r32/ebx . . # clear ebx $write-buffered:to-stream: # write to stream # f->data[f->write] = *in # . AL = *in 31/xor 3/mod/direct 0/rm32/eax . . . 0/r32/eax . . # clear eax 8a/copy-byte 0/mod/indirect 6/rm32/esi . . . 0/r32/AL . . # copy byte at *esi to AL # . f->data[f->write] = AL 88/copy-byte 1/mod/*+disp8 4/rm32/sib 7/base/edi 3/index/ebx . 0/r32/AL 0x10/disp8 . # copy AL to *(edi+ebx+16) # ++f->write 43/increment-ebx # ++in 46/increment-esi eb/jump $write-buffered:loop/disp8 $write-buffered:loop-end: # persist necessary variables from registers 89/copy 1/mod/*+disp8 7/rm32/edi . . . 3/r32/ebx 4/disp8 . # copy ebx to *(edi+4) $write-buffered:end: # . restore registers 5f/pop-to-edi 5e/pop-to-esi 5b/pop-to-ebx 5a/pop-to-edx 59/pop-to-ecx 58/pop-to-eax # . epilogue 89/copy 3/mod/direct 4/rm32/esp . . . 5/r32/ebp . . # copy ebp to esp 5d/pop-to-ebp c3/return test-write-buffered: # - check that write-buffered writes to the file # setup # . clear-stream(_test-stream) # . . push args 68/push _test-stream/imm32 # . . call e8/call clear-stream/disp32 # . . discard args 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32 # add to esp # . clear-stream($_test-buffered-file->buffer) # . . push args 68/push $_test-buffered-file->buffer/imm32 # . . call e8/call clear-stream/disp32 # . . discard args 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32 # add to esp # write-buffered(_test-buffered-file, "Abc") # . . push args 68/push "Abc"/imm32 68/push _test-buffered-file/imm32 # . . call e8/call write-buffered/disp32 # . . discard args 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 8/imm32 # add to esp # flush(_test-buffered-file) # . . push args 68/push _test-buffered-file/imm32 # . . call e8/call flush/disp32 # . . discard args 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32 # add to esp # check-stream-equal(_test-stream, "Abc", msg) # . . push args 68/push "F - test-write-buffered-single"/imm32 68/push "Abc"/imm32 68/push _test-stream/imm32 # . . call e8/call check-stream-equal/disp32 # . . discard args 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0xc/imm32 # add to esp # . end c3/return test-write-buffered-with-intermediate-flush: # - check that write-buffered flushes in the middle if its buffer fills up # setup # . clear-stream(_test-stream) # . . push args 68/push _test-stream/imm32 # . . call e8/call clear-stream/disp32 # . . discard args 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32 # add to esp # . clear-stream($_test-buffered-file->buffer) # . . push args 68/push $_test-buffered-file->buffer/imm32 # . . call e8/call clear-stream/disp32 # . . discard args 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 4/imm32 # add to esp # _test-stream can hold 8 bytes, but _test-buffered-file can hold only 6. # Try to write 7 bytes. # . write-buffered(_test-buffered-file, "Abcdefg") # . . push args 68/push "Abcdefg"/imm32 68/push _test-buffered-file/imm32 # . . call e8/call write-buffered/disp32 # . . discard args 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 8/imm32 # add to esp # don't flush # 6 bytes should still have gotten to _test-stream # . check-ints-equal(*_test-stream->write, 6, msg) # . . push args 68/push "F - test-write-buffered-with-intermediate-flush: flushed data"/imm32 68/push 6/imm32 # . . push *_test-stream->write b8/copy-to-eax _test-stream/imm32 ff 6/subop/push 0/mod/indirect 0/rm32/eax . . . . . . # push *eax # . . call e8/call check-ints-equal/disp32 # . . discard args 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0xc/imm32 # add to esp # and 1 byte should still be in _test-buffered-file # . check-ints-equal(*_test-buffered-file->write, 1, msg) # . . push args 68/push "F - test-write-buffered-with-intermediate-flush: unflushed bytes"/imm32 68/push 1/imm32 # . . push *_test-buffered-file->write b8/copy-to-eax _test-buffered-file/imm32 ff 6/subop/push 1/mod/*+disp8 0/rm32/eax . . . . 4/disp8 . # push *(eax+4) # . . call e8/call check-ints-equal/disp32 # . . discard args 81 0/subop/add 3/mod/direct 4/rm32/esp . . . . . 0xc/imm32 # add to esp # . end c3/return == data # The buffered file for standard error. Stderr: # buffered-file # file descriptor or (addr stream byte) 2/imm32 # standard error $Stderr->buffer: # inlined fields for a stream # current write index 0/imm32 # current read index 0/imm32 # size 8/imm32 # data 00 00 00 00 00 00 00 00 # 8 bytes # TODO: 8 bytes is too small. We'll need to grow the buffer for efficiency. But # I don't want to type in 1024 bytes here. # . . vim:nowrap:textwidth=0