@@ -206,6 +206,19 @@ impl<T: ?Sized + Unsize<U>, U: ?Sized> CoerceUnsized<Arc<U>> for Arc<T> {}
206
206
#[ unstable( feature = "dispatch_from_dyn" , issue = "0" ) ]
207
207
impl < T : ?Sized + Unsize < U > , U : ?Sized > DispatchFromDyn < Arc < U > > for Arc < T > { }
208
208
209
+ impl < T : ?Sized > Arc < T > {
210
+ fn from_inner ( ptr : NonNull < ArcInner < T > > ) -> Self {
211
+ Self {
212
+ ptr,
213
+ phantom : PhantomData ,
214
+ }
215
+ }
216
+
217
+ unsafe fn from_ptr ( ptr : * mut ArcInner < T > ) -> Self {
218
+ Self :: from_inner ( NonNull :: new_unchecked ( ptr) )
219
+ }
220
+ }
221
+
209
222
/// `Weak` is a version of [`Arc`] that holds a non-owning reference to the
210
223
/// managed value. The value is accessed by calling [`upgrade`] on the `Weak`
211
224
/// pointer, which returns an [`Option`]`<`[`Arc`]`<T>>`.
@@ -290,7 +303,7 @@ impl<T> Arc<T> {
290
303
weak : atomic:: AtomicUsize :: new ( 1 ) ,
291
304
data,
292
305
} ;
293
- Arc { ptr : Box :: into_raw_non_null ( x) , phantom : PhantomData }
306
+ Self :: from_inner ( Box :: into_raw_non_null ( x) )
294
307
}
295
308
296
309
/// Constructs a new `Pin<Arc<T>>`. If `T` does not implement `Unpin`, then
@@ -403,10 +416,7 @@ impl<T: ?Sized> Arc<T> {
403
416
let fake_ptr = ptr as * mut ArcInner < T > ;
404
417
let arc_ptr = set_data_ptr ( fake_ptr, ( ptr as * mut u8 ) . offset ( -offset) ) ;
405
418
406
- Arc {
407
- ptr : NonNull :: new_unchecked ( arc_ptr) ,
408
- phantom : PhantomData ,
409
- }
419
+ Self :: from_ptr ( arc_ptr)
410
420
}
411
421
412
422
/// Consumes the `Arc`, returning the wrapped pointer as `NonNull<T>`.
@@ -617,7 +627,7 @@ impl<T: ?Sized> Arc<T> {
617
627
// Free the allocation without dropping its contents
618
628
box_free ( box_unique) ;
619
629
620
- Arc { ptr : NonNull :: new_unchecked ( ptr) , phantom : PhantomData }
630
+ Self :: from_ptr ( ptr)
621
631
}
622
632
}
623
633
}
@@ -644,7 +654,7 @@ impl<T> Arc<[T]> {
644
654
& mut ( * ptr) . data as * mut [ T ] as * mut T ,
645
655
v. len ( ) ) ;
646
656
647
- Arc { ptr : NonNull :: new_unchecked ( ptr) , phantom : PhantomData }
657
+ Self :: from_ptr ( ptr)
648
658
}
649
659
}
650
660
@@ -702,7 +712,7 @@ impl<T: Clone> ArcFromSlice<T> for Arc<[T]> {
702
712
// All clear. Forget the guard so it doesn't free the new ArcInner.
703
713
mem:: forget ( guard) ;
704
714
705
- Arc { ptr : NonNull :: new_unchecked ( ptr) , phantom : PhantomData }
715
+ Self :: from_ptr ( ptr)
706
716
}
707
717
}
708
718
}
@@ -760,7 +770,7 @@ impl<T: ?Sized> Clone for Arc<T> {
760
770
}
761
771
}
762
772
763
- Arc { ptr : self . ptr , phantom : PhantomData }
773
+ Self :: from_inner ( self . ptr )
764
774
}
765
775
}
766
776
@@ -1039,7 +1049,7 @@ impl Arc<dyn Any + Send + Sync> {
1039
1049
if ( * self ) . is :: < T > ( ) {
1040
1050
let ptr = self . ptr . cast :: < ArcInner < T > > ( ) ;
1041
1051
mem:: forget ( self ) ;
1042
- Ok ( Arc { ptr , phantom : PhantomData } )
1052
+ Ok ( Arc :: from_inner ( ptr ) )
1043
1053
} else {
1044
1054
Err ( self )
1045
1055
}
@@ -1260,11 +1270,7 @@ impl<T: ?Sized> Weak<T> {
1260
1270
1261
1271
// Relaxed is valid for the same reason it is on Arc's Clone impl
1262
1272
match inner. strong . compare_exchange_weak ( n, n + 1 , Relaxed , Relaxed ) {
1263
- Ok ( _) => return Some ( Arc {
1264
- // null checked above
1265
- ptr : self . ptr ,
1266
- phantom : PhantomData ,
1267
- } ) ,
1273
+ Ok ( _) => return Some ( Arc :: from_inner ( self . ptr ) ) , // null checked above
1268
1274
Err ( old) => n = old,
1269
1275
}
1270
1276
}
0 commit comments