From 810dfd7cd451c370d0c47d6aa9e62b16292a29e0 Mon Sep 17 00:00:00 2001 From: Simon Sapin Date: Fri, 16 Aug 2019 17:44:24 +0200 Subject: Reuse more internal Rc and Arc methods --- src/liballoc/rc.rs | 42 +++++++----------------------------------- src/liballoc/sync.rs | 42 +++++++----------------------------------- 2 files changed, 14 insertions(+), 70 deletions(-) (limited to 'src/liballoc') diff --git a/src/liballoc/rc.rs b/src/liballoc/rc.rs index 9d608c886b8..abb09684260 100644 --- a/src/liballoc/rc.rs +++ b/src/liballoc/rc.rs @@ -350,17 +350,11 @@ impl Rc { /// ``` #[unstable(feature = "new_uninit", issue = "63291")] pub fn new_uninit() -> Rc> { - let layout = Layout::new::>>(); unsafe { - let mut ptr = Global.alloc(layout) - .unwrap_or_else(|_| handle_alloc_error(layout)) - .cast::>>(); - ptr::write(&mut ptr.as_mut().strong, Cell::new(1)); - ptr::write(&mut ptr.as_mut().weak, Cell::new(1)); - Rc { - ptr, - phantom: PhantomData, - } + Rc::from_ptr(Rc::allocate_for_unsized( + Layout::new::(), + |mem| mem as *mut RcBox>, + )) } } @@ -440,24 +434,8 @@ impl Rc<[T]> { /// ``` #[unstable(feature = "new_uninit", issue = "63291")] pub fn new_uninit_slice(len: usize) -> Rc<[mem::MaybeUninit]> { - let data_layout = Layout::array::>(len).unwrap(); - // This relies on `value` being the last field of `RcBox` in memory, - // so that the layout of `RcBox` is the same as that of `RcBox<()>` followed by `T`. - let (layout, offset) = Layout::new::>().extend(data_layout).unwrap(); unsafe { - let allocated_ptr = Global.alloc(layout) - .unwrap_or_else(|_| handle_alloc_error(layout)) - .as_ptr(); - let data_ptr = allocated_ptr.add(offset) as *mut mem::MaybeUninit; - let slice: *mut [mem::MaybeUninit] = from_raw_parts_mut(data_ptr, len); - let wide_ptr = slice as *mut RcBox<[mem::MaybeUninit]>; - let wide_ptr = set_data_ptr(wide_ptr, allocated_ptr); - ptr::write(&mut (*wide_ptr).strong, Cell::new(1)); - ptr::write(&mut (*wide_ptr).weak, Cell::new(1)); - Rc { - ptr: NonNull::new_unchecked(wide_ptr), - phantom: PhantomData, - } + Rc::from_ptr(Rc::allocate_for_slice(len)) } } } @@ -497,10 +475,7 @@ impl Rc> { #[unstable(feature = "new_uninit", issue = "63291")] #[inline] pub unsafe fn assume_init(self) -> Rc { - Rc { - ptr: mem::ManuallyDrop::new(self).ptr.cast(), - phantom: PhantomData, - } + Rc::from_inner(mem::ManuallyDrop::new(self).ptr.cast()) } } @@ -541,10 +516,7 @@ impl Rc<[mem::MaybeUninit]> { #[unstable(feature = "new_uninit", issue = "63291")] #[inline] pub unsafe fn assume_init(self) -> Rc<[T]> { - Rc { - ptr: NonNull::new_unchecked(mem::ManuallyDrop::new(self).ptr.as_ptr() as _), - phantom: PhantomData, - } + Rc::from_ptr(mem::ManuallyDrop::new(self).ptr.as_ptr() as _) } } diff --git a/src/liballoc/sync.rs b/src/liballoc/sync.rs index 1bd177be0d5..bb4d1499014 100644 --- a/src/liballoc/sync.rs +++ b/src/liballoc/sync.rs @@ -334,17 +334,11 @@ impl Arc { /// ``` #[unstable(feature = "new_uninit", issue = "63291")] pub fn new_uninit() -> Arc> { - let layout = Layout::new::>>(); unsafe { - let mut ptr = Global.alloc(layout) - .unwrap_or_else(|_| handle_alloc_error(layout)) - .cast::>>(); - ptr::write(&mut ptr.as_mut().strong, atomic::AtomicUsize::new(1)); - ptr::write(&mut ptr.as_mut().weak, atomic::AtomicUsize::new(1)); - Arc { - ptr, - phantom: PhantomData, - } + Arc::from_ptr(Arc::allocate_for_unsized( + Layout::new::(), + |mem| mem as *mut ArcInner>, + )) } } @@ -424,24 +418,8 @@ impl Arc<[T]> { /// ``` #[unstable(feature = "new_uninit", issue = "63291")] pub fn new_uninit_slice(len: usize) -> Arc<[mem::MaybeUninit]> { - let data_layout = Layout::array::>(len).unwrap(); - // This relies on `value` being the last field of `RcBox` in memory, - // so that the layout of `RcBox` is the same as that of `RcBox<()>` followed by `T`. - let (layout, offset) = Layout::new::>().extend(data_layout).unwrap(); unsafe { - let allocated_ptr = Global.alloc(layout) - .unwrap_or_else(|_| handle_alloc_error(layout)) - .as_ptr(); - let data_ptr = allocated_ptr.add(offset) as *mut mem::MaybeUninit; - let slice: *mut [mem::MaybeUninit] = from_raw_parts_mut(data_ptr, len); - let wide_ptr = slice as *mut ArcInner<[mem::MaybeUninit]>; - let wide_ptr = set_data_ptr(wide_ptr, allocated_ptr); - ptr::write(&mut (*wide_ptr).strong, atomic::AtomicUsize::new(1)); - ptr::write(&mut (*wide_ptr).weak, atomic::AtomicUsize::new(1)); - Arc { - ptr: NonNull::new_unchecked(wide_ptr), - phantom: PhantomData, - } + Arc::from_ptr(Arc::allocate_for_slice(len)) } } } @@ -481,10 +459,7 @@ impl Arc> { #[unstable(feature = "new_uninit", issue = "63291")] #[inline] pub unsafe fn assume_init(self) -> Arc { - Arc { - ptr: mem::ManuallyDrop::new(self).ptr.cast(), - phantom: PhantomData, - } + Arc::from_inner(mem::ManuallyDrop::new(self).ptr.cast()) } } @@ -525,10 +500,7 @@ impl Arc<[mem::MaybeUninit]> { #[unstable(feature = "new_uninit", issue = "63291")] #[inline] pub unsafe fn assume_init(self) -> Arc<[T]> { - Arc { - ptr: NonNull::new_unchecked(mem::ManuallyDrop::new(self).ptr.as_ptr() as _), - phantom: PhantomData, - } + Arc::from_ptr(mem::ManuallyDrop::new(self).ptr.as_ptr() as _) } } -- cgit 1.4.1-3-g733a5