@@ -232,7 +232,7 @@ impl<T: ?Sized> Arc<T> {
232
232
}
233
233
234
234
unsafe fn from_ptr ( ptr : * mut ArcInner < T > ) -> Self {
235
- Self :: from_inner ( NonNull :: new_unchecked ( ptr) )
235
+ unsafe { Self :: from_inner ( NonNull :: new_unchecked ( ptr) ) }
236
236
}
237
237
}
238
238
@@ -543,7 +543,7 @@ impl<T> Arc<[mem::MaybeUninit<T>]> {
543
543
#[ unstable( feature = "new_uninit" , issue = "63291" ) ]
544
544
#[ inline]
545
545
pub unsafe fn assume_init ( self ) -> Arc < [ T ] > {
546
- Arc :: from_ptr ( mem:: ManuallyDrop :: new ( self ) . ptr . as_ptr ( ) as _ )
546
+ unsafe { Arc :: from_ptr ( mem:: ManuallyDrop :: new ( self ) . ptr . as_ptr ( ) as _ ) }
547
547
}
548
548
}
549
549
@@ -642,13 +642,15 @@ impl<T: ?Sized> Arc<T> {
642
642
/// ```
643
643
#[ stable( feature = "rc_raw" , since = "1.17.0" ) ]
644
644
pub unsafe fn from_raw ( ptr : * const T ) -> Self {
645
- let offset = data_offset ( ptr) ;
645
+ unsafe {
646
+ let offset = data_offset ( ptr) ;
646
647
647
- // Reverse the offset to find the original ArcInner.
648
- let fake_ptr = ptr as * mut ArcInner < T > ;
649
- let arc_ptr = set_data_ptr ( fake_ptr, ( ptr as * mut u8 ) . offset ( -offset) ) ;
648
+ // Reverse the offset to find the original ArcInner.
649
+ let fake_ptr = ptr as * mut ArcInner < T > ;
650
+ let arc_ptr = set_data_ptr ( fake_ptr, ( ptr as * mut u8 ) . offset ( -offset) ) ;
650
651
651
- Self :: from_ptr ( arc_ptr)
652
+ Self :: from_ptr ( arc_ptr)
653
+ }
652
654
}
653
655
654
656
/// Consumes the `Arc`, returning the wrapped pointer as `NonNull<T>`.
@@ -807,7 +809,7 @@ impl<T: ?Sized> Arc<T> {
807
809
#[ unstable( feature = "arc_mutate_strong_count" , issue = "71983" ) ]
808
810
pub unsafe fn incr_strong_count ( ptr : * const T ) {
809
811
// Retain Arc, but don't touch refcount by wrapping in ManuallyDrop
810
- let arc = mem:: ManuallyDrop :: new ( Arc :: < T > :: from_raw ( ptr) ) ;
812
+ let arc = unsafe { mem:: ManuallyDrop :: new ( Arc :: < T > :: from_raw ( ptr) ) } ;
811
813
// Now increase refcount, but don't drop new refcount either
812
814
let _arc_clone: mem:: ManuallyDrop < _ > = arc. clone ( ) ;
813
815
}
@@ -847,7 +849,7 @@ impl<T: ?Sized> Arc<T> {
847
849
#[ inline]
848
850
#[ unstable( feature = "arc_mutate_strong_count" , issue = "71983" ) ]
849
851
pub unsafe fn decr_strong_count ( ptr : * const T ) {
850
- mem:: drop ( Arc :: from_raw ( ptr) ) ;
852
+ unsafe { mem:: drop ( Arc :: from_raw ( ptr) ) } ;
851
853
}
852
854
853
855
#[ inline]
@@ -865,7 +867,7 @@ impl<T: ?Sized> Arc<T> {
865
867
unsafe fn drop_slow ( & mut self ) {
866
868
// Destroy the data at this time, even though we may not free the box
867
869
// allocation itself (there may still be weak pointers lying around).
868
- ptr:: drop_in_place ( Self :: get_mut_unchecked ( self ) ) ;
870
+ unsafe { ptr:: drop_in_place ( Self :: get_mut_unchecked ( self ) ) } ;
869
871
870
872
// Drop the weak ref collectively held by all strong references
871
873
drop ( Weak { ptr : self . ptr } ) ;
@@ -917,20 +919,24 @@ impl<T: ?Sized> Arc<T> {
917
919
918
920
// Initialize the ArcInner
919
921
let inner = mem_to_arcinner ( mem. ptr . as_ptr ( ) ) ;
920
- debug_assert_eq ! ( Layout :: for_value( & * inner) , layout) ;
922
+ debug_assert_eq ! ( unsafe { Layout :: for_value( & * inner) } , layout) ;
921
923
922
- ptr:: write ( & mut ( * inner) . strong , atomic:: AtomicUsize :: new ( 1 ) ) ;
923
- ptr:: write ( & mut ( * inner) . weak , atomic:: AtomicUsize :: new ( 1 ) ) ;
924
+ unsafe {
925
+ ptr:: write ( & mut ( * inner) . strong , atomic:: AtomicUsize :: new ( 1 ) ) ;
926
+ ptr:: write ( & mut ( * inner) . weak , atomic:: AtomicUsize :: new ( 1 ) ) ;
927
+ }
924
928
925
929
inner
926
930
}
927
931
928
932
/// Allocates an `ArcInner<T>` with sufficient space for an unsized inner value.
929
933
unsafe fn allocate_for_ptr ( ptr : * const T ) -> * mut ArcInner < T > {
930
934
// Allocate for the `ArcInner<T>` using the given value.
931
- Self :: allocate_for_layout ( Layout :: for_value ( & * ptr) , |mem| {
932
- set_data_ptr ( ptr as * mut T , mem) as * mut ArcInner < T >
933
- } )
935
+ unsafe {
936
+ Self :: allocate_for_layout ( Layout :: for_value ( & * ptr) , |mem| {
937
+ set_data_ptr ( ptr as * mut T , mem) as * mut ArcInner < T >
938
+ } )
939
+ }
934
940
}
935
941
936
942
fn from_box ( v : Box < T > ) -> Arc < T > {
@@ -959,9 +965,11 @@ impl<T: ?Sized> Arc<T> {
959
965
impl < T > Arc < [ T ] > {
960
966
/// Allocates an `ArcInner<[T]>` with the given length.
961
967
unsafe fn allocate_for_slice ( len : usize ) -> * mut ArcInner < [ T ] > {
962
- Self :: allocate_for_layout ( Layout :: array :: < T > ( len) . unwrap ( ) , |mem| {
963
- ptr:: slice_from_raw_parts_mut ( mem as * mut T , len) as * mut ArcInner < [ T ] >
964
- } )
968
+ unsafe {
969
+ Self :: allocate_for_layout ( Layout :: array :: < T > ( len) . unwrap ( ) , |mem| {
970
+ ptr:: slice_from_raw_parts_mut ( mem as * mut T , len) as * mut ArcInner < [ T ] >
971
+ } )
972
+ }
965
973
}
966
974
}
967
975
@@ -970,7 +978,9 @@ impl<T> Arc<[T]> {
970
978
/// For a slice/trait object, this sets the `data` field and leaves the rest
971
979
/// unchanged. For a sized raw pointer, this simply sets the pointer.
972
980
unsafe fn set_data_ptr < T : ?Sized , U > ( mut ptr : * mut T , data : * mut U ) -> * mut T {
973
- ptr:: write ( & mut ptr as * mut _ as * mut * mut u8 , data as * mut u8 ) ;
981
+ unsafe {
982
+ ptr:: write ( & mut ptr as * mut _ as * mut * mut u8 , data as * mut u8 ) ;
983
+ }
974
984
ptr
975
985
}
976
986
@@ -979,11 +989,13 @@ impl<T> Arc<[T]> {
979
989
///
980
990
/// Unsafe because the caller must either take ownership or bind `T: Copy`.
981
991
unsafe fn copy_from_slice ( v : & [ T ] ) -> Arc < [ T ] > {
982
- let ptr = Self :: allocate_for_slice ( v. len ( ) ) ;
992
+ unsafe {
993
+ let ptr = Self :: allocate_for_slice ( v. len ( ) ) ;
983
994
984
- ptr:: copy_nonoverlapping ( v. as_ptr ( ) , & mut ( * ptr) . data as * mut [ T ] as * mut T , v. len ( ) ) ;
995
+ ptr:: copy_nonoverlapping ( v. as_ptr ( ) , & mut ( * ptr) . data as * mut [ T ] as * mut T , v. len ( ) ) ;
985
996
986
- Self :: from_ptr ( ptr)
997
+ Self :: from_ptr ( ptr)
998
+ }
987
999
}
988
1000
989
1001
/// Constructs an `Arc<[T]>` from an iterator known to be of a certain size.
@@ -1011,25 +1023,27 @@ impl<T> Arc<[T]> {
1011
1023
}
1012
1024
}
1013
1025
1014
- let ptr = Self :: allocate_for_slice ( len) ;
1026
+ unsafe {
1027
+ let ptr = Self :: allocate_for_slice ( len) ;
1015
1028
1016
- let mem = ptr as * mut _ as * mut u8 ;
1017
- let layout = Layout :: for_value ( & * ptr) ;
1029
+ let mem = ptr as * mut _ as * mut u8 ;
1030
+ let layout = Layout :: for_value ( & * ptr) ;
1018
1031
1019
- // Pointer to first element
1020
- let elems = & mut ( * ptr) . data as * mut [ T ] as * mut T ;
1032
+ // Pointer to first element
1033
+ let elems = & mut ( * ptr) . data as * mut [ T ] as * mut T ;
1021
1034
1022
- let mut guard = Guard { mem : NonNull :: new_unchecked ( mem) , elems, layout, n_elems : 0 } ;
1035
+ let mut guard = Guard { mem : NonNull :: new_unchecked ( mem) , elems, layout, n_elems : 0 } ;
1023
1036
1024
- for ( i, item) in iter. enumerate ( ) {
1025
- ptr:: write ( elems. add ( i) , item) ;
1026
- guard. n_elems += 1 ;
1027
- }
1037
+ for ( i, item) in iter. enumerate ( ) {
1038
+ ptr:: write ( elems. add ( i) , item) ;
1039
+ guard. n_elems += 1 ;
1040
+ }
1028
1041
1029
- // All clear. Forget the guard so it doesn't free the new ArcInner.
1030
- mem:: forget ( guard) ;
1042
+ // All clear. Forget the guard so it doesn't free the new ArcInner.
1043
+ mem:: forget ( guard) ;
1031
1044
1032
- Self :: from_ptr ( ptr)
1045
+ Self :: from_ptr ( ptr)
1046
+ }
1033
1047
}
1034
1048
}
1035
1049
@@ -1274,7 +1288,7 @@ impl<T: ?Sized> Arc<T> {
1274
1288
pub unsafe fn get_mut_unchecked ( this : & mut Self ) -> & mut T {
1275
1289
// We are careful to *not* create a reference covering the "count" fields, as
1276
1290
// this would alias with concurrent access to the reference counts (e.g. by `Weak`).
1277
- & mut ( * this. ptr . as_ptr ( ) ) . data
1291
+ unsafe { & mut ( * this. ptr . as_ptr ( ) ) . data }
1278
1292
}
1279
1293
1280
1294
/// Determine whether this is the unique reference (including weak refs) to
@@ -1551,10 +1565,12 @@ impl<T> Weak<T> {
1551
1565
Self :: new ( )
1552
1566
} else {
1553
1567
// See Arc::from_raw for details
1554
- let offset = data_offset ( ptr) ;
1555
- let fake_ptr = ptr as * mut ArcInner < T > ;
1556
- let ptr = set_data_ptr ( fake_ptr, ( ptr as * mut u8 ) . offset ( -offset) ) ;
1557
- Weak { ptr : NonNull :: new ( ptr) . expect ( "Invalid pointer passed to from_raw" ) }
1568
+ unsafe {
1569
+ let offset = data_offset ( ptr) ;
1570
+ let fake_ptr = ptr as * mut ArcInner < T > ;
1571
+ let ptr = set_data_ptr ( fake_ptr, ( ptr as * mut u8 ) . offset ( -offset) ) ;
1572
+ Weak { ptr : NonNull :: new ( ptr) . expect ( "Invalid pointer passed to from_raw" ) }
1573
+ }
1558
1574
}
1559
1575
}
1560
1576
}
@@ -2260,7 +2276,7 @@ unsafe fn data_offset<T: ?Sized>(ptr: *const T) -> isize {
2260
2276
// Because it is `?Sized`, it will always be the last field in memory.
2261
2277
// Note: This is a detail of the current implementation of the compiler,
2262
2278
// and is not a guaranteed language detail. Do not rely on it outside of std.
2263
- data_offset_align ( align_of_val ( & * ptr) )
2279
+ unsafe { data_offset_align ( align_of_val ( & * ptr) ) }
2264
2280
}
2265
2281
2266
2282
/// Computes the offset of the data field within `ArcInner`.
0 commit comments