Use ManuallyDrop instead of mem::forget (#675)

This commit is contained in:
Brad Dunbar
2024-03-14 14:40:03 +01:00
committed by GitHub
parent ca004117f8
commit 536db06f16
+12 -14
View File
@@ -244,23 +244,22 @@ impl BytesMut {
/// ``` /// ```
#[inline] #[inline]
pub fn freeze(self) -> Bytes { pub fn freeze(self) -> Bytes {
if self.kind() == KIND_VEC { let bytes = ManuallyDrop::new(self);
if bytes.kind() == KIND_VEC {
// Just re-use `Bytes` internal Vec vtable // Just re-use `Bytes` internal Vec vtable
unsafe { unsafe {
let off = self.get_vec_pos(); let off = bytes.get_vec_pos();
let vec = rebuild_vec(self.ptr.as_ptr(), self.len, self.cap, off); let vec = rebuild_vec(bytes.ptr.as_ptr(), bytes.len, bytes.cap, off);
mem::forget(self);
let mut b: Bytes = vec.into(); let mut b: Bytes = vec.into();
b.advance(off); b.advance(off);
b b
} }
} else { } else {
debug_assert_eq!(self.kind(), KIND_ARC); debug_assert_eq!(bytes.kind(), KIND_ARC);
let ptr = self.ptr.as_ptr(); let ptr = bytes.ptr.as_ptr();
let len = self.len; let len = bytes.len;
let data = AtomicPtr::new(self.data.cast()); let data = AtomicPtr::new(bytes.data.cast());
mem::forget(self);
unsafe { Bytes::with_vtable(ptr, len, data, &SHARED_VTABLE) } unsafe { Bytes::with_vtable(ptr, len, data, &SHARED_VTABLE) }
} }
} }
@@ -829,11 +828,11 @@ impl BytesMut {
// internal change could make a simple pattern (`BytesMut::from(vec)`) // internal change could make a simple pattern (`BytesMut::from(vec)`)
// suddenly a lot more expensive. // suddenly a lot more expensive.
#[inline] #[inline]
pub(crate) fn from_vec(mut vec: Vec<u8>) -> BytesMut { pub(crate) fn from_vec(vec: Vec<u8>) -> BytesMut {
let mut vec = ManuallyDrop::new(vec);
let ptr = vptr(vec.as_mut_ptr()); let ptr = vptr(vec.as_mut_ptr());
let len = vec.len(); let len = vec.len();
let cap = vec.capacity(); let cap = vec.capacity();
mem::forget(vec);
let original_capacity_repr = original_capacity_to_repr(cap); let original_capacity_repr = original_capacity_to_repr(cap);
let data = (original_capacity_repr << ORIGINAL_CAPACITY_OFFSET) | KIND_VEC; let data = (original_capacity_repr << ORIGINAL_CAPACITY_OFFSET) | KIND_VEC;
@@ -1616,6 +1615,7 @@ impl PartialEq<Bytes> for BytesMut {
impl From<BytesMut> for Vec<u8> { impl From<BytesMut> for Vec<u8> {
fn from(bytes: BytesMut) -> Self { fn from(bytes: BytesMut) -> Self {
let kind = bytes.kind(); let kind = bytes.kind();
let bytes = ManuallyDrop::new(bytes);
let mut vec = if kind == KIND_VEC { let mut vec = if kind == KIND_VEC {
unsafe { unsafe {
@@ -1632,7 +1632,7 @@ impl From<BytesMut> for Vec<u8> {
vec vec
} else { } else {
return bytes.deref().to_vec(); return ManuallyDrop::into_inner(bytes).deref().to_vec();
} }
}; };
@@ -1643,8 +1643,6 @@ impl From<BytesMut> for Vec<u8> {
vec.set_len(len); vec.set_len(len);
} }
mem::forget(bytes);
vec vec
} }
} }