@@ -334,17 +334,11 @@ impl<T> Arc<T> {
334334 /// ```
335335 #[ unstable( feature = "new_uninit" , issue = "63291" ) ]
336336 pub fn new_uninit ( ) -> Arc < mem:: MaybeUninit < T > > {
337- let layout = Layout :: new :: < ArcInner < mem:: MaybeUninit < T > > > ( ) ;
338337 unsafe {
339- let mut ptr = Global . alloc ( layout)
340- . unwrap_or_else ( |_| handle_alloc_error ( layout) )
341- . cast :: < ArcInner < mem:: MaybeUninit < T > > > ( ) ;
342- ptr:: write ( & mut ptr. as_mut ( ) . strong , atomic:: AtomicUsize :: new ( 1 ) ) ;
343- ptr:: write ( & mut ptr. as_mut ( ) . weak , atomic:: AtomicUsize :: new ( 1 ) ) ;
344- Arc {
345- ptr,
346- phantom : PhantomData ,
347- }
338+ Arc :: from_ptr ( Arc :: allocate_for_unsized (
339+ Layout :: new :: < T > ( ) ,
340+ |mem| mem as * mut ArcInner < mem:: MaybeUninit < T > > ,
341+ ) )
348342 }
349343 }
350344
@@ -424,24 +418,8 @@ impl<T> Arc<[T]> {
424418 /// ```
425419 #[ unstable( feature = "new_uninit" , issue = "63291" ) ]
426420 pub fn new_uninit_slice ( len : usize ) -> Arc < [ mem:: MaybeUninit < T > ] > {
427- let data_layout = Layout :: array :: < mem:: MaybeUninit < T > > ( len) . unwrap ( ) ;
428- // This relies on `value` being the last field of `RcBox` in memory,
429- // so that the layout of `RcBox<T>` is the same as that of `RcBox<()>` followed by `T`.
430- let ( layout, offset) = Layout :: new :: < ArcInner < ( ) > > ( ) . extend ( data_layout) . unwrap ( ) ;
431421 unsafe {
432- let allocated_ptr = Global . alloc ( layout)
433- . unwrap_or_else ( |_| handle_alloc_error ( layout) )
434- . as_ptr ( ) ;
435- let data_ptr = allocated_ptr. add ( offset) as * mut mem:: MaybeUninit < T > ;
436- let slice: * mut [ mem:: MaybeUninit < T > ] = from_raw_parts_mut ( data_ptr, len) ;
437- let wide_ptr = slice as * mut ArcInner < [ mem:: MaybeUninit < T > ] > ;
438- let wide_ptr = set_data_ptr ( wide_ptr, allocated_ptr) ;
439- ptr:: write ( & mut ( * wide_ptr) . strong , atomic:: AtomicUsize :: new ( 1 ) ) ;
440- ptr:: write ( & mut ( * wide_ptr) . weak , atomic:: AtomicUsize :: new ( 1 ) ) ;
441- Arc {
442- ptr : NonNull :: new_unchecked ( wide_ptr) ,
443- phantom : PhantomData ,
444- }
422+ Arc :: from_ptr ( Arc :: allocate_for_slice ( len) )
445423 }
446424 }
447425}
@@ -481,10 +459,7 @@ impl<T> Arc<mem::MaybeUninit<T>> {
481459 #[ unstable( feature = "new_uninit" , issue = "63291" ) ]
482460 #[ inline]
483461 pub unsafe fn assume_init ( self ) -> Arc < T > {
484- Arc {
485- ptr : mem:: ManuallyDrop :: new ( self ) . ptr . cast ( ) ,
486- phantom : PhantomData ,
487- }
462+ Arc :: from_inner ( mem:: ManuallyDrop :: new ( self ) . ptr . cast ( ) )
488463 }
489464}
490465
@@ -525,10 +500,7 @@ impl<T> Arc<[mem::MaybeUninit<T>]> {
525500 #[ unstable( feature = "new_uninit" , issue = "63291" ) ]
526501 #[ inline]
527502 pub unsafe fn assume_init ( self ) -> Arc < [ T ] > {
528- Arc {
529- ptr : NonNull :: new_unchecked ( mem:: ManuallyDrop :: new ( self ) . ptr . as_ptr ( ) as _ ) ,
530- phantom : PhantomData ,
531- }
503+ Arc :: from_ptr ( mem:: ManuallyDrop :: new ( self ) . ptr . as_ptr ( ) as _ )
532504 }
533505}
534506
0 commit comments