diff options
| author | Steven Fackler <sfackler@gmail.com> | 2019-02-11 19:31:37 -0800 |
|---|---|---|
| committer | Steven Fackler <sfackler@gmail.com> | 2019-02-13 19:40:17 -0800 |
| commit | 596f18201c7863d8b02fe6fa1872cf3ba2b6b381 (patch) | |
| tree | 1b152d89591c590eb92bf1b18591836e88ccf347 | |
| parent | 31bcec648aa57391115f877a2ca022d7ff6415aa (diff) | |
| download | rust-596f18201c7863d8b02fe6fa1872cf3ba2b6b381.tar.gz rust-596f18201c7863d8b02fe6fa1872cf3ba2b6b381.zip | |
impl Deref/DerefMut for IoVec types
Returning &'a mut [u8] was unsound, and we may as well just have them directly deref to their slices to make it easier to work with them.
| -rw-r--r-- | src/libstd/io/buffered.rs | 4 | ||||
| -rw-r--r-- | src/libstd/io/cursor.rs | 4 | ||||
| -rw-r--r-- | src/libstd/io/impls.rs | 8 | ||||
| -rw-r--r-- | src/libstd/io/mod.rs | 36 | ||||
| -rw-r--r-- | src/libstd/io/util.rs | 4 | ||||
| -rw-r--r-- | src/libstd/sys/cloudabi/io.rs | 6 | ||||
| -rw-r--r-- | src/libstd/sys/redox/io.rs | 6 | ||||
| -rw-r--r-- | src/libstd/sys/redox/net/tcp.rs | 4 | ||||
| -rw-r--r-- | src/libstd/sys/sgx/io.rs | 6 | ||||
| -rw-r--r-- | src/libstd/sys/sgx/net.rs | 4 | ||||
| -rw-r--r-- | src/libstd/sys/unix/io.rs | 6 | ||||
| -rw-r--r-- | src/libstd/sys/wasm/io.rs | 6 | ||||
| -rw-r--r-- | src/libstd/sys/windows/io.rs | 6 |
13 files changed, 53 insertions, 47 deletions
diff --git a/src/libstd/io/buffered.rs b/src/libstd/io/buffered.rs index a5edc4360ca..d8a5f5a4d8c 100644 --- a/src/libstd/io/buffered.rs +++ b/src/libstd/io/buffered.rs @@ -236,7 +236,7 @@ impl<R: Read> Read for BufReader<R> { } fn read_vectored(&mut self, bufs: &mut [IoVecMut<'_>]) -> io::Result<usize> { - let total_len = bufs.iter().map(|b| b.as_slice().len()).sum::<usize>(); + let total_len = bufs.iter().map(|b| b.len()).sum::<usize>(); if self.pos == self.cap && total_len >= self.buf.len() { return self.inner.read_vectored(bufs); } @@ -595,7 +595,7 @@ impl<W: Write> Write for BufWriter<W> { } fn write_vectored(&mut self, bufs: &[IoVec<'_>]) -> io::Result<usize> { - let total_len = bufs.iter().map(|b| b.as_slice().len()).sum::<usize>(); + let total_len = bufs.iter().map(|b| b.len()).sum::<usize>(); if self.buf.len() + total_len > self.buf.capacity() { self.flush_buf()?; } diff --git a/src/libstd/io/cursor.rs b/src/libstd/io/cursor.rs index ef636cc6f8c..d1739894a27 100644 --- a/src/libstd/io/cursor.rs +++ b/src/libstd/io/cursor.rs @@ -224,7 +224,6 @@ impl<T> Read for Cursor<T> where T: AsRef<[u8]> { fn read_vectored(&mut self, bufs: &mut [IoVecMut<'_>]) -> io::Result<usize> { let mut nread = 0; for buf in bufs { - let buf = buf.as_mut_slice(); let n = self.read(buf)?; nread += n; if n < buf.len() { @@ -272,7 +271,6 @@ fn slice_write_vectored( { let mut nwritten = 0; for buf in bufs { - let buf = buf.as_slice(); let n = slice_write(pos_mut, slice, buf)?; nwritten += n; if n < buf.len() { @@ -317,7 +315,7 @@ fn vec_write_vectored( { let mut nwritten = 0; for buf in bufs { - nwritten += vec_write(pos_mut, vec, buf.as_slice())?; + nwritten += vec_write(pos_mut, vec, buf)?; } Ok(nwritten) } diff --git a/src/libstd/io/impls.rs b/src/libstd/io/impls.rs index 4bba4af77c4..57d8cf40a79 100644 --- a/src/libstd/io/impls.rs +++ b/src/libstd/io/impls.rs @@ -196,7 +196,7 @@ impl<'a> Read for &'a [u8] { fn read_vectored(&mut self, bufs: &mut [IoVecMut<'_>]) -> io::Result<usize> { let mut nread = 0; for buf in bufs { - nread += self.read(buf.as_mut_slice())?; + nread += self.read(buf)?; if self.is_empty() { break; } @@ -269,7 +269,7 @@ impl<'a> Write for &'a mut [u8] { fn write_vectored(&mut self, bufs: &[IoVec<'_>]) -> io::Result<usize> { let mut nwritten = 0; for buf in bufs { - nwritten += self.write(buf.as_slice())?; + nwritten += self.write(buf)?; if self.is_empty() { break; } @@ -303,10 +303,10 @@ impl Write for Vec<u8> { #[inline] fn write_vectored(&mut self, bufs: &[IoVec<'_>]) -> io::Result<usize> { - let len = bufs.iter().map(|b| b.as_slice().len()).sum(); + let len = bufs.iter().map(|b| b.len()).sum(); self.reserve(len); for buf in bufs { - self.extend_from_slice(buf.as_slice()); + self.extend_from_slice(buf); } Ok(len) } diff --git a/src/libstd/io/mod.rs b/src/libstd/io/mod.rs index b9765605f8e..7f9c5a0316c 100644 --- a/src/libstd/io/mod.rs +++ b/src/libstd/io/mod.rs @@ -264,6 +264,7 @@ use fmt; use slice; use str; use memchr; +use ops::{Deref, DerefMut}; use ptr; use sys; @@ -531,7 +532,7 @@ pub trait Read { /// `read`. #[unstable(feature = "iovec", issue = "0")] fn read_vectored(&mut self, bufs: &mut [IoVecMut<'_>]) -> Result<usize> { - match bufs.iter_mut().map(|b| b.as_mut_slice()).find(|b| !b.is_empty()) { + match bufs.iter_mut().find(|b| !b.is_empty()) { Some(buf) => self.read(buf), None => Ok(0), } @@ -896,7 +897,7 @@ pub struct IoVecMut<'a>(sys::io::IoVecMut<'a>); #[unstable(feature = "iovec", issue = "0")] impl<'a> fmt::Debug for IoVecMut<'a> { fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result { - fmt::Debug::fmt(self.as_slice(), fmt) + fmt::Debug::fmt(self.0.as_slice(), fmt) } } @@ -911,18 +912,22 @@ impl<'a> IoVecMut<'a> { pub fn new(buf: &'a mut [u8]) -> IoVecMut<'a> { IoVecMut(sys::io::IoVecMut::new(buf)) } +} + +#[unstable(feature = "iovec", issue = "0")] +impl<'a> Deref for IoVecMut<'a> { + type Target = [u8]; - /// Returns a shared reference to the inner slice. - #[unstable(feature = "iovec", issue = "0")] #[inline] - pub fn as_slice(&self) -> &'a [u8] { + fn deref(&self) -> &[u8] { self.0.as_slice() } +} - /// Returns a mutable reference to the inner slice. - #[unstable(feature = "iovec", issue = "0")] +#[unstable(feature = "iovec", issue = "0")] +impl<'a> DerefMut for IoVecMut<'a> { #[inline] - pub fn as_mut_slice(&mut self) -> &'a mut [u8] { + fn deref_mut(&mut self) -> &mut [u8] { self.0.as_mut_slice() } } @@ -939,7 +944,7 @@ pub struct IoVec<'a>(sys::io::IoVec<'a>); #[unstable(feature = "iovec", issue = "0")] impl<'a> fmt::Debug for IoVec<'a> { fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result { - fmt::Debug::fmt(self.as_slice(), fmt) + fmt::Debug::fmt(self.0.as_slice(), fmt) } } @@ -954,11 +959,14 @@ impl<'a> IoVec<'a> { pub fn new(buf: &'a [u8]) -> IoVec<'a> { IoVec(sys::io::IoVec::new(buf)) } +} + +#[unstable(feature = "iovec", issue = "0")] +impl<'a> Deref for IoVec<'a> { + type Target = [u8]; - /// Returns a shared reference to the inner slice. - #[unstable(feature = "iovec", issue = "0")] #[inline] - pub fn as_slice(&self) -> &'a [u8] { + fn deref(&self) -> &[u8] { self.0.as_slice() } } @@ -1103,7 +1111,7 @@ pub trait Write { /// `write`. #[unstable(feature = "iovec", issue = "0")] fn write_vectored(&mut self, bufs: &[IoVec<'_>]) -> Result<usize> { - match bufs.iter().map(|b| b.as_slice()).find(|b| !b.is_empty()) { + match bufs.iter().find(|b| !b.is_empty()) { Some(buf) => self.write(buf), None => Ok(0), } @@ -1813,7 +1821,7 @@ impl<T: Read, U: Read> Read for Chain<T, U> { fn read_vectored(&mut self, bufs: &mut [IoVecMut<'_>]) -> Result<usize> { if !self.done_first { match self.first.read_vectored(bufs)? { - 0 if bufs.iter().any(|b| !b.as_slice().is_empty()) => self.done_first = true, + 0 if bufs.iter().any(|b| !b.is_empty()) => self.done_first = true, n => return Ok(n), } } diff --git a/src/libstd/io/util.rs b/src/libstd/io/util.rs index 6743018793f..5ce955eb1e4 100644 --- a/src/libstd/io/util.rs +++ b/src/libstd/io/util.rs @@ -156,7 +156,7 @@ impl Read for Repeat { fn read_vectored(&mut self, bufs: &mut [IoVecMut<'_>]) -> io::Result<usize> { let mut nwritten = 0; for buf in bufs { - nwritten += self.read(buf.as_mut_slice())?; + nwritten += self.read(buf)?; } Ok(nwritten) } @@ -207,7 +207,7 @@ impl Write for Sink { #[inline] fn write_vectored(&mut self, bufs: &[IoVec<'_>]) -> io::Result<usize> { - let total_len = bufs.iter().map(|b| b.as_slice().len()).sum(); + let total_len = bufs.iter().map(|b| b.len()).sum(); Ok(total_len) } diff --git a/src/libstd/sys/cloudabi/io.rs b/src/libstd/sys/cloudabi/io.rs index 9ee5788c580..8b02d3fd19d 100644 --- a/src/libstd/sys/cloudabi/io.rs +++ b/src/libstd/sys/cloudabi/io.rs @@ -7,7 +7,7 @@ impl<'a> IoVec<'a> { } #[inline] - pub fn as_slice(&self) -> &'a [u8] { + pub fn as_slice(&self) -> &[u8] { self.0 } } @@ -21,12 +21,12 @@ impl<'a> IoVecMut<'a> { } #[inline] - pub fn as_slice(&self) -> &'a [u8] { + pub fn as_slice(&self) -> &[u8] { self.0 } #[inline] - pub fn as_mut_slice(&mut self) -> &'a mut [u8] { + pub fn as_mut_slice(&mut self) -> &mut [u8] { self.0 } } diff --git a/src/libstd/sys/redox/io.rs b/src/libstd/sys/redox/io.rs index 9ee5788c580..8b02d3fd19d 100644 --- a/src/libstd/sys/redox/io.rs +++ b/src/libstd/sys/redox/io.rs @@ -7,7 +7,7 @@ impl<'a> IoVec<'a> { } #[inline] - pub fn as_slice(&self) -> &'a [u8] { + pub fn as_slice(&self) -> &[u8] { self.0 } } @@ -21,12 +21,12 @@ impl<'a> IoVecMut<'a> { } #[inline] - pub fn as_slice(&self) -> &'a [u8] { + pub fn as_slice(&self) -> &[u8] { self.0 } #[inline] - pub fn as_mut_slice(&mut self) -> &'a mut [u8] { + pub fn as_mut_slice(&mut self) -> &mut [u8] { self.0 } } diff --git a/src/libstd/sys/redox/net/tcp.rs b/src/libstd/sys/redox/net/tcp.rs index 08e12dc1ab1..4396a6f963c 100644 --- a/src/libstd/sys/redox/net/tcp.rs +++ b/src/libstd/sys/redox/net/tcp.rs @@ -35,7 +35,7 @@ impl TcpStream { } pub fn read_vectored(&self, buf: &mut [IoVecMut<'_>]) -> io::Result<usize> { - match buf.iter_mut().map(|b| b.as_mut_slice()).find(|b| !b.is_empty()) { + match buf.iter_mut().find(|b| !b.is_empty()) { Some(buf) => self.read(buf), None => Ok(0), } @@ -46,7 +46,7 @@ impl TcpStream { } pub fn write_vectored(&self, bufs: &[IoVec<'_>]) -> io::Result<usize> { - match buf.iter().map(|b| b.as_slice()).find(|b| !b.is_empty()) { + match buf.iter().find(|b| !b.is_empty()) { Some(buf) => self.write(buf), None => Ok(0), } diff --git a/src/libstd/sys/sgx/io.rs b/src/libstd/sys/sgx/io.rs index 9ee5788c580..8b02d3fd19d 100644 --- a/src/libstd/sys/sgx/io.rs +++ b/src/libstd/sys/sgx/io.rs @@ -7,7 +7,7 @@ impl<'a> IoVec<'a> { } #[inline] - pub fn as_slice(&self) -> &'a [u8] { + pub fn as_slice(&self) -> &[u8] { self.0 } } @@ -21,12 +21,12 @@ impl<'a> IoVecMut<'a> { } #[inline] - pub fn as_slice(&self) -> &'a [u8] { + pub fn as_slice(&self) -> &[u8] { self.0 } #[inline] - pub fn as_mut_slice(&mut self) -> &'a mut [u8] { + pub fn as_mut_slice(&mut self) -> &mut [u8] { self.0 } } diff --git a/src/libstd/sys/sgx/net.rs b/src/libstd/sys/sgx/net.rs index 2ecae1d746f..f46ed022b21 100644 --- a/src/libstd/sys/sgx/net.rs +++ b/src/libstd/sys/sgx/net.rs @@ -105,7 +105,7 @@ impl TcpStream { pub fn read_vectored(&self, buf: &mut [IoVecMut<'_>]) -> io::Result<usize> { let buf = match buf.get(0) { - Some(buf) => buf.as_mut_slice(), + Some(buf) => buf, None => return Ok(0), }; self.read(buf) @@ -117,7 +117,7 @@ impl TcpStream { pub fn write_vectored(&self, buf: &[IoVec<'_>]) -> io::Result<usize> { let buf = match buf.get(0) { - Some(buf) => buf.as_slice(), + Some(buf) => buf, None => return Ok(0), }; self.read(buf) diff --git a/src/libstd/sys/unix/io.rs b/src/libstd/sys/unix/io.rs index 69b2db82ea3..65e4c6e0577 100644 --- a/src/libstd/sys/unix/io.rs +++ b/src/libstd/sys/unix/io.rs @@ -21,7 +21,7 @@ impl<'a> IoVec<'a> { } #[inline] - pub fn as_slice(&self) -> &'a [u8] { + pub fn as_slice(&self) -> &[u8] { unsafe { slice::from_raw_parts(self.vec.iov_base as *mut u8, self.vec.iov_len) } @@ -46,14 +46,14 @@ impl<'a> IoVecMut<'a> { } #[inline] - pub fn as_slice(&self) -> &'a [u8] { + pub fn as_slice(&self) -> &[u8] { unsafe { slice::from_raw_parts(self.vec.iov_base as *mut u8, self.vec.iov_len) } } #[inline] - pub fn as_mut_slice(&mut self) -> &'a mut [u8] { + pub fn as_mut_slice(&mut self) -> &mut [u8] { unsafe { slice::from_raw_parts_mut(self.vec.iov_base as *mut u8, self.vec.iov_len) } diff --git a/src/libstd/sys/wasm/io.rs b/src/libstd/sys/wasm/io.rs index 9ee5788c580..8b02d3fd19d 100644 --- a/src/libstd/sys/wasm/io.rs +++ b/src/libstd/sys/wasm/io.rs @@ -7,7 +7,7 @@ impl<'a> IoVec<'a> { } #[inline] - pub fn as_slice(&self) -> &'a [u8] { + pub fn as_slice(&self) -> &[u8] { self.0 } } @@ -21,12 +21,12 @@ impl<'a> IoVecMut<'a> { } #[inline] - pub fn as_slice(&self) -> &'a [u8] { + pub fn as_slice(&self) -> &[u8] { self.0 } #[inline] - pub fn as_mut_slice(&mut self) -> &'a mut [u8] { + pub fn as_mut_slice(&mut self) -> &mut [u8] { self.0 } } diff --git a/src/libstd/sys/windows/io.rs b/src/libstd/sys/windows/io.rs index a14bfea9a21..662e3047923 100644 --- a/src/libstd/sys/windows/io.rs +++ b/src/libstd/sys/windows/io.rs @@ -22,7 +22,7 @@ impl<'a> IoVec<'a> { } #[inline] - pub fn as_slice(&self) -> &'a [u8] { + pub fn as_slice(&self) -> &[u8] { unsafe { slice::from_raw_parts(self.vec.buf as *mut u8, self.vec.len as usize) } @@ -48,14 +48,14 @@ impl<'a> IoVecMut<'a> { } #[inline] - pub fn as_slice(&self) -> &'a [u8] { + pub fn as_slice(&self) -> &[u8] { unsafe { slice::from_raw_parts(self.vec.buf as *mut u8, self.vec.len as usize) } } #[inline] - pub fn as_mut_slice(&mut self) -> &'a mut [u8] { + pub fn as_mut_slice(&mut self) -> &mut [u8] { unsafe { slice::from_raw_parts_mut(self.vec.buf as *mut u8, self.vec.len as usize) } |
