diff --git a/library/proc_macro/src/bridge/buffer.rs b/library/proc_macro/src/bridge/buffer.rs index aeecbd49662..26d210a01c5 100644 --- a/library/proc_macro/src/bridge/buffer.rs +++ b/library/proc_macro/src/bridge/buffer.rs @@ -91,6 +91,21 @@ impl Buffer { let b = self.take(); *self = (b.extend_from_slice)(b, Slice::from(xs)); } + + pub(super) fn push(&mut self, v: T) { + // Fast path to avoid going through an FFI call. + if let Some(final_len) = self.len.checked_add(1) { + if final_len <= self.capacity { + unsafe { + *self.data.add(self.len) = v; + } + self.len = final_len; + return; + } + } + let b = self.take(); + *self = (b.extend_from_slice)(b, Slice::from(std::slice::from_ref(&v))); + } } impl Write for Buffer { diff --git a/library/proc_macro/src/bridge/rpc.rs b/library/proc_macro/src/bridge/rpc.rs index 5c2f9ec9848..ee9a2cf9a97 100644 --- a/library/proc_macro/src/bridge/rpc.rs +++ b/library/proc_macro/src/bridge/rpc.rs @@ -114,7 +114,7 @@ impl DecodeMut<'_, '_, S> for () { impl Encode for u8 { fn encode(self, w: &mut Writer, _: &mut S) { - w.write_all(&[self]).unwrap(); + w.push(self); } }