@@ -110,8 +110,8 @@ pub(crate) struct Vtable {
110
110
pub clone : unsafe fn ( & AtomicPtr < ( ) > , * const u8 , usize ) -> Bytes ,
111
111
/// fn(data, ptr, len)
112
112
///
113
- /// takes `Bytes` to value
114
- pub to_vec : unsafe fn ( & AtomicPtr < ( ) > , * const u8 , usize ) -> Vec < u8 > ,
113
+ /// Consumes `Bytes` to return `Vec<u8>`
114
+ pub into_vec : unsafe fn ( & mut AtomicPtr < ( ) > , * const u8 , usize ) -> Vec < u8 > ,
115
115
/// fn(data, ptr, len)
116
116
pub drop : unsafe fn ( & mut AtomicPtr < ( ) > , * const u8 , usize ) ,
117
117
}
@@ -851,8 +851,8 @@ impl From<String> for Bytes {
851
851
852
852
impl From < Bytes > for Vec < u8 > {
853
853
fn from ( bytes : Bytes ) -> Vec < u8 > {
854
- let bytes = mem:: ManuallyDrop :: new ( bytes) ;
855
- unsafe { ( bytes. vtable . to_vec ) ( & bytes. data , bytes. ptr , bytes. len ) }
854
+ let bytes = & mut * mem:: ManuallyDrop :: new ( bytes) ;
855
+ unsafe { ( bytes. vtable . into_vec ) ( & mut bytes. data , bytes. ptr , bytes. len ) }
856
856
}
857
857
}
858
858
@@ -862,6 +862,7 @@ impl fmt::Debug for Vtable {
862
862
fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
863
863
f. debug_struct ( "Vtable" )
864
864
. field ( "clone" , & ( self . clone as * const ( ) ) )
865
+ . field ( "into_vec" , & ( self . into_vec as * const ( ) ) )
865
866
. field ( "drop" , & ( self . drop as * const ( ) ) )
866
867
. finish ( )
867
868
}
@@ -871,7 +872,7 @@ impl fmt::Debug for Vtable {
871
872
872
873
const STATIC_VTABLE : Vtable = Vtable {
873
874
clone : static_clone,
874
- to_vec : static_to_vec ,
875
+ into_vec : static_into_vec ,
875
876
drop : static_drop,
876
877
} ;
877
878
@@ -880,7 +881,7 @@ unsafe fn static_clone(_: &AtomicPtr<()>, ptr: *const u8, len: usize) -> Bytes {
880
881
Bytes :: from_static ( slice)
881
882
}
882
883
883
- unsafe fn static_to_vec ( _: & AtomicPtr < ( ) > , ptr : * const u8 , len : usize ) -> Vec < u8 > {
884
+ unsafe fn static_into_vec ( _: & mut AtomicPtr < ( ) > , ptr : * const u8 , len : usize ) -> Vec < u8 > {
884
885
let slice = slice:: from_raw_parts ( ptr, len) ;
885
886
slice. to_vec ( )
886
887
}
@@ -893,13 +894,13 @@ unsafe fn static_drop(_: &mut AtomicPtr<()>, _: *const u8, _: usize) {
893
894
894
895
static PROMOTABLE_EVEN_VTABLE : Vtable = Vtable {
895
896
clone : promotable_even_clone,
896
- to_vec : promotable_even_to_vec ,
897
+ into_vec : promotable_even_into_vec ,
897
898
drop : promotable_even_drop,
898
899
} ;
899
900
900
901
static PROMOTABLE_ODD_VTABLE : Vtable = Vtable {
901
902
clone : promotable_odd_clone,
902
- to_vec : promotable_odd_to_vec ,
903
+ into_vec : promotable_odd_into_vec ,
903
904
drop : promotable_odd_drop,
904
905
} ;
905
906
@@ -916,17 +917,17 @@ unsafe fn promotable_even_clone(data: &AtomicPtr<()>, ptr: *const u8, len: usize
916
917
}
917
918
}
918
919
919
- unsafe fn promotable_to_vec (
920
- data : & AtomicPtr < ( ) > ,
920
+ unsafe fn promotable_into_vec (
921
+ data : & mut AtomicPtr < ( ) > ,
921
922
ptr : * const u8 ,
922
923
len : usize ,
923
924
f : fn ( * mut ( ) ) -> * mut u8 ,
924
925
) -> Vec < u8 > {
925
- let shared = data. load ( Ordering :: Acquire ) ;
926
+ let shared = data. with_mut ( |p| * p ) ;
926
927
let kind = shared as usize & KIND_MASK ;
927
928
928
929
if kind == KIND_ARC {
929
- shared_to_vec_impl ( shared. cast ( ) , ptr, len)
930
+ shared_into_vec_impl ( shared. cast ( ) , ptr, len)
930
931
} else {
931
932
// If Bytes holds a Vec, then the offset must be 0.
932
933
debug_assert_eq ! ( kind, KIND_VEC ) ;
@@ -942,8 +943,12 @@ unsafe fn promotable_to_vec(
942
943
}
943
944
}
944
945
945
- unsafe fn promotable_even_to_vec ( data : & AtomicPtr < ( ) > , ptr : * const u8 , len : usize ) -> Vec < u8 > {
946
- promotable_to_vec ( data, ptr, len, |shared| {
946
+ unsafe fn promotable_even_into_vec (
947
+ data : & mut AtomicPtr < ( ) > ,
948
+ ptr : * const u8 ,
949
+ len : usize ,
950
+ ) -> Vec < u8 > {
951
+ promotable_into_vec ( data, ptr, len, |shared| {
947
952
ptr_map ( shared. cast ( ) , |addr| addr & !KIND_MASK )
948
953
} )
949
954
}
@@ -975,8 +980,8 @@ unsafe fn promotable_odd_clone(data: &AtomicPtr<()>, ptr: *const u8, len: usize)
975
980
}
976
981
}
977
982
978
- unsafe fn promotable_odd_to_vec ( data : & AtomicPtr < ( ) > , ptr : * const u8 , len : usize ) -> Vec < u8 > {
979
- promotable_to_vec ( data, ptr, len, |shared| shared. cast ( ) )
983
+ unsafe fn promotable_odd_into_vec ( data : & mut AtomicPtr < ( ) > , ptr : * const u8 , len : usize ) -> Vec < u8 > {
984
+ promotable_into_vec ( data, ptr, len, |shared| shared. cast ( ) )
980
985
}
981
986
982
987
unsafe fn promotable_odd_drop ( data : & mut AtomicPtr < ( ) > , ptr : * const u8 , len : usize ) {
@@ -1022,7 +1027,7 @@ const _: [(); 0 - mem::align_of::<Shared>() % 2] = []; // Assert that the alignm
1022
1027
1023
1028
static SHARED_VTABLE : Vtable = Vtable {
1024
1029
clone : shared_clone,
1025
- to_vec : shared_to_vec ,
1030
+ into_vec : shared_into_vec ,
1026
1031
drop : shared_drop,
1027
1032
} ;
1028
1033
@@ -1035,7 +1040,7 @@ unsafe fn shared_clone(data: &AtomicPtr<()>, ptr: *const u8, len: usize) -> Byte
1035
1040
shallow_clone_arc ( shared as _ , ptr, len)
1036
1041
}
1037
1042
1038
- unsafe fn shared_to_vec_impl ( shared : * mut Shared , ptr : * const u8 , len : usize ) -> Vec < u8 > {
1043
+ unsafe fn shared_into_vec_impl ( shared : * mut Shared , ptr : * const u8 , len : usize ) -> Vec < u8 > {
1039
1044
// Check that the ref_cnt is 1 (unique).
1040
1045
//
1041
1046
// If it is unique, then it is set to 0 with AcqRel fence for the same
@@ -1064,8 +1069,8 @@ unsafe fn shared_to_vec_impl(shared: *mut Shared, ptr: *const u8, len: usize) ->
1064
1069
}
1065
1070
}
1066
1071
1067
- unsafe fn shared_to_vec ( data : & AtomicPtr < ( ) > , ptr : * const u8 , len : usize ) -> Vec < u8 > {
1068
- shared_to_vec_impl ( data. load ( Ordering :: Relaxed ) . cast ( ) , ptr, len)
1072
+ unsafe fn shared_into_vec ( data : & mut AtomicPtr < ( ) > , ptr : * const u8 , len : usize ) -> Vec < u8 > {
1073
+ shared_into_vec_impl ( ( data. with_mut ( |p| * p ) ) . cast ( ) , ptr, len)
1069
1074
}
1070
1075
1071
1076
unsafe fn shared_drop ( data : & mut AtomicPtr < ( ) > , _ptr : * const u8 , _len : usize ) {
0 commit comments