Skip to content

Commit 596f182

Browse files
committed
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.
1 parent 31bcec6 commit 596f182

File tree

13 files changed

+53
-47
lines changed

13 files changed

+53
-47
lines changed

src/libstd/io/buffered.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -236,7 +236,7 @@ impl<R: Read> Read for BufReader<R> {
236236
}
237237

238238
fn read_vectored(&mut self, bufs: &mut [IoVecMut<'_>]) -> io::Result<usize> {
239-
let total_len = bufs.iter().map(|b| b.as_slice().len()).sum::<usize>();
239+
let total_len = bufs.iter().map(|b| b.len()).sum::<usize>();
240240
if self.pos == self.cap && total_len >= self.buf.len() {
241241
return self.inner.read_vectored(bufs);
242242
}
@@ -595,7 +595,7 @@ impl<W: Write> Write for BufWriter<W> {
595595
}
596596

597597
fn write_vectored(&mut self, bufs: &[IoVec<'_>]) -> io::Result<usize> {
598-
let total_len = bufs.iter().map(|b| b.as_slice().len()).sum::<usize>();
598+
let total_len = bufs.iter().map(|b| b.len()).sum::<usize>();
599599
if self.buf.len() + total_len > self.buf.capacity() {
600600
self.flush_buf()?;
601601
}

src/libstd/io/cursor.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -224,7 +224,6 @@ impl<T> Read for Cursor<T> where T: AsRef<[u8]> {
224224
fn read_vectored(&mut self, bufs: &mut [IoVecMut<'_>]) -> io::Result<usize> {
225225
let mut nread = 0;
226226
for buf in bufs {
227-
let buf = buf.as_mut_slice();
228227
let n = self.read(buf)?;
229228
nread += n;
230229
if n < buf.len() {
@@ -272,7 +271,6 @@ fn slice_write_vectored(
272271
{
273272
let mut nwritten = 0;
274273
for buf in bufs {
275-
let buf = buf.as_slice();
276274
let n = slice_write(pos_mut, slice, buf)?;
277275
nwritten += n;
278276
if n < buf.len() {
@@ -317,7 +315,7 @@ fn vec_write_vectored(
317315
{
318316
let mut nwritten = 0;
319317
for buf in bufs {
320-
nwritten += vec_write(pos_mut, vec, buf.as_slice())?;
318+
nwritten += vec_write(pos_mut, vec, buf)?;
321319
}
322320
Ok(nwritten)
323321
}

src/libstd/io/impls.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -196,7 +196,7 @@ impl<'a> Read for &'a [u8] {
196196
fn read_vectored(&mut self, bufs: &mut [IoVecMut<'_>]) -> io::Result<usize> {
197197
let mut nread = 0;
198198
for buf in bufs {
199-
nread += self.read(buf.as_mut_slice())?;
199+
nread += self.read(buf)?;
200200
if self.is_empty() {
201201
break;
202202
}
@@ -269,7 +269,7 @@ impl<'a> Write for &'a mut [u8] {
269269
fn write_vectored(&mut self, bufs: &[IoVec<'_>]) -> io::Result<usize> {
270270
let mut nwritten = 0;
271271
for buf in bufs {
272-
nwritten += self.write(buf.as_slice())?;
272+
nwritten += self.write(buf)?;
273273
if self.is_empty() {
274274
break;
275275
}
@@ -303,10 +303,10 @@ impl Write for Vec<u8> {
303303

304304
#[inline]
305305
fn write_vectored(&mut self, bufs: &[IoVec<'_>]) -> io::Result<usize> {
306-
let len = bufs.iter().map(|b| b.as_slice().len()).sum();
306+
let len = bufs.iter().map(|b| b.len()).sum();
307307
self.reserve(len);
308308
for buf in bufs {
309-
self.extend_from_slice(buf.as_slice());
309+
self.extend_from_slice(buf);
310310
}
311311
Ok(len)
312312
}

src/libstd/io/mod.rs

Lines changed: 22 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,7 @@ use fmt;
264264
use slice;
265265
use str;
266266
use memchr;
267+
use ops::{Deref, DerefMut};
267268
use ptr;
268269
use sys;
269270

@@ -531,7 +532,7 @@ pub trait Read {
531532
/// `read`.
532533
#[unstable(feature = "iovec", issue = "0")]
533534
fn read_vectored(&mut self, bufs: &mut [IoVecMut<'_>]) -> Result<usize> {
534-
match bufs.iter_mut().map(|b| b.as_mut_slice()).find(|b| !b.is_empty()) {
535+
match bufs.iter_mut().find(|b| !b.is_empty()) {
535536
Some(buf) => self.read(buf),
536537
None => Ok(0),
537538
}
@@ -896,7 +897,7 @@ pub struct IoVecMut<'a>(sys::io::IoVecMut<'a>);
896897
#[unstable(feature = "iovec", issue = "0")]
897898
impl<'a> fmt::Debug for IoVecMut<'a> {
898899
fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
899-
fmt::Debug::fmt(self.as_slice(), fmt)
900+
fmt::Debug::fmt(self.0.as_slice(), fmt)
900901
}
901902
}
902903

@@ -911,18 +912,22 @@ impl<'a> IoVecMut<'a> {
911912
pub fn new(buf: &'a mut [u8]) -> IoVecMut<'a> {
912913
IoVecMut(sys::io::IoVecMut::new(buf))
913914
}
915+
}
916+
917+
#[unstable(feature = "iovec", issue = "0")]
918+
impl<'a> Deref for IoVecMut<'a> {
919+
type Target = [u8];
914920

915-
/// Returns a shared reference to the inner slice.
916-
#[unstable(feature = "iovec", issue = "0")]
917921
#[inline]
918-
pub fn as_slice(&self) -> &'a [u8] {
922+
fn deref(&self) -> &[u8] {
919923
self.0.as_slice()
920924
}
925+
}
921926

922-
/// Returns a mutable reference to the inner slice.
923-
#[unstable(feature = "iovec", issue = "0")]
927+
#[unstable(feature = "iovec", issue = "0")]
928+
impl<'a> DerefMut for IoVecMut<'a> {
924929
#[inline]
925-
pub fn as_mut_slice(&mut self) -> &'a mut [u8] {
930+
fn deref_mut(&mut self) -> &mut [u8] {
926931
self.0.as_mut_slice()
927932
}
928933
}
@@ -939,7 +944,7 @@ pub struct IoVec<'a>(sys::io::IoVec<'a>);
939944
#[unstable(feature = "iovec", issue = "0")]
940945
impl<'a> fmt::Debug for IoVec<'a> {
941946
fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
942-
fmt::Debug::fmt(self.as_slice(), fmt)
947+
fmt::Debug::fmt(self.0.as_slice(), fmt)
943948
}
944949
}
945950

@@ -954,11 +959,14 @@ impl<'a> IoVec<'a> {
954959
pub fn new(buf: &'a [u8]) -> IoVec<'a> {
955960
IoVec(sys::io::IoVec::new(buf))
956961
}
962+
}
963+
964+
#[unstable(feature = "iovec", issue = "0")]
965+
impl<'a> Deref for IoVec<'a> {
966+
type Target = [u8];
957967

958-
/// Returns a shared reference to the inner slice.
959-
#[unstable(feature = "iovec", issue = "0")]
960968
#[inline]
961-
pub fn as_slice(&self) -> &'a [u8] {
969+
fn deref(&self) -> &[u8] {
962970
self.0.as_slice()
963971
}
964972
}
@@ -1103,7 +1111,7 @@ pub trait Write {
11031111
/// `write`.
11041112
#[unstable(feature = "iovec", issue = "0")]
11051113
fn write_vectored(&mut self, bufs: &[IoVec<'_>]) -> Result<usize> {
1106-
match bufs.iter().map(|b| b.as_slice()).find(|b| !b.is_empty()) {
1114+
match bufs.iter().find(|b| !b.is_empty()) {
11071115
Some(buf) => self.write(buf),
11081116
None => Ok(0),
11091117
}
@@ -1813,7 +1821,7 @@ impl<T: Read, U: Read> Read for Chain<T, U> {
18131821
fn read_vectored(&mut self, bufs: &mut [IoVecMut<'_>]) -> Result<usize> {
18141822
if !self.done_first {
18151823
match self.first.read_vectored(bufs)? {
1816-
0 if bufs.iter().any(|b| !b.as_slice().is_empty()) => self.done_first = true,
1824+
0 if bufs.iter().any(|b| !b.is_empty()) => self.done_first = true,
18171825
n => return Ok(n),
18181826
}
18191827
}

src/libstd/io/util.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@ impl Read for Repeat {
156156
fn read_vectored(&mut self, bufs: &mut [IoVecMut<'_>]) -> io::Result<usize> {
157157
let mut nwritten = 0;
158158
for buf in bufs {
159-
nwritten += self.read(buf.as_mut_slice())?;
159+
nwritten += self.read(buf)?;
160160
}
161161
Ok(nwritten)
162162
}
@@ -207,7 +207,7 @@ impl Write for Sink {
207207

208208
#[inline]
209209
fn write_vectored(&mut self, bufs: &[IoVec<'_>]) -> io::Result<usize> {
210-
let total_len = bufs.iter().map(|b| b.as_slice().len()).sum();
210+
let total_len = bufs.iter().map(|b| b.len()).sum();
211211
Ok(total_len)
212212
}
213213

src/libstd/sys/cloudabi/io.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ impl<'a> IoVec<'a> {
77
}
88

99
#[inline]
10-
pub fn as_slice(&self) -> &'a [u8] {
10+
pub fn as_slice(&self) -> &[u8] {
1111
self.0
1212
}
1313
}
@@ -21,12 +21,12 @@ impl<'a> IoVecMut<'a> {
2121
}
2222

2323
#[inline]
24-
pub fn as_slice(&self) -> &'a [u8] {
24+
pub fn as_slice(&self) -> &[u8] {
2525
self.0
2626
}
2727

2828
#[inline]
29-
pub fn as_mut_slice(&mut self) -> &'a mut [u8] {
29+
pub fn as_mut_slice(&mut self) -> &mut [u8] {
3030
self.0
3131
}
3232
}

src/libstd/sys/redox/io.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ impl<'a> IoVec<'a> {
77
}
88

99
#[inline]
10-
pub fn as_slice(&self) -> &'a [u8] {
10+
pub fn as_slice(&self) -> &[u8] {
1111
self.0
1212
}
1313
}
@@ -21,12 +21,12 @@ impl<'a> IoVecMut<'a> {
2121
}
2222

2323
#[inline]
24-
pub fn as_slice(&self) -> &'a [u8] {
24+
pub fn as_slice(&self) -> &[u8] {
2525
self.0
2626
}
2727

2828
#[inline]
29-
pub fn as_mut_slice(&mut self) -> &'a mut [u8] {
29+
pub fn as_mut_slice(&mut self) -> &mut [u8] {
3030
self.0
3131
}
3232
}

src/libstd/sys/redox/net/tcp.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ impl TcpStream {
3535
}
3636

3737
pub fn read_vectored(&self, buf: &mut [IoVecMut<'_>]) -> io::Result<usize> {
38-
match buf.iter_mut().map(|b| b.as_mut_slice()).find(|b| !b.is_empty()) {
38+
match buf.iter_mut().find(|b| !b.is_empty()) {
3939
Some(buf) => self.read(buf),
4040
None => Ok(0),
4141
}
@@ -46,7 +46,7 @@ impl TcpStream {
4646
}
4747

4848
pub fn write_vectored(&self, bufs: &[IoVec<'_>]) -> io::Result<usize> {
49-
match buf.iter().map(|b| b.as_slice()).find(|b| !b.is_empty()) {
49+
match buf.iter().find(|b| !b.is_empty()) {
5050
Some(buf) => self.write(buf),
5151
None => Ok(0),
5252
}

src/libstd/sys/sgx/io.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ impl<'a> IoVec<'a> {
77
}
88

99
#[inline]
10-
pub fn as_slice(&self) -> &'a [u8] {
10+
pub fn as_slice(&self) -> &[u8] {
1111
self.0
1212
}
1313
}
@@ -21,12 +21,12 @@ impl<'a> IoVecMut<'a> {
2121
}
2222

2323
#[inline]
24-
pub fn as_slice(&self) -> &'a [u8] {
24+
pub fn as_slice(&self) -> &[u8] {
2525
self.0
2626
}
2727

2828
#[inline]
29-
pub fn as_mut_slice(&mut self) -> &'a mut [u8] {
29+
pub fn as_mut_slice(&mut self) -> &mut [u8] {
3030
self.0
3131
}
3232
}

src/libstd/sys/sgx/net.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ impl TcpStream {
105105

106106
pub fn read_vectored(&self, buf: &mut [IoVecMut<'_>]) -> io::Result<usize> {
107107
let buf = match buf.get(0) {
108-
Some(buf) => buf.as_mut_slice(),
108+
Some(buf) => buf,
109109
None => return Ok(0),
110110
};
111111
self.read(buf)
@@ -117,7 +117,7 @@ impl TcpStream {
117117

118118
pub fn write_vectored(&self, buf: &[IoVec<'_>]) -> io::Result<usize> {
119119
let buf = match buf.get(0) {
120-
Some(buf) => buf.as_slice(),
120+
Some(buf) => buf,
121121
None => return Ok(0),
122122
};
123123
self.read(buf)

src/libstd/sys/unix/io.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ impl<'a> IoVec<'a> {
2121
}
2222

2323
#[inline]
24-
pub fn as_slice(&self) -> &'a [u8] {
24+
pub fn as_slice(&self) -> &[u8] {
2525
unsafe {
2626
slice::from_raw_parts(self.vec.iov_base as *mut u8, self.vec.iov_len)
2727
}
@@ -46,14 +46,14 @@ impl<'a> IoVecMut<'a> {
4646
}
4747

4848
#[inline]
49-
pub fn as_slice(&self) -> &'a [u8] {
49+
pub fn as_slice(&self) -> &[u8] {
5050
unsafe {
5151
slice::from_raw_parts(self.vec.iov_base as *mut u8, self.vec.iov_len)
5252
}
5353
}
5454

5555
#[inline]
56-
pub fn as_mut_slice(&mut self) -> &'a mut [u8] {
56+
pub fn as_mut_slice(&mut self) -> &mut [u8] {
5757
unsafe {
5858
slice::from_raw_parts_mut(self.vec.iov_base as *mut u8, self.vec.iov_len)
5959
}

src/libstd/sys/wasm/io.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ impl<'a> IoVec<'a> {
77
}
88

99
#[inline]
10-
pub fn as_slice(&self) -> &'a [u8] {
10+
pub fn as_slice(&self) -> &[u8] {
1111
self.0
1212
}
1313
}
@@ -21,12 +21,12 @@ impl<'a> IoVecMut<'a> {
2121
}
2222

2323
#[inline]
24-
pub fn as_slice(&self) -> &'a [u8] {
24+
pub fn as_slice(&self) -> &[u8] {
2525
self.0
2626
}
2727

2828
#[inline]
29-
pub fn as_mut_slice(&mut self) -> &'a mut [u8] {
29+
pub fn as_mut_slice(&mut self) -> &mut [u8] {
3030
self.0
3131
}
3232
}

src/libstd/sys/windows/io.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ impl<'a> IoVec<'a> {
2222
}
2323

2424
#[inline]
25-
pub fn as_slice(&self) -> &'a [u8] {
25+
pub fn as_slice(&self) -> &[u8] {
2626
unsafe {
2727
slice::from_raw_parts(self.vec.buf as *mut u8, self.vec.len as usize)
2828
}
@@ -48,14 +48,14 @@ impl<'a> IoVecMut<'a> {
4848
}
4949

5050
#[inline]
51-
pub fn as_slice(&self) -> &'a [u8] {
51+
pub fn as_slice(&self) -> &[u8] {
5252
unsafe {
5353
slice::from_raw_parts(self.vec.buf as *mut u8, self.vec.len as usize)
5454
}
5555
}
5656

5757
#[inline]
58-
pub fn as_mut_slice(&mut self) -> &'a mut [u8] {
58+
pub fn as_mut_slice(&mut self) -> &mut [u8] {
5959
unsafe {
6060
slice::from_raw_parts_mut(self.vec.buf as *mut u8, self.vec.len as usize)
6161
}

0 commit comments

Comments
 (0)