Skip to content

Commit 6c5750a

Browse files
committed
Revert "[git-packetline] Use no pin projections" - let's own the writer
This reverts commit dc4e0e5.
1 parent dc4e0e5 commit 6c5750a

File tree

1 file changed

+25
-20
lines changed

1 file changed

+25
-20
lines changed

git-packetline/src/encode.rs

Lines changed: 25 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -32,12 +32,15 @@ mod async_io {
3232
task::{Context, Poll},
3333
};
3434

35-
/// A way of writing packet lines asynchronously.
36-
pub struct LineWriter<'a, 'b, W: ?Sized> {
37-
writer: &'a mut W,
38-
prefix: &'b [u8],
39-
suffix: &'b [u8],
40-
state: State<'b>,
35+
pin_project_lite::pin_project! {
36+
/// A way of writing packet lines asynchronously.
37+
pub struct LineWriter<'a, 'b, W: ?Sized> {
38+
#[pin]
39+
writer: &'a mut W,
40+
prefix: &'b [u8],
41+
suffix: &'b [u8],
42+
state: State<'b>,
43+
}
4144
}
4245
enum State<'a> {
4346
Idle,
@@ -71,8 +74,8 @@ mod async_io {
7174
fn into_io_err(err: Error) -> io::Error {
7275
io::Error::new(io::ErrorKind::Other, err)
7376
}
74-
let mut this = &mut *self;
7577
loop {
78+
let mut this = self.as_mut().project();
7679
match &mut this.state {
7780
State::Idle => {
7881
let data_len = this.prefix.len() + data.len() + this.suffix.len();
@@ -84,36 +87,36 @@ mod async_io {
8487
}
8588
let data_len = data_len + 4;
8689
let len_buf = u16_to_hex(data_len as u16);
87-
this.state = State::WriteHexLen(len_buf, 0)
90+
*this.state = State::WriteHexLen(len_buf, 0)
8891
}
8992
State::WriteHexLen(hex_len, written) => {
9093
while *written != hex_len.len() {
91-
let n = ready!(Pin::new(&mut this.writer).poll_write(cx, &hex_len[*written..]))?;
94+
let n = ready!(this.writer.as_mut().poll_write(cx, &hex_len[*written..]))?;
9295
if n == 0 {
9396
return Poll::Ready(Err(io::ErrorKind::WriteZero.into()));
9497
}
9598
*written += n;
9699
}
97100
if this.prefix.is_empty() {
98-
this.state = State::WriteData(0)
101+
*this.state = State::WriteData(0)
99102
} else {
100-
this.state = State::WritePrefix(this.prefix)
103+
*this.state = State::WritePrefix(this.prefix)
101104
}
102105
}
103106
State::WritePrefix(buf) => {
104107
while !buf.is_empty() {
105-
let n = ready!(Pin::new(&mut this.writer).poll_write(cx, buf))?;
108+
let n = ready!(this.writer.as_mut().poll_write(cx, buf))?;
106109
if n == 0 {
107110
return Poll::Ready(Err(io::ErrorKind::WriteZero.into()));
108111
}
109112
let (_, rest) = std::mem::replace(buf, &[]).split_at(n);
110113
*buf = rest;
111114
}
112-
this.state = State::WriteData(0)
115+
*this.state = State::WriteData(0)
113116
}
114117
State::WriteData(written) => {
115118
while *written != data.len() {
116-
let n = ready!(Pin::new(&mut this.writer).poll_write(cx, &data[*written..]))?;
119+
let n = ready!(this.writer.as_mut().poll_write(cx, &data[*written..]))?;
117120
if n == 0 {
118121
return Poll::Ready(Err(io::ErrorKind::WriteZero.into()));
119122
}
@@ -122,12 +125,12 @@ mod async_io {
122125
if this.suffix.is_empty() {
123126
return Poll::Ready(Ok(4 + this.prefix.len() + *written));
124127
} else {
125-
this.state = State::WriteSuffix(this.suffix)
128+
*this.state = State::WriteSuffix(this.suffix)
126129
}
127130
}
128131
State::WriteSuffix(buf) => {
129132
while !buf.is_empty() {
130-
let n = ready!(Pin::new(&mut this.writer).poll_write(cx, buf))?;
133+
let n = ready!(this.writer.as_mut().poll_write(cx, buf))?;
131134
if n == 0 {
132135
return Poll::Ready(Err(io::ErrorKind::WriteZero.into()));
133136
}
@@ -140,12 +143,14 @@ mod async_io {
140143
}
141144
}
142145

143-
fn poll_flush(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<io::Result<()>> {
144-
Pin::new(&mut *self.writer).poll_flush(cx)
146+
fn poll_flush(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<io::Result<()>> {
147+
let this = self.project();
148+
this.writer.poll_flush(cx)
145149
}
146150

147-
fn poll_close(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<io::Result<()>> {
148-
Pin::new(&mut self.writer).poll_close(cx)
151+
fn poll_close(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<io::Result<()>> {
152+
let this = self.project();
153+
this.writer.poll_close(cx)
149154
}
150155
}
151156

0 commit comments

Comments
 (0)