@@ -334,17 +334,11 @@ impl<T> Arc<T> {
334
334
/// ```
335
335
#[ unstable( feature = "new_uninit" , issue = "63291" ) ]
336
336
pub fn new_uninit ( ) -> Arc < mem:: MaybeUninit < T > > {
337
- let layout = Layout :: new :: < ArcInner < mem:: MaybeUninit < T > > > ( ) ;
338
337
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
+ ) )
348
342
}
349
343
}
350
344
@@ -424,24 +418,8 @@ impl<T> Arc<[T]> {
424
418
/// ```
425
419
#[ unstable( feature = "new_uninit" , issue = "63291" ) ]
426
420
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 ( ) ;
431
421
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) )
445
423
}
446
424
}
447
425
}
@@ -481,10 +459,7 @@ impl<T> Arc<mem::MaybeUninit<T>> {
481
459
#[ unstable( feature = "new_uninit" , issue = "63291" ) ]
482
460
#[ inline]
483
461
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 ( ) )
488
463
}
489
464
}
490
465
@@ -525,10 +500,7 @@ impl<T> Arc<[mem::MaybeUninit<T>]> {
525
500
#[ unstable( feature = "new_uninit" , issue = "63291" ) ]
526
501
#[ inline]
527
502
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 _ )
532
504
}
533
505
}
534
506
0 commit comments