the problem: curr-segment-name is stale

It's a slice into the 'line' stream. But we want to preserve the current
segment name across lines.

Let's leak some memory.
This commit is contained in:
Kartik Agaram 2019-07-11 21:47:00 -07:00
parent bbfa2acaca
commit 98994d5bcc
1 changed files with 126 additions and 3 deletions

View File

@ -436,6 +436,83 @@ $compute-offsets:word-loop:
e8/call next-word/disp32
# . discard args
81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP
# dump word-slice {{{
# . write(2/stderr, "AA: ")
# . . push args
68/push "AA: "/imm32
68/push 2/imm32/stderr
# . . call
e8/call write/disp32
# . . discard args
81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP
# . clear-stream(Stderr+4)
# . . save EAX
50/push-EAX
# . . push args
b8/copy-to-EAX Stderr/imm32
05/add-to-EAX 4/imm32
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
# . . restore EAX
58/pop-to-EAX
# . write-slice-buffered(Stderr, word-slice)
# . . push args
52/push-EDX
68/push Stderr/imm32
# . . call
e8/call write-slice-buffered/disp32
# . . discard args
81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP
# . flush(Stderr)
# . . push args
68/push Stderr/imm32
# . . call
e8/call flush/disp32
# . . discard args
81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP
# . write(2/stderr, "$\n")
# . . push args
68/push "$\n"/imm32
68/push 2/imm32/stderr
# . . call
e8/call write/disp32
# . . discard args
81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP
# . write(2/stderr, "segment at start of word: ")
# . . push args
68/push "segment at start of word: "/imm32
68/push 2/imm32/stderr
# . . call
e8/call write/disp32
# . . discard args
81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP
# . write-slice-buffered(Stderr, curr-segment-name)
# . . push args
68/push compute-offsets:curr-segment-name/imm32
68/push Stderr/imm32
# . . call
e8/call write-slice-buffered/disp32
# . . discard args
81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP
# . flush(Stderr)
# . . push args
68/push Stderr/imm32
# . . call
e8/call flush/disp32
# . . discard args
81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP
# . write(2/stderr, "$\n")
# . . push args
68/push "$\n"/imm32
68/push 2/imm32/stderr
# . . call
e8/call write/disp32
# . . discard args
81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP
# }}}
# if slice-empty?(word/EDX) break
# . EAX = slice-empty?(word/EDX)
52/push-EDX
@ -453,7 +530,7 @@ $compute-offsets:word-loop:
81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP
# . if (EAX != 0) continue
3d/compare-EAX-and 0/imm32
75/jump-if-not-equal $compute-offsets:word-loop/disp8
0f 85/jump-if-not-equal $compute-offsets:word-loop/disp32
$compute-offsets:label:
# if (!is-label?(word-slice/EDX)) goto next check
# . EAX = is-label?(word-slice/EDX)
@ -468,7 +545,7 @@ $compute-offsets:label:
74/jump-if-equal $compute-offsets:segment/disp8
# strip trailing ':' from word-slice
ff 1/subop/decrement 1/mod/*+disp8 2/rm32/EDX . . . . 4/disp8 . # decrement *(EDX+4)
# x/EAX = get-or-insert-slice(labels, word-slice)
# x/EAX = get-or-insert-slice(labels, word-slice, row-size=16)
# . . push args
68/push 0x10/imm32/row-size
52/push-EDX
@ -565,6 +642,52 @@ $compute-offsets:construct-next-segment:
e8/call next-word/disp32
# . discard args
81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP
# dump curr-segment-name {{{
# . write(2/stderr, "setting segment to: ")
# . . push args
68/push "setting segment to: "/imm32
68/push 2/imm32/stderr
# . . call
e8/call write/disp32
# . . discard args
81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP
# . clear-stream(Stderr+4)
# . . save EAX
50/push-EAX
# . . push args
b8/copy-to-EAX Stderr/imm32
05/add-to-EAX 4/imm32
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
# . . restore EAX
58/pop-to-EAX
# . write-slice-buffered(Stderr, curr-segment-name)
# . . push args
68/push compute-offsets:curr-segment-name/imm32
68/push Stderr/imm32
# . . call
e8/call write-slice-buffered/disp32
# . . discard args
81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP
# . flush(Stderr)
# . . push args
68/push Stderr/imm32
# . . call
e8/call flush/disp32
# . . discard args
81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP
# . write(2/stderr, "$\n")
# . . push args
68/push "$\n"/imm32
68/push 2/imm32/stderr
# . . call
e8/call write/disp32
# . . discard args
81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP
# }}}
# if slice-empty?(curr-segment-name) abort
# . EAX = slice-empty?(curr-segment-name)
68/push compute-offsets:curr-segment-name/imm32
@ -798,7 +921,7 @@ test-compute-offsets:
e8/call check-trace-contains/disp32
# . . discard args
81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP
# . check-trace-contains("segment 'data' is at file offset 0x5", msg)
# . check-trace-contains("segment 'data' is at file offset 0x00000005.", msg)
# . . push args
68/push "F - test-compute-offsets/2"/imm32
68/push "segment 'data' is at file offset 0x00000005."/imm32