Skip to content

Commit 536db06

Browse files
authored
Use ManuallyDrop instead of mem::forget (#675)
1 parent ca00411 commit 536db06

File tree

1 file changed

+12
-14
lines changed

1 file changed

+12
-14
lines changed

src/bytes_mut.rs

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -244,23 +244,22 @@ impl BytesMut {
244244
/// ```
245245
#[inline]
246246
pub fn freeze(self) -> Bytes {
247-
if self.kind() == KIND_VEC {
247+
let bytes = ManuallyDrop::new(self);
248+
if bytes.kind() == KIND_VEC {
248249
// Just re-use `Bytes` internal Vec vtable
249250
unsafe {
250-
let off = self.get_vec_pos();
251-
let vec = rebuild_vec(self.ptr.as_ptr(), self.len, self.cap, off);
252-
mem::forget(self);
251+
let off = bytes.get_vec_pos();
252+
let vec = rebuild_vec(bytes.ptr.as_ptr(), bytes.len, bytes.cap, off);
253253
let mut b: Bytes = vec.into();
254254
b.advance(off);
255255
b
256256
}
257257
} else {
258-
debug_assert_eq!(self.kind(), KIND_ARC);
258+
debug_assert_eq!(bytes.kind(), KIND_ARC);
259259

260-
let ptr = self.ptr.as_ptr();
261-
let len = self.len;
262-
let data = AtomicPtr::new(self.data.cast());
263-
mem::forget(self);
260+
let ptr = bytes.ptr.as_ptr();
261+
let len = bytes.len;
262+
let data = AtomicPtr::new(bytes.data.cast());
264263
unsafe { Bytes::with_vtable(ptr, len, data, &SHARED_VTABLE) }
265264
}
266265
}
@@ -829,11 +828,11 @@ impl BytesMut {
829828
// internal change could make a simple pattern (`BytesMut::from(vec)`)
830829
// suddenly a lot more expensive.
831830
#[inline]
832-
pub(crate) fn from_vec(mut vec: Vec<u8>) -> BytesMut {
831+
pub(crate) fn from_vec(vec: Vec<u8>) -> BytesMut {
832+
let mut vec = ManuallyDrop::new(vec);
833833
let ptr = vptr(vec.as_mut_ptr());
834834
let len = vec.len();
835835
let cap = vec.capacity();
836-
mem::forget(vec);
837836

838837
let original_capacity_repr = original_capacity_to_repr(cap);
839838
let data = (original_capacity_repr << ORIGINAL_CAPACITY_OFFSET) | KIND_VEC;
@@ -1616,6 +1615,7 @@ impl PartialEq<Bytes> for BytesMut {
16161615
impl From<BytesMut> for Vec<u8> {
16171616
fn from(bytes: BytesMut) -> Self {
16181617
let kind = bytes.kind();
1618+
let bytes = ManuallyDrop::new(bytes);
16191619

16201620
let mut vec = if kind == KIND_VEC {
16211621
unsafe {
@@ -1632,7 +1632,7 @@ impl From<BytesMut> for Vec<u8> {
16321632

16331633
vec
16341634
} else {
1635-
return bytes.deref().to_vec();
1635+
return ManuallyDrop::into_inner(bytes).deref().to_vec();
16361636
}
16371637
};
16381638

@@ -1643,8 +1643,6 @@ impl From<BytesMut> for Vec<u8> {
16431643
vec.set_len(len);
16441644
}
16451645

1646-
mem::forget(bytes);
1647-
16481646
vec
16491647
}
16501648
}

0 commit comments

Comments
 (0)