From 808b21a17c468ffbef8bf0c375b8b0806ac904d7 Mon Sep 17 00:00:00 2001 From: Kartik Agaram Date: Sat, 18 May 2019 15:52:59 -0700 Subject: skip-string: fix a bug in computing in->read I was missing a test to catch this. --- subx/apps/dquotes | Bin 26430 -> 26597 bytes subx/apps/dquotes.subx | 52 +++++++++++++++++++++++++++++++++++++++++++++---- 2 files changed, 48 insertions(+), 4 deletions(-) (limited to 'subx') diff --git a/subx/apps/dquotes b/subx/apps/dquotes index b6bdbef8..14581ef8 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 b032c90d..79002c34 100644 --- a/subx/apps/dquotes.subx +++ b/subx/apps/dquotes.subx @@ -2085,10 +2085,9 @@ skip-string: # line : (address stream) # . discard args 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP - # EAX = new-&line->data[line->read]/EAX - &line->data[line->read]/EDX - 2b/subtract 3/mod/direct 2/rm32/EDX . . . 0/r32/EAX . . # EAX = EAX - EDX - - # line/ECX->read = EDX + # line->read = EAX - line->data + 29/subtract 3/mod/direct 0/rm32/EAX . . . 1/r32/ECX . . # subtract ECX from EAX + 2d/subtract-from-EAX 0xc/imm32 89/copy 1/mod/*+disp8 1/rm32/ECX . . 0/r32/EAX 4/disp8 . # copy EAX to *(ECX+4) $skip-string:end: @@ -2261,6 +2260,51 @@ test-skip-string-ignores-escapes: 5d/pop-to-EBP c3/return +test-skip-string-works-from-mid-stream: + # . prolog + 55/push-EBP + 89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . . # copy ESP to EBP + # setup + # . clear-stream(_test-input-stream) + # . . push args + 68/push _test-input-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 + # . write(_test-input-stream, "0 \"a\\\"b\"/yz") + # . indices: 01 2 34 56 + # . . push args + 68/push "0 \"a\\\"b\"/yz"/imm32 + 68/push _test-input-stream/imm32 + # . . call + e8/call write/disp32 + # . . discard args + 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 8/imm32 # add to ESP + # precondition: line->read == 2 + c7 0/subop/copy 1/mod/*+disp8 0/rm32/EAX . . . . 4/disp8 2/imm32 # copy to *(EAX+4) + # skip-string(_test-input-stream) + # . . push args + 68/push _test-input-stream/imm32 + # . . call + e8/call skip-string/disp32 + # . . discard args + 81 0/subop/add 3/mod/direct 4/rm32/ESP . . . . . 4/imm32 # add to ESP + # check-ints-equal(line->read, 8, msg) + # . . push args + 68/push "F - test-skip-string-works-from-mid-stream"/imm32 + 68/push 8/imm32 + b8/copy-to-EAX _test-input-stream/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 + # . epilog + 89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . . # copy EBP to ESP + 5d/pop-to-EBP + c3/return + skip-string-in-slice: # curr : (address byte), end : (address byte) -> new_curr/EAX # . prolog 55/push-EBP -- cgit 1.4.1-2-gfad0