diff --git a/src/libstd/io/buffered.rs b/src/libstd/io/buffered.rs index 8ab0d3a550401..95c44e6a3fc89 100644 --- a/src/libstd/io/buffered.rs +++ b/src/libstd/io/buffered.rs @@ -104,6 +104,9 @@ impl Buffer for BufferedReader { impl Reader for BufferedReader { fn read(&mut self, buf: &mut [u8]) -> IoResult { + if self.pos == self.cap && buf.len() >= self.buf.capacity() { + return self.inner.read(buf); + } let nread = { let available = try!(self.fill_buf()); let nread = cmp::min(available.len(), buf.len()); @@ -409,13 +412,19 @@ mod test { #[test] fn test_buffered_reader() { - let inner = MemReader::new(vec!(0, 1, 2, 3, 4)); + let inner = MemReader::new(vec!(5, 6, 7, 0, 1, 2, 3, 4)); let mut reader = BufferedReader::with_capacity(2, inner); let mut buf = [0, 0, 0]; let nread = reader.read(buf); + assert_eq!(Ok(3), nread); + let b: &[_] = &[5, 6, 7]; + assert_eq!(buf.as_slice(), b); + + let mut buf = [0, 0]; + let nread = reader.read(buf); assert_eq!(Ok(2), nread); - let b: &[_] = &[0, 1, 0]; + let b: &[_] = &[0, 1]; assert_eq!(buf.as_slice(), b); let mut buf = [0];