Commit 35ba05ee authored by Robert Griesemer's avatar Robert Griesemer

bytes: simplified logic

Also: Avoid potential crash due to reslicing of nil buffer.

R=r
CC=golang-dev
https://golang.org/cl/5556075
parent 531ded92
...@@ -139,21 +139,19 @@ func (b *Buffer) ReadFrom(r io.Reader) (n int64, err error) { ...@@ -139,21 +139,19 @@ func (b *Buffer) ReadFrom(r io.Reader) (n int64, err error) {
b.Truncate(0) b.Truncate(0)
} }
for { for {
if cap(b.buf)-len(b.buf) < MinRead { if free := cap(b.buf) - len(b.buf); free < MinRead {
var newBuf []byte // not enough space at end
// can we get space without allocation? newBuf := b.buf
if b.off+cap(b.buf)-len(b.buf) >= MinRead { if b.off+free < MinRead {
// reuse beginning of buffer // not enough space using beginning of buffer;
newBuf = b.buf[0 : len(b.buf)-b.off] // double buffer capacity
} else { newBuf = makeSlice(2*cap(b.buf) + MinRead)
// not enough space at end; put space on end
newBuf = makeSlice(2*(cap(b.buf)-b.off) + MinRead)[:len(b.buf)-b.off]
if newBuf == nil { if newBuf == nil {
return n, ErrTooLarge return n, ErrTooLarge
} }
} }
copy(newBuf, b.buf[b.off:]) copy(newBuf, b.buf[b.off:])
b.buf = newBuf b.buf = newBuf[:len(b.buf)-b.off]
b.off = 0 b.off = 0
} }
m, e := r.Read(b.buf[len(b.buf):cap(b.buf)]) m, e := r.Read(b.buf[len(b.buf):cap(b.buf)])
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment