diff options
| author | Damien Neil <dneil@google.com> | 2021-08-06 13:23:13 -0700 |
|---|---|---|
| committer | Damien Neil <dneil@google.com> | 2021-10-18 21:52:05 +0000 |
| commit | 425db64811285fd0b35ed12eaed7568ec547da78 (patch) | |
| tree | fd1bdfd71f51b8963c4f6ccadbafa01d08c15bdd /src/bufio/bufio.go | |
| parent | 33b3260c1e765ef66500ce155c6d5a526d8852e9 (diff) | |
| download | go-425db64811285fd0b35ed12eaed7568ec547da78.tar.xz | |
bufio: use underlying ReadFrom even when data is buffered
When (*bufio.Writer).ReadFrom is called with a partially filled buffer,
fill out and flush the buffer and then call the underlying writer's
ReadFrom method if present.
Fixes #44815.
Change-Id: I15b3ef0746d0d60fd62041189a9b9df11254dd29
Reviewed-on: https://go-review.googlesource.com/c/go/+/340530
Trust: Damien Neil <dneil@google.com>
Run-TryBot: Damien Neil <dneil@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
Diffstat (limited to 'src/bufio/bufio.go')
| -rw-r--r-- | src/bufio/bufio.go | 19 |
1 files changed, 10 insertions, 9 deletions
diff --git a/src/bufio/bufio.go b/src/bufio/bufio.go index a58df25494..063a7785f3 100644 --- a/src/bufio/bufio.go +++ b/src/bufio/bufio.go @@ -745,19 +745,14 @@ func (b *Writer) WriteString(s string) (int, error) { } // ReadFrom implements io.ReaderFrom. If the underlying writer -// supports the ReadFrom method, and b has no buffered data yet, -// this calls the underlying ReadFrom without buffering. +// supports the ReadFrom method, this calls the underlying ReadFrom. +// If there is buffered data and an underlying ReadFrom, this fills +// the buffer and writes it before calling ReadFrom. func (b *Writer) ReadFrom(r io.Reader) (n int64, err error) { if b.err != nil { return 0, b.err } - if b.Buffered() == 0 { - if w, ok := b.wr.(io.ReaderFrom); ok { - n, err = w.ReadFrom(r) - b.err = err - return n, err - } - } + readerFrom, readerFromOK := b.wr.(io.ReaderFrom) var m int for { if b.Available() == 0 { @@ -765,6 +760,12 @@ func (b *Writer) ReadFrom(r io.Reader) (n int64, err error) { return n, err1 } } + if readerFromOK && b.Buffered() == 0 { + nn, err := readerFrom.ReadFrom(r) + b.err = err + n += nn + return n, err + } nr := 0 for nr < maxConsecutiveEmptyReads { m, err = r.Read(b.buf[b.n:]) |
