mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
[release-branch.go1.9] cmd/compile/internal/syntax: fix source buffer refilling
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> Reviewed-on: https://go-review.googlesource.com/70977 Run-TryBot: Russ Cox <rsc@golang.org> Reviewed-by: Matthew Dempsky <mdempsky@google.com>
This commit is contained in:
parent
ff8289f879
commit
1ded8334f7
2 changed files with 19 additions and 5 deletions
|
|
@ -7,6 +7,7 @@ package syntax
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
|
"strings"
|
||||||
"testing"
|
"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")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -164,11 +164,12 @@ func (s *source) fill() {
|
||||||
s.lit = append(s.lit, s.buf[s.suf:s.r0]...)
|
s.lit = append(s.lit, s.buf[s.suf:s.r0]...)
|
||||||
s.suf = 1 // == s.r0 after slide below
|
s.suf = 1 // == s.r0 after slide below
|
||||||
}
|
}
|
||||||
s.offs += s.r0 - 1
|
n := s.r0 - 1
|
||||||
r := s.r - s.r0 + 1 // last read char plus one byte
|
copy(s.buf[:], s.buf[n:s.w])
|
||||||
s.w = r + copy(s.buf[r:], s.buf[s.r:s.w])
|
s.offs += n
|
||||||
s.r = r
|
s.r0 = 1 // eqv: s.r0 -= n
|
||||||
s.r0 = 1
|
s.r -= n
|
||||||
|
s.w -= n
|
||||||
}
|
}
|
||||||
|
|
||||||
// read more data: try a limited number of times
|
// read more data: try a limited number of times
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue