@@ -502,6 +502,7 @@ impl<T> Arc<T> {
502
502
/// assert_eq!(*five, 5)
503
503
/// ```
504
504
#[ cfg( not( no_global_oom_handling) ) ]
505
+ #[ inline]
505
506
#[ unstable( feature = "new_uninit" , issue = "63291" ) ]
506
507
#[ must_use]
507
508
pub fn new_uninit ( ) -> Arc < mem:: MaybeUninit < T > > {
@@ -535,6 +536,7 @@ impl<T> Arc<T> {
535
536
///
536
537
/// [zeroed]: mem::MaybeUninit::zeroed
537
538
#[ cfg( not( no_global_oom_handling) ) ]
539
+ #[ inline]
538
540
#[ unstable( feature = "new_uninit" , issue = "63291" ) ]
539
541
#[ must_use]
540
542
pub fn new_zeroed ( ) -> Arc < mem:: MaybeUninit < T > > {
@@ -844,6 +846,7 @@ impl<T> Arc<[T]> {
844
846
/// assert_eq!(*values, [1, 2, 3])
845
847
/// ```
846
848
#[ cfg( not( no_global_oom_handling) ) ]
849
+ #[ inline]
847
850
#[ unstable( feature = "new_uninit" , issue = "63291" ) ]
848
851
#[ must_use]
849
852
pub fn new_uninit_slice ( len : usize ) -> Arc < [ mem:: MaybeUninit < T > ] > {
@@ -871,6 +874,7 @@ impl<T> Arc<[T]> {
871
874
///
872
875
/// [zeroed]: mem::MaybeUninit::zeroed
873
876
#[ cfg( not( no_global_oom_handling) ) ]
877
+ #[ inline]
874
878
#[ unstable( feature = "new_uninit" , issue = "63291" ) ]
875
879
#[ must_use]
876
880
pub fn new_zeroed_slice ( len : usize ) -> Arc < [ mem:: MaybeUninit < T > ] > {
@@ -1300,10 +1304,10 @@ impl<T: ?Sized> Arc<T> {
1300
1304
mem_to_arcinner : impl FnOnce ( * mut u8 ) -> * mut ArcInner < T > ,
1301
1305
) -> * mut ArcInner < T > {
1302
1306
let layout = arcinner_layout_for_value_layout ( value_layout) ;
1303
- unsafe {
1304
- Arc :: try_allocate_for_layout ( value_layout , allocate , mem_to_arcinner )
1305
- . unwrap_or_else ( |_| handle_alloc_error ( layout ) )
1306
- }
1307
+
1308
+ let ptr = allocate ( layout ) . unwrap_or_else ( |_| handle_alloc_error ( layout ) ) ;
1309
+
1310
+ unsafe { Self :: initialize_arcinner ( ptr , layout , mem_to_arcinner ) }
1307
1311
}
1308
1312
1309
1313
/// Allocates an `ArcInner<T>` with sufficient space for
@@ -1321,7 +1325,16 @@ impl<T: ?Sized> Arc<T> {
1321
1325
1322
1326
let ptr = allocate ( layout) ?;
1323
1327
1324
- // Initialize the ArcInner
1328
+ let inner = unsafe { Self :: initialize_arcinner ( ptr, layout, mem_to_arcinner) } ;
1329
+
1330
+ Ok ( inner)
1331
+ }
1332
+
1333
+ unsafe fn initialize_arcinner (
1334
+ ptr : NonNull < [ u8 ] > ,
1335
+ layout : Layout ,
1336
+ mem_to_arcinner : impl FnOnce ( * mut u8 ) -> * mut ArcInner < T > ,
1337
+ ) -> * mut ArcInner < T > {
1325
1338
let inner = mem_to_arcinner ( ptr. as_non_null_ptr ( ) . as_ptr ( ) ) ;
1326
1339
debug_assert_eq ! ( unsafe { Layout :: for_value( & * inner) } , layout) ;
1327
1340
@@ -1330,7 +1343,7 @@ impl<T: ?Sized> Arc<T> {
1330
1343
ptr:: write ( & mut ( * inner) . weak , atomic:: AtomicUsize :: new ( 1 ) ) ;
1331
1344
}
1332
1345
1333
- Ok ( inner)
1346
+ inner
1334
1347
}
1335
1348
1336
1349
/// Allocates an `ArcInner<T>` with sufficient space for an unsized inner value.
0 commit comments