diff options
| author | marc0246 <40955683+marc0246@users.noreply.github.com> | 2023-05-16 08:53:05 +0200 |
|---|---|---|
| committer | marc0246 <40955683+marc0246@users.noreply.github.com> | 2023-05-16 08:53:05 +0200 |
| commit | 2a466466c768dc56382550a3130674b2eebe227c (patch) | |
| tree | 23dd55e2989c91026281f89a61e19cc9156cc7c8 /library | |
| parent | 8006510ab0f69ee75e9c3f7e8bff3776886dae51 (diff) | |
| download | rust-2a466466c768dc56382550a3130674b2eebe227c.tar.gz rust-2a466466c768dc56382550a3130674b2eebe227c.zip | |
Fix duplicate `arcinner_layout_for_value_layout` calls
Diffstat (limited to 'library')
| -rw-r--r-- | library/alloc/src/sync.rs | 25 |
1 files changed, 19 insertions, 6 deletions
diff --git a/library/alloc/src/sync.rs b/library/alloc/src/sync.rs index 7347980abbc..bfdb7a92bef 100644 --- a/library/alloc/src/sync.rs +++ b/library/alloc/src/sync.rs @@ -502,6 +502,7 @@ impl<T> Arc<T> { /// assert_eq!(*five, 5) /// ``` #[cfg(not(no_global_oom_handling))] + #[inline] #[unstable(feature = "new_uninit", issue = "63291")] #[must_use] pub fn new_uninit() -> Arc<mem::MaybeUninit<T>> { @@ -535,6 +536,7 @@ impl<T> Arc<T> { /// /// [zeroed]: mem::MaybeUninit::zeroed #[cfg(not(no_global_oom_handling))] + #[inline] #[unstable(feature = "new_uninit", issue = "63291")] #[must_use] pub fn new_zeroed() -> Arc<mem::MaybeUninit<T>> { @@ -844,6 +846,7 @@ impl<T> Arc<[T]> { /// assert_eq!(*values, [1, 2, 3]) /// ``` #[cfg(not(no_global_oom_handling))] + #[inline] #[unstable(feature = "new_uninit", issue = "63291")] #[must_use] pub fn new_uninit_slice(len: usize) -> Arc<[mem::MaybeUninit<T>]> { @@ -871,6 +874,7 @@ impl<T> Arc<[T]> { /// /// [zeroed]: mem::MaybeUninit::zeroed #[cfg(not(no_global_oom_handling))] + #[inline] #[unstable(feature = "new_uninit", issue = "63291")] #[must_use] pub fn new_zeroed_slice(len: usize) -> Arc<[mem::MaybeUninit<T>]> { @@ -1300,10 +1304,10 @@ impl<T: ?Sized> Arc<T> { mem_to_arcinner: impl FnOnce(*mut u8) -> *mut ArcInner<T>, ) -> *mut ArcInner<T> { let layout = arcinner_layout_for_value_layout(value_layout); - unsafe { - Arc::try_allocate_for_layout(value_layout, allocate, mem_to_arcinner) - .unwrap_or_else(|_| handle_alloc_error(layout)) - } + + let ptr = allocate(layout).unwrap_or_else(|_| handle_alloc_error(layout)); + + unsafe { Self::initialize_arcinner(ptr, layout, mem_to_arcinner) } } /// Allocates an `ArcInner<T>` with sufficient space for @@ -1321,7 +1325,16 @@ impl<T: ?Sized> Arc<T> { let ptr = allocate(layout)?; - // Initialize the ArcInner + let inner = unsafe { Self::initialize_arcinner(ptr, layout, mem_to_arcinner) }; + + Ok(inner) + } + + unsafe fn initialize_arcinner( + ptr: NonNull<[u8]>, + layout: Layout, + mem_to_arcinner: impl FnOnce(*mut u8) -> *mut ArcInner<T>, + ) -> *mut ArcInner<T> { let inner = mem_to_arcinner(ptr.as_non_null_ptr().as_ptr()); debug_assert_eq!(unsafe { Layout::for_value(&*inner) }, layout); @@ -1330,7 +1343,7 @@ impl<T: ?Sized> Arc<T> { ptr::write(&mut (*inner).weak, atomic::AtomicUsize::new(1)); } - Ok(inner) + inner } /// Allocates an `ArcInner<T>` with sufficient space for an unsized inner value. |
