about summary refs log tree commit diff
diff options
context:
space:
mode:
authorSteven Fackler <sfackler@gmail.com>2019-02-11 19:31:37 -0800
committerSteven Fackler <sfackler@gmail.com>2019-02-13 19:40:17 -0800
commit596f18201c7863d8b02fe6fa1872cf3ba2b6b381 (patch)
tree1b152d89591c590eb92bf1b18591836e88ccf347
parent31bcec648aa57391115f877a2ca022d7ff6415aa (diff)
downloadrust-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.rs4
-rw-r--r--src/libstd/io/cursor.rs4
-rw-r--r--src/libstd/io/impls.rs8
-rw-r--r--src/libstd/io/mod.rs36
-rw-r--r--src/libstd/io/util.rs4
-rw-r--r--src/libstd/sys/cloudabi/io.rs6
-rw-r--r--src/libstd/sys/redox/io.rs6
-rw-r--r--src/libstd/sys/redox/net/tcp.rs4
-rw-r--r--src/libstd/sys/sgx/io.rs6
-rw-r--r--src/libstd/sys/sgx/net.rs4
-rw-r--r--src/libstd/sys/unix/io.rs6
-rw-r--r--src/libstd/sys/wasm/io.rs6
-rw-r--r--src/libstd/sys/windows/io.rs6
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)
         }