From 98994d5bccb87935870fc0a96da8f1a63aaf9dfe Mon Sep 17 00:00:00 2001 From: Kartik Agaram Date: Thu, 11 Jul 2019 21:47:00 -0700 Subject: [PATCH] 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. --- subx/apps/survey.subx | 129 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 126 insertions(+), 3 deletions(-) diff --git a/subx/apps/survey.subx b/subx/apps/survey.subx index 5f776d38..a5e82759 100644 --- a/subx/apps/survey.subx +++ b/subx/apps/survey.subx @@ -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