diff options
author | Gurwinder Singh <vargwin@gmail.com> | 2020-03-16 17:46:31 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-03-16 10:46:31 -0700 |
commit | 8077ade7413db72572b8685c883f078335e0561b (patch) | |
tree | bfda1ac3188c4d9f3fc7de656dd4378da2069aa9 /cli/ops/io.rs | |
parent | 0d14a7bd531c76e653ab4fc4e0a81cb25db05ab5 (diff) |
refactor: remove an unsafe and some boxing (#4398)
Diffstat (limited to 'cli/ops/io.rs')
-rw-r--r-- | cli/ops/io.rs | 63 |
1 files changed, 34 insertions, 29 deletions
diff --git a/cli/ops/io.rs b/cli/ops/io.rs index b7f67cea4..7969184ef 100644 --- a/cli/ops/io.rs +++ b/cli/ops/io.rs @@ -156,6 +156,12 @@ pub enum StreamResource { ChildStderr(tokio::process::ChildStderr), } +trait UnpinAsyncRead: AsyncRead + Unpin {} +trait UnpinAsyncWrite: AsyncWrite + Unpin {} + +impl<T: AsyncRead + Unpin> UnpinAsyncRead for T {} +impl<T: AsyncWrite + Unpin> UnpinAsyncWrite for T {} + /// `DenoAsyncRead` is the same as the `tokio_io::AsyncRead` trait /// but uses an `OpError` error instead of `std::io:Error` pub trait DenoAsyncRead { @@ -173,19 +179,18 @@ impl DenoAsyncRead for StreamResource { buf: &mut [u8], ) -> Poll<Result<usize, OpError>> { use StreamResource::*; - let mut f: Pin<Box<dyn AsyncRead>> = match self { - FsFile(f, _) => Box::pin(f), - Stdin(f, _) => Box::pin(f), - TcpStream(f) => Box::pin(f), - ClientTlsStream(f) => Box::pin(f), - ServerTlsStream(f) => Box::pin(f), - ChildStdout(f) => Box::pin(f), - ChildStderr(f) => Box::pin(f), - HttpBody(f) => Box::pin(f), + let f: &mut dyn UnpinAsyncRead = match self { + FsFile(f, _) => f, + Stdin(f, _) => f, + TcpStream(f) => f, + ClientTlsStream(f) => f, + ServerTlsStream(f) => f, + ChildStdout(f) => f, + ChildStderr(f) => f, + HttpBody(f) => f, _ => return Err(OpError::bad_resource_id()).into(), }; - - let v = ready!(f.as_mut().poll_read(cx, buf))?; + let v = ready!(Pin::new(f).poll_read(cx, buf))?; Ok(v).into() } } @@ -252,35 +257,35 @@ impl DenoAsyncWrite for StreamResource { buf: &[u8], ) -> Poll<Result<usize, OpError>> { use StreamResource::*; - let mut f: Pin<Box<dyn AsyncWrite>> = match self { - FsFile(f, _) => Box::pin(f), - Stdout(f) => Box::pin(f), - Stderr(f) => Box::pin(f), - TcpStream(f) => Box::pin(f), - ClientTlsStream(f) => Box::pin(f), - ServerTlsStream(f) => Box::pin(f), - ChildStdin(f) => Box::pin(f), + let f: &mut dyn UnpinAsyncWrite = match self { + FsFile(f, _) => f, + Stdout(f) => f, + Stderr(f) => f, + TcpStream(f) => f, + ClientTlsStream(f) => f, + ServerTlsStream(f) => f, + ChildStdin(f) => f, _ => return Err(OpError::bad_resource_id()).into(), }; - let v = ready!(f.as_mut().poll_write(cx, buf))?; + let v = ready!(Pin::new(f).poll_write(cx, buf))?; Ok(v).into() } fn poll_flush(&mut self, cx: &mut Context) -> Poll<Result<(), OpError>> { use StreamResource::*; - let mut f: Pin<Box<dyn AsyncWrite>> = match self { - FsFile(f, _) => Box::pin(f), - Stdout(f) => Box::pin(f), - Stderr(f) => Box::pin(f), - TcpStream(f) => Box::pin(f), - ClientTlsStream(f) => Box::pin(f), - ServerTlsStream(f) => Box::pin(f), - ChildStdin(f) => Box::pin(f), + let f: &mut dyn UnpinAsyncWrite = match self { + FsFile(f, _) => f, + Stdout(f) => f, + Stderr(f) => f, + TcpStream(f) => f, + ClientTlsStream(f) => f, + ServerTlsStream(f) => f, + ChildStdin(f) => f, _ => return Err(OpError::bad_resource_id()).into(), }; - ready!(f.as_mut().poll_flush(cx))?; + ready!(Pin::new(f).poll_flush(cx))?; Ok(()).into() } |