Skip to content

Commit ee7a5aa

Browse files
committed
proc_macro_srv: apply more abi upstream changes (rust-lang/rust#85390)
1 parent 8c1178f commit ee7a5aa

File tree

2 files changed

+26
-15
lines changed

2 files changed

+26
-15
lines changed

crates/proc_macro_srv/src/proc_macro/bridge/buffer.rs

Lines changed: 25 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ pub struct Buffer<T: Copy> {
4242
data: *mut T,
4343
len: usize,
4444
capacity: usize,
45-
extend_from_slice: extern "C" fn(Buffer<T>, Slice<'_, T>) -> Buffer<T>,
45+
reserve: extern "C" fn(Buffer<T>, usize) -> Buffer<T>,
4646
drop: extern "C" fn(Buffer<T>),
4747
}
4848

@@ -82,17 +82,28 @@ impl<T: Copy> Buffer<T> {
8282
}
8383

8484
pub(super) fn extend_from_slice(&mut self, xs: &[T]) {
85-
// Fast path to avoid going through an FFI call.
86-
if let Some(final_len) = self.len.checked_add(xs.len()) {
87-
if final_len <= self.capacity {
88-
let dst = unsafe { slice::from_raw_parts_mut(self.data, self.capacity) };
89-
dst[self.len..][..xs.len()].copy_from_slice(xs);
90-
self.len = final_len;
91-
return;
92-
}
85+
if xs.len() > self.capacity.wrapping_sub(self.len) {
86+
let b = self.take();
87+
*self = (b.reserve)(b, xs.len());
88+
}
89+
unsafe {
90+
xs.as_ptr().copy_to_nonoverlapping(self.data.add(self.len), xs.len());
91+
self.len += xs.len();
92+
}
93+
}
94+
95+
pub(super) fn push(&mut self, v: T) {
96+
// The code here is taken from Vec::push, and we know that reserve()
97+
// will panic if we're exceeding isize::MAX bytes and so there's no need
98+
// to check for overflow.
99+
if self.len == self.capacity {
100+
let b = self.take();
101+
*self = (b.reserve)(b, 1);
102+
}
103+
unsafe {
104+
*self.data.add(self.len) = v;
105+
self.len += 1;
93106
}
94-
let b = self.take();
95-
*self = (b.extend_from_slice)(b, Slice::from(xs));
96107
}
97108
}
98109

@@ -134,16 +145,16 @@ impl<T: Copy> From<Vec<T>> for Buffer<T> {
134145
}
135146
}
136147

137-
extern "C" fn extend_from_slice<T: Copy>(b: Buffer<T>, xs: Slice<'_, T>) -> Buffer<T> {
148+
extern "C" fn reserve<T: Copy>(b: Buffer<T>, additional: usize) -> Buffer<T> {
138149
let mut v = to_vec(b);
139-
v.extend_from_slice(&xs);
150+
v.reserve(additional);
140151
Buffer::from(v)
141152
}
142153

143154
extern "C" fn drop<T: Copy>(b: Buffer<T>) {
144155
mem::drop(to_vec(b));
145156
}
146157

147-
Buffer { data, len, capacity, extend_from_slice, drop }
158+
Buffer { data, len, capacity, reserve, drop }
148159
}
149160
}

crates/proc_macro_srv/src/proc_macro/bridge/rpc.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ impl<S> DecodeMut<'_, '_, S> for () {
119119

120120
impl<S> Encode<S> for u8 {
121121
fn encode(self, w: &mut Writer, _: &mut S) {
122-
w.write_all(&[self]).unwrap();
122+
w.push(self);
123123
}
124124
}
125125

0 commit comments

Comments
 (0)