@@ -244,23 +244,22 @@ impl BytesMut {
244
244
/// ```
245
245
#[ inline]
246
246
pub fn freeze ( self ) -> Bytes {
247
- if self . kind ( ) == KIND_VEC {
247
+ let bytes = ManuallyDrop :: new ( self ) ;
248
+ if bytes. kind ( ) == KIND_VEC {
248
249
// Just re-use `Bytes` internal Vec vtable
249
250
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) ;
253
253
let mut b: Bytes = vec. into ( ) ;
254
254
b. advance ( off) ;
255
255
b
256
256
}
257
257
} else {
258
- debug_assert_eq ! ( self . kind( ) , KIND_ARC ) ;
258
+ debug_assert_eq ! ( bytes . kind( ) , KIND_ARC ) ;
259
259
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 ( ) ) ;
264
263
unsafe { Bytes :: with_vtable ( ptr, len, data, & SHARED_VTABLE ) }
265
264
}
266
265
}
@@ -829,11 +828,11 @@ impl BytesMut {
829
828
// internal change could make a simple pattern (`BytesMut::from(vec)`)
830
829
// suddenly a lot more expensive.
831
830
#[ 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) ;
833
833
let ptr = vptr ( vec. as_mut_ptr ( ) ) ;
834
834
let len = vec. len ( ) ;
835
835
let cap = vec. capacity ( ) ;
836
- mem:: forget ( vec) ;
837
836
838
837
let original_capacity_repr = original_capacity_to_repr ( cap) ;
839
838
let data = ( original_capacity_repr << ORIGINAL_CAPACITY_OFFSET ) | KIND_VEC ;
@@ -1616,6 +1615,7 @@ impl PartialEq<Bytes> for BytesMut {
1616
1615
impl From < BytesMut > for Vec < u8 > {
1617
1616
fn from ( bytes : BytesMut ) -> Self {
1618
1617
let kind = bytes. kind ( ) ;
1618
+ let bytes = ManuallyDrop :: new ( bytes) ;
1619
1619
1620
1620
let mut vec = if kind == KIND_VEC {
1621
1621
unsafe {
@@ -1632,7 +1632,7 @@ impl From<BytesMut> for Vec<u8> {
1632
1632
1633
1633
vec
1634
1634
} else {
1635
- return bytes. deref ( ) . to_vec ( ) ;
1635
+ return ManuallyDrop :: into_inner ( bytes) . deref ( ) . to_vec ( ) ;
1636
1636
}
1637
1637
} ;
1638
1638
@@ -1643,8 +1643,6 @@ impl From<BytesMut> for Vec<u8> {
1643
1643
vec. set_len ( len) ;
1644
1644
}
1645
1645
1646
- mem:: forget ( bytes) ;
1647
-
1648
1646
vec
1649
1647
}
1650
1648
}
0 commit comments