summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGurwinder Singh <vargwin@gmail.com>2020-03-16 17:46:31 +0000
committerGitHub <noreply@github.com>2020-03-16 10:46:31 -0700
commit8077ade7413db72572b8685c883f078335e0561b (patch)
treebfda1ac3188c4d9f3fc7de656dd4378da2069aa9
parent0d14a7bd531c76e653ab4fc4e0a81cb25db05ab5 (diff)
refactor: remove an unsafe and some boxing (#4398)
-rw-r--r--cli/http_util.rs26
-rw-r--r--cli/ops/io.rs63
2 files changed, 46 insertions, 43 deletions
diff --git a/cli/http_util.rs b/cli/http_util.rs
index 05074fa4d..24a1b3b28 100644
--- a/cli/http_util.rs
+++ b/cli/http_util.rs
@@ -195,7 +195,7 @@ impl AsyncRead for HttpBody {
let n = min(buf.len(), chunk.len() - inner.pos);
{
let rest = &chunk[inner.pos..];
- buf[..n].clone_from_slice(&rest[..n]);
+ buf[..n].copy_from_slice(&rest[..n]);
}
inner.pos += n;
if inner.pos == chunk.len() {
@@ -208,14 +208,12 @@ impl AsyncRead for HttpBody {
assert_eq!(inner.pos, 0);
}
- let chunk_future = &mut inner.response.chunk();
- // Safety: `chunk_future` lives only for duration of this poll. So, it doesn't move.
- let chunk_future = unsafe { Pin::new_unchecked(chunk_future) };
- match chunk_future.poll(cx) {
- Poll::Ready(Err(e)) => {
- Poll::Ready(Err(io::Error::new(io::ErrorKind::Other, e)))
- }
- Poll::Ready(Ok(Some(chunk))) => {
+ let chunk_future = inner.response.chunk();
+ futures::pin_mut!(chunk_future);
+
+ let result = match futures::ready!(chunk_future.poll(cx)) {
+ Err(e) => Err(io::Error::new(io::ErrorKind::Other, e)),
+ Ok(Some(chunk)) => {
debug!(
"HttpBody Real Read buf {} chunk {} pos {}",
buf.len(),
@@ -223,16 +221,16 @@ impl AsyncRead for HttpBody {
inner.pos
);
let n = min(buf.len(), chunk.len());
- buf[..n].clone_from_slice(&chunk[..n]);
+ buf[..n].copy_from_slice(&chunk[..n]);
if buf.len() < chunk.len() {
inner.pos = n;
inner.chunk = Some(chunk);
}
- Poll::Ready(Ok(n))
+ Ok(n)
}
- Poll::Ready(Ok(None)) => Poll::Ready(Ok(0)),
- Poll::Pending => Poll::Pending,
- }
+ Ok(None) => Ok(0),
+ };
+ result.into()
}
}
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()
}