From cfd941b0fd015711d72c54545c18e9a71b8ad3ba Mon Sep 17 00:00:00 2001 From: Kartik Agaram Date: Mon, 20 May 2019 00:35:43 -0700 Subject: support string literals in emit-string-literal-data As expected, almost all tests now passing. --- subx/apps/dquotes | Bin 26828 -> 26842 bytes subx/apps/dquotes.subx | 30 +++++++++++++++++++----------- 2 files changed, 19 insertions(+), 11 deletions(-) (limited to 'subx/apps') diff --git a/subx/apps/dquotes b/subx/apps/dquotes index 60e9a147..687140db 100755 Binary files a/subx/apps/dquotes and b/subx/apps/dquotes differ diff --git a/subx/apps/dquotes.subx b/subx/apps/dquotes.subx index d0323b74..1e81d4e7 100644 --- a/subx/apps/dquotes.subx +++ b/subx/apps/dquotes.subx @@ -849,9 +849,9 @@ test-convert-processes-string-literals: # generate the data segment contents byte by byte for a given slice emit-string-literal-data: # out : (address stream), word : (address slice) # pseudocode - # var len = word->end - word->start - 2 # ignore the double-quotes - # append-int32-hex(out, len) - # write(out, "/imm32") + # end-of-literal = skip-string-in-slice(word->start, word->end) + # var len = end-of-literal - word->start - 2 # ignore the double-quotes + # print(out, "#{len}/imm32 ") # curr = word->start # ++curr # skip '"' # while true @@ -878,15 +878,21 @@ emit-string-literal-data: # out : (address stream), word : (address slice) # curr/EDX = word->start 8b/copy 0/mod/indirect 6/rm32/ESI . . . 2/r32/EDX . . # copy *ESI to EDX $emit-string-literal-data:emit-length: - # TODO: handle metadata here + # end-of-literal/EAX = skip-string-in-slice(word->start, word->end) + # . . push args + ff 6/subop/push 1/mod/*+disp8 6/rm32/ESI . . . . 4/disp8 . # push *(ESI+4) + 52/push-EDX + # . . call + e8/call skip-string-in-slice/disp32 + # . . discard args + 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP + # len/EAX = end-of-literal - word->start - 2 + 29/subtract 3/mod/direct 0/rm32/EAX . . . 2/r32/EDX . . # subtract EDX from EAX + 81 5/subop/subtract 3/mod/direct 0/rm32/EAX . . . . . 2/imm32 # subtract from EAX # print(out, "#{len}/imm32 ") - # . len/ECX = word->end - word->start - 2 - 8b/copy 1/mod/*+disp8 6/rm32/ESI . . . 1/r32/ECX 4/disp8 . # copy *(ESI+4) to ECX - 29/subtract 3/mod/direct 1/rm32/ECX . . . 2/r32/EDX . . # subtract EDX from ECX - 81 5/subop/subtract 3/mod/direct 1/rm32/ECX . . . . . 2/imm32 # subtract from ECX # . print-int32(out, len) # . . push args - 51/push-ECX + 50/push-EAX ff 6/subop/push 1/mod/*+disp8 5/rm32/EBP . . . . 8/disp8 . # push *(EBP+8) # . . call e8/call print-int32/disp32 @@ -1022,8 +1028,8 @@ test-emit-string-literal-data: e8/call clear-stream/disp32 # . . discard args 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP - # var slice/ECX = '"abc"' - 68/push _test-slice-abc-end/imm32 + # var slice/ECX = '"abc"/d' + 68/push _test-slice-abc-metadata-end/imm32 68/push _test-slice-abc/imm32 89/copy 3/mod/direct 1/rm32/ECX . . . 4/r32/ESP . . # copy ESP to ECX # emit-string-literal-data(_test-output-stream, slice) @@ -2587,6 +2593,8 @@ Slash: _test-slice-abc: 22/dquote 61/a 62/b 63/c 22/dquote # "abc" _test-slice-abc-end: + 2f/slash 64/d +_test-slice-abc-metadata-end: _test-slice-empty-string-literal: 22/dquote 22/dquote # "" -- cgit 1.4.1-2-gfad0