Skip to content

Commit

Permalink
Rollup merge of #73495 - Lucretiel:wasi-io-impls, r=sfackler
Browse files Browse the repository at this point in the history
Converted all platform-specific stdin/stdout/stderr implementations to use io:: traits

Currently, some of the platform-specific standard streams (`src/libstd/sys/*/stdio.rs`) manually implement parts of the `io::Write` interface directly as methods on the struct, rather than by actually implementing the trait. There doesn't seem to be any reason for this, other than an unused advantage of `fn write(&self, ...)` instead of `fn write(&mut self, ...)`.

Unfortunately, this means that those implementations don't have the default-implemented io methods, like `read_exact` and `write_all`. This caused #72705, which adds forwarding methods to the user-facing standard stream implementations, to fail to compile on those platforms.

This change converts *all* such standard stream structs to use the standard library traits. This change should not cause any breakages, because the changed types are not publicly exported, and in fact are only ever used in `src/libstd/io/stdio.rs`.
  • Loading branch information
Dylan-DPC committed Jun 23, 2020
2 parents 6276c13 + 0094f44 commit 5426586
Show file tree
Hide file tree
Showing 2 changed files with 49 additions and 56 deletions.
39 changes: 17 additions & 22 deletions src/libstd/sys/hermit/stdio.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,19 +10,19 @@ impl Stdin {
pub fn new() -> io::Result<Stdin> {
Ok(Stdin)
}
}

pub fn read(&self, data: &mut [u8]) -> io::Result<usize> {
impl io::Read for Stdin {
fn read(&mut self, data: &mut [u8]) -> io::Result<usize> {
self.read_vectored(&mut [IoSliceMut::new(data)])
}

pub fn read_vectored(&self, _data: &mut [IoSliceMut<'_>]) -> io::Result<usize> {
//ManuallyDrop::new(unsafe { WasiFd::from_raw(libc::STDIN_FILENO as u32) })
// .read(data)
fn read_vectored(&mut self, _data: &mut [IoSliceMut<'_>]) -> io::Result<usize> {
Ok(0)
}

#[inline]
pub fn is_read_vectored(&self) -> bool {
fn is_read_vectored(&self) -> bool {
true
}
}
Expand All @@ -31,8 +31,10 @@ impl Stdout {
pub fn new() -> io::Result<Stdout> {
Ok(Stdout)
}
}

pub fn write(&self, data: &[u8]) -> io::Result<usize> {
impl io::Write for Stdout {
fn write(&mut self, data: &[u8]) -> io::Result<usize> {
let len;

unsafe { len = abi::write(1, data.as_ptr() as *const u8, data.len()) }
Expand All @@ -44,7 +46,7 @@ impl Stdout {
}
}

pub fn write_vectored(&self, data: &[IoSlice<'_>]) -> io::Result<usize> {
fn write_vectored(&mut self, data: &[IoSlice<'_>]) -> io::Result<usize> {
let len;

unsafe { len = abi::write(1, data.as_ptr() as *const u8, data.len()) }
Expand All @@ -57,11 +59,11 @@ impl Stdout {
}

#[inline]
pub fn is_write_vectored(&self) -> bool {
fn is_write_vectored(&self) -> bool {
true
}

pub fn flush(&self) -> io::Result<()> {
fn flush(&mut self) -> io::Result<()> {
Ok(())
}
}
Expand All @@ -70,8 +72,10 @@ impl Stderr {
pub fn new() -> io::Result<Stderr> {
Ok(Stderr)
}
}

pub fn write(&self, data: &[u8]) -> io::Result<usize> {
impl io::Write for Stderr {
fn write(&mut self, data: &[u8]) -> io::Result<usize> {
let len;

unsafe { len = abi::write(2, data.as_ptr() as *const u8, data.len()) }
Expand All @@ -83,7 +87,7 @@ impl Stderr {
}
}

pub fn write_vectored(&self, data: &[IoSlice<'_>]) -> io::Result<usize> {
fn write_vectored(&mut self, data: &[IoSlice<'_>]) -> io::Result<usize> {
let len;

unsafe { len = abi::write(2, data.as_ptr() as *const u8, data.len()) }
Expand All @@ -96,21 +100,12 @@ impl Stderr {
}

#[inline]
pub fn is_write_vectored(&self) -> bool {
fn is_write_vectored(&self) -> bool {
true
}

pub fn flush(&self) -> io::Result<()> {
Ok(())
}
}

impl io::Write for Stderr {
fn write(&mut self, data: &[u8]) -> io::Result<usize> {
(&*self).write(data)
}
fn flush(&mut self) -> io::Result<()> {
(&*self).flush()
Ok(())
}
}

Expand Down
66 changes: 32 additions & 34 deletions src/libstd/sys/wasi/stdio.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,85 +11,83 @@ impl Stdin {
Ok(Stdin)
}

pub fn read(&self, data: &mut [u8]) -> io::Result<usize> {
#[inline]
pub fn as_raw_fd(&self) -> u32 {
0
}
}

impl io::Read for Stdin {
fn read(&mut self, data: &mut [u8]) -> io::Result<usize> {
self.read_vectored(&mut [IoSliceMut::new(data)])
}

pub fn read_vectored(&self, data: &mut [IoSliceMut<'_>]) -> io::Result<usize> {
fn read_vectored(&mut self, data: &mut [IoSliceMut<'_>]) -> io::Result<usize> {
ManuallyDrop::new(unsafe { WasiFd::from_raw(self.as_raw_fd()) }).read(data)
}

#[inline]
pub fn is_read_vectored(&self) -> bool {
fn is_read_vectored(&self) -> bool {
true
}

pub fn as_raw_fd(&self) -> u32 {
0
}
}

impl Stdout {
pub fn new() -> io::Result<Stdout> {
Ok(Stdout)
}

pub fn write(&self, data: &[u8]) -> io::Result<usize> {
#[inline]
pub fn as_raw_fd(&self) -> u32 {
1
}
}

impl io::Write for Stdout {
fn write(&mut self, data: &[u8]) -> io::Result<usize> {
self.write_vectored(&[IoSlice::new(data)])
}

pub fn write_vectored(&self, data: &[IoSlice<'_>]) -> io::Result<usize> {
fn write_vectored(&mut self, data: &[IoSlice<'_>]) -> io::Result<usize> {
ManuallyDrop::new(unsafe { WasiFd::from_raw(self.as_raw_fd()) }).write(data)
}

#[inline]
pub fn is_write_vectored(&self) -> bool {
fn is_write_vectored(&self) -> bool {
true
}

pub fn flush(&self) -> io::Result<()> {
fn flush(&mut self) -> io::Result<()> {
Ok(())
}

pub fn as_raw_fd(&self) -> u32 {
1
}
}

impl Stderr {
pub fn new() -> io::Result<Stderr> {
Ok(Stderr)
}

pub fn write(&self, data: &[u8]) -> io::Result<usize> {
self.write_vectored(&[IoSlice::new(data)])
}

pub fn write_vectored(&self, data: &[IoSlice<'_>]) -> io::Result<usize> {
ManuallyDrop::new(unsafe { WasiFd::from_raw(self.as_raw_fd()) }).write(data)
}

#[inline]
pub fn is_write_vectored(&self) -> bool {
true
}

pub fn flush(&self) -> io::Result<()> {
Ok(())
}

pub fn as_raw_fd(&self) -> u32 {
2
}
}

impl io::Write for Stderr {
fn write(&mut self, data: &[u8]) -> io::Result<usize> {
(&*self).write(data)
self.write_vectored(&[IoSlice::new(data)])
}

fn write_vectored(&mut self, data: &[IoSlice<'_>]) -> io::Result<usize> {
ManuallyDrop::new(unsafe { WasiFd::from_raw(self.as_raw_fd()) }).write(data)
}

#[inline]
fn is_write_vectored(&self) -> bool {
true
}

fn flush(&mut self) -> io::Result<()> {
(&*self).flush()
Ok(())
}
}

Expand Down

0 comments on commit 5426586

Please sign in to comment.