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.
This commit is contained in:
Steven Fackler
2019-02-11 19:31:37 -08:00
parent 31bcec648a
commit 596f18201c
13 changed files with 53 additions and 47 deletions

View File

@@ -236,7 +236,7 @@ impl<R: Read> Read for BufReader<R> {
} }
fn read_vectored(&mut self, bufs: &mut [IoVecMut<'_>]) -> io::Result<usize> { 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() { if self.pos == self.cap && total_len >= self.buf.len() {
return self.inner.read_vectored(bufs); 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> { 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() { if self.buf.len() + total_len > self.buf.capacity() {
self.flush_buf()?; self.flush_buf()?;
} }

View File

@@ -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> { fn read_vectored(&mut self, bufs: &mut [IoVecMut<'_>]) -> io::Result<usize> {
let mut nread = 0; let mut nread = 0;
for buf in bufs { for buf in bufs {
let buf = buf.as_mut_slice();
let n = self.read(buf)?; let n = self.read(buf)?;
nread += n; nread += n;
if n < buf.len() { if n < buf.len() {
@@ -272,7 +271,6 @@ fn slice_write_vectored(
{ {
let mut nwritten = 0; let mut nwritten = 0;
for buf in bufs { for buf in bufs {
let buf = buf.as_slice();
let n = slice_write(pos_mut, slice, buf)?; let n = slice_write(pos_mut, slice, buf)?;
nwritten += n; nwritten += n;
if n < buf.len() { if n < buf.len() {
@@ -317,7 +315,7 @@ fn vec_write_vectored(
{ {
let mut nwritten = 0; let mut nwritten = 0;
for buf in bufs { for buf in bufs {
nwritten += vec_write(pos_mut, vec, buf.as_slice())?; nwritten += vec_write(pos_mut, vec, buf)?;
} }
Ok(nwritten) Ok(nwritten)
} }

View File

@@ -196,7 +196,7 @@ impl<'a> Read for &'a [u8] {
fn read_vectored(&mut self, bufs: &mut [IoVecMut<'_>]) -> io::Result<usize> { fn read_vectored(&mut self, bufs: &mut [IoVecMut<'_>]) -> io::Result<usize> {
let mut nread = 0; let mut nread = 0;
for buf in bufs { for buf in bufs {
nread += self.read(buf.as_mut_slice())?; nread += self.read(buf)?;
if self.is_empty() { if self.is_empty() {
break; break;
} }
@@ -269,7 +269,7 @@ impl<'a> Write for &'a mut [u8] {
fn write_vectored(&mut self, bufs: &[IoVec<'_>]) -> io::Result<usize> { fn write_vectored(&mut self, bufs: &[IoVec<'_>]) -> io::Result<usize> {
let mut nwritten = 0; let mut nwritten = 0;
for buf in bufs { for buf in bufs {
nwritten += self.write(buf.as_slice())?; nwritten += self.write(buf)?;
if self.is_empty() { if self.is_empty() {
break; break;
} }
@@ -303,10 +303,10 @@ impl Write for Vec<u8> {
#[inline] #[inline]
fn write_vectored(&mut self, bufs: &[IoVec<'_>]) -> io::Result<usize> { 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); self.reserve(len);
for buf in bufs { for buf in bufs {
self.extend_from_slice(buf.as_slice()); self.extend_from_slice(buf);
} }
Ok(len) Ok(len)
} }

View File

@@ -264,6 +264,7 @@ use fmt;
use slice; use slice;
use str; use str;
use memchr; use memchr;
use ops::{Deref, DerefMut};
use ptr; use ptr;
use sys; use sys;
@@ -531,7 +532,7 @@ pub trait Read {
/// `read`. /// `read`.
#[unstable(feature = "iovec", issue = "0")] #[unstable(feature = "iovec", issue = "0")]
fn read_vectored(&mut self, bufs: &mut [IoVecMut<'_>]) -> Result<usize> { 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), Some(buf) => self.read(buf),
None => Ok(0), None => Ok(0),
} }
@@ -896,7 +897,7 @@ pub struct IoVecMut<'a>(sys::io::IoVecMut<'a>);
#[unstable(feature = "iovec", issue = "0")] #[unstable(feature = "iovec", issue = "0")]
impl<'a> fmt::Debug for IoVecMut<'a> { impl<'a> fmt::Debug for IoVecMut<'a> {
fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result { 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> { pub fn new(buf: &'a mut [u8]) -> IoVecMut<'a> {
IoVecMut(sys::io::IoVecMut::new(buf)) 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] #[inline]
pub fn as_slice(&self) -> &'a [u8] { fn deref(&self) -> &[u8] {
self.0.as_slice() 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] #[inline]
pub fn as_mut_slice(&mut self) -> &'a mut [u8] { fn deref_mut(&mut self) -> &mut [u8] {
self.0.as_mut_slice() self.0.as_mut_slice()
} }
} }
@@ -939,7 +944,7 @@ pub struct IoVec<'a>(sys::io::IoVec<'a>);
#[unstable(feature = "iovec", issue = "0")] #[unstable(feature = "iovec", issue = "0")]
impl<'a> fmt::Debug for IoVec<'a> { impl<'a> fmt::Debug for IoVec<'a> {
fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result { 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> { pub fn new(buf: &'a [u8]) -> IoVec<'a> {
IoVec(sys::io::IoVec::new(buf)) 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] #[inline]
pub fn as_slice(&self) -> &'a [u8] { fn deref(&self) -> &[u8] {
self.0.as_slice() self.0.as_slice()
} }
} }
@@ -1103,7 +1111,7 @@ pub trait Write {
/// `write`. /// `write`.
#[unstable(feature = "iovec", issue = "0")] #[unstable(feature = "iovec", issue = "0")]
fn write_vectored(&mut self, bufs: &[IoVec<'_>]) -> Result<usize> { 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), Some(buf) => self.write(buf),
None => Ok(0), 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> { fn read_vectored(&mut self, bufs: &mut [IoVecMut<'_>]) -> Result<usize> {
if !self.done_first { if !self.done_first {
match self.first.read_vectored(bufs)? { 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), n => return Ok(n),
} }
} }

View File

@@ -156,7 +156,7 @@ impl Read for Repeat {
fn read_vectored(&mut self, bufs: &mut [IoVecMut<'_>]) -> io::Result<usize> { fn read_vectored(&mut self, bufs: &mut [IoVecMut<'_>]) -> io::Result<usize> {
let mut nwritten = 0; let mut nwritten = 0;
for buf in bufs { for buf in bufs {
nwritten += self.read(buf.as_mut_slice())?; nwritten += self.read(buf)?;
} }
Ok(nwritten) Ok(nwritten)
} }
@@ -207,7 +207,7 @@ impl Write for Sink {
#[inline] #[inline]
fn write_vectored(&mut self, bufs: &[IoVec<'_>]) -> io::Result<usize> { 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) Ok(total_len)
} }

View File

@@ -7,7 +7,7 @@ impl<'a> IoVec<'a> {
} }
#[inline] #[inline]
pub fn as_slice(&self) -> &'a [u8] { pub fn as_slice(&self) -> &[u8] {
self.0 self.0
} }
} }
@@ -21,12 +21,12 @@ impl<'a> IoVecMut<'a> {
} }
#[inline] #[inline]
pub fn as_slice(&self) -> &'a [u8] { pub fn as_slice(&self) -> &[u8] {
self.0 self.0
} }
#[inline] #[inline]
pub fn as_mut_slice(&mut self) -> &'a mut [u8] { pub fn as_mut_slice(&mut self) -> &mut [u8] {
self.0 self.0
} }
} }

View File

@@ -7,7 +7,7 @@ impl<'a> IoVec<'a> {
} }
#[inline] #[inline]
pub fn as_slice(&self) -> &'a [u8] { pub fn as_slice(&self) -> &[u8] {
self.0 self.0
} }
} }
@@ -21,12 +21,12 @@ impl<'a> IoVecMut<'a> {
} }
#[inline] #[inline]
pub fn as_slice(&self) -> &'a [u8] { pub fn as_slice(&self) -> &[u8] {
self.0 self.0
} }
#[inline] #[inline]
pub fn as_mut_slice(&mut self) -> &'a mut [u8] { pub fn as_mut_slice(&mut self) -> &mut [u8] {
self.0 self.0
} }
} }

View File

@@ -35,7 +35,7 @@ impl TcpStream {
} }
pub fn read_vectored(&self, buf: &mut [IoVecMut<'_>]) -> io::Result<usize> { 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), Some(buf) => self.read(buf),
None => Ok(0), None => Ok(0),
} }
@@ -46,7 +46,7 @@ impl TcpStream {
} }
pub fn write_vectored(&self, bufs: &[IoVec<'_>]) -> io::Result<usize> { 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), Some(buf) => self.write(buf),
None => Ok(0), None => Ok(0),
} }

View File

@@ -7,7 +7,7 @@ impl<'a> IoVec<'a> {
} }
#[inline] #[inline]
pub fn as_slice(&self) -> &'a [u8] { pub fn as_slice(&self) -> &[u8] {
self.0 self.0
} }
} }
@@ -21,12 +21,12 @@ impl<'a> IoVecMut<'a> {
} }
#[inline] #[inline]
pub fn as_slice(&self) -> &'a [u8] { pub fn as_slice(&self) -> &[u8] {
self.0 self.0
} }
#[inline] #[inline]
pub fn as_mut_slice(&mut self) -> &'a mut [u8] { pub fn as_mut_slice(&mut self) -> &mut [u8] {
self.0 self.0
} }
} }

View File

@@ -105,7 +105,7 @@ impl TcpStream {
pub fn read_vectored(&self, buf: &mut [IoVecMut<'_>]) -> io::Result<usize> { pub fn read_vectored(&self, buf: &mut [IoVecMut<'_>]) -> io::Result<usize> {
let buf = match buf.get(0) { let buf = match buf.get(0) {
Some(buf) => buf.as_mut_slice(), Some(buf) => buf,
None => return Ok(0), None => return Ok(0),
}; };
self.read(buf) self.read(buf)
@@ -117,7 +117,7 @@ impl TcpStream {
pub fn write_vectored(&self, buf: &[IoVec<'_>]) -> io::Result<usize> { pub fn write_vectored(&self, buf: &[IoVec<'_>]) -> io::Result<usize> {
let buf = match buf.get(0) { let buf = match buf.get(0) {
Some(buf) => buf.as_slice(), Some(buf) => buf,
None => return Ok(0), None => return Ok(0),
}; };
self.read(buf) self.read(buf)

View File

@@ -21,7 +21,7 @@ impl<'a> IoVec<'a> {
} }
#[inline] #[inline]
pub fn as_slice(&self) -> &'a [u8] { pub fn as_slice(&self) -> &[u8] {
unsafe { unsafe {
slice::from_raw_parts(self.vec.iov_base as *mut u8, self.vec.iov_len) slice::from_raw_parts(self.vec.iov_base as *mut u8, self.vec.iov_len)
} }
@@ -46,14 +46,14 @@ impl<'a> IoVecMut<'a> {
} }
#[inline] #[inline]
pub fn as_slice(&self) -> &'a [u8] { pub fn as_slice(&self) -> &[u8] {
unsafe { unsafe {
slice::from_raw_parts(self.vec.iov_base as *mut u8, self.vec.iov_len) slice::from_raw_parts(self.vec.iov_base as *mut u8, self.vec.iov_len)
} }
} }
#[inline] #[inline]
pub fn as_mut_slice(&mut self) -> &'a mut [u8] { pub fn as_mut_slice(&mut self) -> &mut [u8] {
unsafe { unsafe {
slice::from_raw_parts_mut(self.vec.iov_base as *mut u8, self.vec.iov_len) slice::from_raw_parts_mut(self.vec.iov_base as *mut u8, self.vec.iov_len)
} }

View File

@@ -7,7 +7,7 @@ impl<'a> IoVec<'a> {
} }
#[inline] #[inline]
pub fn as_slice(&self) -> &'a [u8] { pub fn as_slice(&self) -> &[u8] {
self.0 self.0
} }
} }
@@ -21,12 +21,12 @@ impl<'a> IoVecMut<'a> {
} }
#[inline] #[inline]
pub fn as_slice(&self) -> &'a [u8] { pub fn as_slice(&self) -> &[u8] {
self.0 self.0
} }
#[inline] #[inline]
pub fn as_mut_slice(&mut self) -> &'a mut [u8] { pub fn as_mut_slice(&mut self) -> &mut [u8] {
self.0 self.0
} }
} }

View File

@@ -22,7 +22,7 @@ impl<'a> IoVec<'a> {
} }
#[inline] #[inline]
pub fn as_slice(&self) -> &'a [u8] { pub fn as_slice(&self) -> &[u8] {
unsafe { unsafe {
slice::from_raw_parts(self.vec.buf as *mut u8, self.vec.len as usize) slice::from_raw_parts(self.vec.buf as *mut u8, self.vec.len as usize)
} }
@@ -48,14 +48,14 @@ impl<'a> IoVecMut<'a> {
} }
#[inline] #[inline]
pub fn as_slice(&self) -> &'a [u8] { pub fn as_slice(&self) -> &[u8] {
unsafe { unsafe {
slice::from_raw_parts(self.vec.buf as *mut u8, self.vec.len as usize) slice::from_raw_parts(self.vec.buf as *mut u8, self.vec.len as usize)
} }
} }
#[inline] #[inline]
pub fn as_mut_slice(&mut self) -> &'a mut [u8] { pub fn as_mut_slice(&mut self) -> &mut [u8] {
unsafe { unsafe {
slice::from_raw_parts_mut(self.vec.buf as *mut u8, self.vec.len as usize) slice::from_raw_parts_mut(self.vec.buf as *mut u8, self.vec.len as usize)
} }