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:
parent
bbfa2acaca
commit
98994d5bcc
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue