Skip to content

Commit 810dfd7

Browse files
committed
Reuse more internal Rc and Arc methods
1 parent ae1e201 commit 810dfd7

File tree

2 files changed

+14
-70
lines changed

2 files changed

+14
-70
lines changed

src/liballoc/rc.rs

+7-35
Original file line numberDiff line numberDiff line change
@@ -350,17 +350,11 @@ impl<T> Rc<T> {
350350
/// ```
351351
#[unstable(feature = "new_uninit", issue = "63291")]
352352
pub fn new_uninit() -> Rc<mem::MaybeUninit<T>> {
353-
let layout = Layout::new::<RcBox<mem::MaybeUninit<T>>>();
354353
unsafe {
355-
let mut ptr = Global.alloc(layout)
356-
.unwrap_or_else(|_| handle_alloc_error(layout))
357-
.cast::<RcBox<mem::MaybeUninit<T>>>();
358-
ptr::write(&mut ptr.as_mut().strong, Cell::new(1));
359-
ptr::write(&mut ptr.as_mut().weak, Cell::new(1));
360-
Rc {
361-
ptr,
362-
phantom: PhantomData,
363-
}
354+
Rc::from_ptr(Rc::allocate_for_unsized(
355+
Layout::new::<T>(),
356+
|mem| mem as *mut RcBox<mem::MaybeUninit<T>>,
357+
))
364358
}
365359
}
366360

@@ -440,24 +434,8 @@ impl<T> Rc<[T]> {
440434
/// ```
441435
#[unstable(feature = "new_uninit", issue = "63291")]
442436
pub fn new_uninit_slice(len: usize) -> Rc<[mem::MaybeUninit<T>]> {
443-
let data_layout = Layout::array::<mem::MaybeUninit<T>>(len).unwrap();
444-
// This relies on `value` being the last field of `RcBox` in memory,
445-
// so that the layout of `RcBox<T>` is the same as that of `RcBox<()>` followed by `T`.
446-
let (layout, offset) = Layout::new::<RcBox<()>>().extend(data_layout).unwrap();
447437
unsafe {
448-
let allocated_ptr = Global.alloc(layout)
449-
.unwrap_or_else(|_| handle_alloc_error(layout))
450-
.as_ptr();
451-
let data_ptr = allocated_ptr.add(offset) as *mut mem::MaybeUninit<T>;
452-
let slice: *mut [mem::MaybeUninit<T>] = from_raw_parts_mut(data_ptr, len);
453-
let wide_ptr = slice as *mut RcBox<[mem::MaybeUninit<T>]>;
454-
let wide_ptr = set_data_ptr(wide_ptr, allocated_ptr);
455-
ptr::write(&mut (*wide_ptr).strong, Cell::new(1));
456-
ptr::write(&mut (*wide_ptr).weak, Cell::new(1));
457-
Rc {
458-
ptr: NonNull::new_unchecked(wide_ptr),
459-
phantom: PhantomData,
460-
}
438+
Rc::from_ptr(Rc::allocate_for_slice(len))
461439
}
462440
}
463441
}
@@ -497,10 +475,7 @@ impl<T> Rc<mem::MaybeUninit<T>> {
497475
#[unstable(feature = "new_uninit", issue = "63291")]
498476
#[inline]
499477
pub unsafe fn assume_init(self) -> Rc<T> {
500-
Rc {
501-
ptr: mem::ManuallyDrop::new(self).ptr.cast(),
502-
phantom: PhantomData,
503-
}
478+
Rc::from_inner(mem::ManuallyDrop::new(self).ptr.cast())
504479
}
505480
}
506481

@@ -541,10 +516,7 @@ impl<T> Rc<[mem::MaybeUninit<T>]> {
541516
#[unstable(feature = "new_uninit", issue = "63291")]
542517
#[inline]
543518
pub unsafe fn assume_init(self) -> Rc<[T]> {
544-
Rc {
545-
ptr: NonNull::new_unchecked(mem::ManuallyDrop::new(self).ptr.as_ptr() as _),
546-
phantom: PhantomData,
547-
}
519+
Rc::from_ptr(mem::ManuallyDrop::new(self).ptr.as_ptr() as _)
548520
}
549521
}
550522

src/liballoc/sync.rs

+7-35
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)