]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile/internal/syntax: fix source buffer refilling
authorMatthew Dempsky <mdempsky@google.com>
Tue, 19 Sep 2017 21:28:03 +0000 (14:28 -0700)
committerMatthew Dempsky <mdempsky@google.com>
Wed, 20 Sep 2017 17:47:26 +0000 (17:47 +0000)
The previous code seems to have an off-by-1 in it somewhere, the
consequence being that we didn't properly preserve all of the old
buffer contents that we intended to.

After spending a while looking at the existing window-shifting logic,
I wasn't able to understand exactly how it was supposed to work or
where the issue was, so I rewrote it to be (at least IMO) more
obviously correct.

Fixes #21938.

Change-Id: I1ed7bbc1e1751a52ab5f7cf0411ae289586dc345
Reviewed-on: https://go-review.googlesource.com/64830
Run-TryBot: Matthew Dempsky <mdempsky@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Robert Griesemer <gri@golang.org>
src/cmd/compile/internal/syntax/scanner_test.go
src/cmd/compile/internal/syntax/source.go

index e434db9a91da8e215840fcfca69aa06a190df335..53995e0c79992b57c186d6e513b56adc279540a5 100644 (file)
@@ -7,6 +7,7 @@ package syntax
 import (
        "fmt"
        "os"
+       "strings"
        "testing"
 )
 
@@ -367,3 +368,15 @@ func TestScanErrors(t *testing.T) {
                }
        }
 }
+
+func TestIssue21938(t *testing.T) {
+       s := "/*" + strings.Repeat(" ", 4089) + "*/ .5"
+
+       var got scanner
+       got.init(strings.NewReader(s), nil, nil)
+       got.next()
+
+       if got.tok != _Literal || got.lit != ".5" {
+               t.Errorf("got %s %q; want %s %q", got.tok, got.lit, _Literal, ".5")
+       }
+}
index 93547213c06f7fa9bf008f30fd0b6507947e100f..4e3551225aad7f53d50979044e4b25a939be3ef5 100644 (file)
@@ -164,11 +164,12 @@ func (s *source) fill() {
                        s.lit = append(s.lit, s.buf[s.suf:s.r0]...)
                        s.suf = 1 // == s.r0 after slide below
                }
-               s.offs += s.r0 - 1
-               r := s.r - s.r0 + 1 // last read char plus one byte
-               s.w = r + copy(s.buf[r:], s.buf[s.r:s.w])
-               s.r = r
-               s.r0 = 1
+               n := s.r0 - 1
+               copy(s.buf[:], s.buf[n:s.w])
+               s.offs += n
+               s.r0 = 1 // eqv: s.r0 -= n
+               s.r -= n
+               s.w -= n
        }
 
        // read more data: try a limited number of times