From c2047754c300b68c05d65faa8dc2925fe67b71b4 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Sat, 14 Jan 2017 00:05:42 +0000 Subject: libgo: update to Go 1.8 release candidate 1 Compiler changes: * Change map assignment to use mapassign and assign value directly. * Change string iteration to use decoderune, faster for ASCII strings. * Change makeslice to take int, and use makeslice64 for larger values. * Add new noverflow field to hmap struct used for maps. Unresolved problems, to be fixed later: * Commented out test in go/types/sizes_test.go that doesn't compile. * Commented out reflect.TestStructOf test for padding after zero-sized field. Reviewed-on: https://go-review.googlesource.com/35231 gotools/: Updates for Go 1.8rc1. * Makefile.am (go_cmd_go_files): Add bug.go. (s-zdefaultcc): Write defaultPkgConfig. * Makefile.in: Rebuild. From-SVN: r244456 --- libgo/go/bufio/bufio.go | 29 ++++++++++++++++------------- libgo/go/bufio/bufio_test.go | 21 +++++++++++++++++++++ libgo/go/bufio/scan.go | 1 - 3 files changed, 37 insertions(+), 14 deletions(-) (limited to 'libgo/go/bufio') diff --git a/libgo/go/bufio/bufio.go b/libgo/go/bufio/bufio.go index 3b30b8b80cd..e1e8fb22720 100644 --- a/libgo/go/bufio/bufio.go +++ b/libgo/go/bufio/bufio.go @@ -206,10 +206,18 @@ func (b *Reader) Read(p []byte) (n int, err error) { } return n, b.readErr() } - b.fill() // buffer is empty - if b.r == b.w { + // One read. + // Do not use b.fill, which will loop. + b.r = 0 + b.w = 0 + n, b.err = b.rd.Read(b.buf) + if n < 0 { + panic(errNegativeRead) + } + if n == 0 { return 0, b.readErr() } + b.w += n } // copy as much as we can @@ -549,11 +557,6 @@ func (b *Writer) Reset(w io.Writer) { // Flush writes any buffered data to the underlying io.Writer. func (b *Writer) Flush() error { - err := b.flush() - return err -} - -func (b *Writer) flush() error { if b.err != nil { return b.err } @@ -596,7 +599,7 @@ func (b *Writer) Write(p []byte) (nn int, err error) { } else { n = copy(b.buf[b.n:], p) b.n += n - b.flush() + b.Flush() } nn += n p = p[n:] @@ -615,7 +618,7 @@ func (b *Writer) WriteByte(c byte) error { if b.err != nil { return b.err } - if b.Available() <= 0 && b.flush() != nil { + if b.Available() <= 0 && b.Flush() != nil { return b.err } b.buf[b.n] = c @@ -638,7 +641,7 @@ func (b *Writer) WriteRune(r rune) (size int, err error) { } n := b.Available() if n < utf8.UTFMax { - if b.flush(); b.err != nil { + if b.Flush(); b.err != nil { return 0, b.err } n = b.Available() @@ -663,7 +666,7 @@ func (b *Writer) WriteString(s string) (int, error) { b.n += n nn += n s = s[n:] - b.flush() + b.Flush() } if b.err != nil { return nn, b.err @@ -684,7 +687,7 @@ func (b *Writer) ReadFrom(r io.Reader) (n int64, err error) { var m int for { if b.Available() == 0 { - if err1 := b.flush(); err1 != nil { + if err1 := b.Flush(); err1 != nil { return n, err1 } } @@ -708,7 +711,7 @@ func (b *Writer) ReadFrom(r io.Reader) (n int64, err error) { if err == io.EOF { // If we filled the buffer exactly, flush preemptively. if b.Available() == 0 { - err = b.flush() + err = b.Flush() } else { err = nil } diff --git a/libgo/go/bufio/bufio_test.go b/libgo/go/bufio/bufio_test.go index 858048696e4..ef0f6c834e8 100644 --- a/libgo/go/bufio/bufio_test.go +++ b/libgo/go/bufio/bufio_test.go @@ -1236,6 +1236,27 @@ func TestWriterReadFromErrNoProgress(t *testing.T) { } } +func TestReadZero(t *testing.T) { + for _, size := range []int{100, 2} { + t.Run(fmt.Sprintf("bufsize=%d", size), func(t *testing.T) { + r := io.MultiReader(strings.NewReader("abc"), &emptyThenNonEmptyReader{r: strings.NewReader("def"), n: 1}) + br := NewReaderSize(r, size) + want := func(s string, wantErr error) { + p := make([]byte, 50) + n, err := br.Read(p) + if err != wantErr || n != len(s) || string(p[:n]) != s { + t.Fatalf("read(%d) = %q, %v, want %q, %v", len(p), string(p[:n]), err, s, wantErr) + } + t.Logf("read(%d) = %q, %v", len(p), string(p[:n]), err) + } + want("abc", nil) + want("", nil) + want("def", nil) + want("", io.EOF) + }) + } +} + func TestReaderReset(t *testing.T) { r := NewReader(strings.NewReader("foo foo")) buf := make([]byte, 3) diff --git a/libgo/go/bufio/scan.go b/libgo/go/bufio/scan.go index 27a0f004595..9f741c98307 100644 --- a/libgo/go/bufio/scan.go +++ b/libgo/go/bufio/scan.go @@ -199,7 +199,6 @@ func (s *Scanner) Scan() bool { s.buf = newBuf s.end -= s.start s.start = 0 - continue } // Finally we can read some input. Make sure we don't get stuck with // a misbehaving Reader. Officially we don't need to do this, but let's -- cgit v1.2.1