Skip to content

Commit 4069187

Browse files
authored
Unrolled build for rust-lang#127415
Rollup merge of rust-lang#127415 - AljoschaMeyer:master, r=dtolnay Add missing try_new_uninit_slice_in and try_new_zeroed_slice_in The methods for fallible slice allocation in a given allocator were missing from `Box`, which was an oversight according to rust-lang/wg-allocators#130 This PR adds them as `try_new_uninit_slice_in` and `try_new_zeroed_slice_in`. I simply copy-pasted the implementations of `try_new_uninit_slice` and `try_new_zeroed_slice` and adusted doc comment, typings, and the allocator it uses internally. Also adds missing punctuation to the doc comments of `try_new_uninit_slice` and `try_new_zeroed_slice`. Related issue is rust-lang#32838 (Allocator traits and std::heap) *I think*. Also relevant is rust-lang#63291, but I did not add the corresponding `#[unstable]` proc macro, since `try_new_uninit_slice` and `try_new_zeroed_slice` are also not annotated with it.
2 parents ae7b1c1 + 351fe27 commit 4069187

File tree

1 file changed

+81
-2
lines changed

1 file changed

+81
-2
lines changed

library/alloc/src/boxed.rs

+81-2
Original file line numberDiff line numberDiff line change
@@ -704,7 +704,7 @@ impl<T> Box<[T]> {
704704
}
705705

706706
/// Constructs a new boxed slice with uninitialized contents. Returns an error if
707-
/// the allocation fails
707+
/// the allocation fails.
708708
///
709709
/// # Examples
710710
///
@@ -739,7 +739,7 @@ impl<T> Box<[T]> {
739739
}
740740

741741
/// Constructs a new boxed slice with uninitialized contents, with the memory
742-
/// being filled with `0` bytes. Returns an error if the allocation fails
742+
/// being filled with `0` bytes. Returns an error if the allocation fails.
743743
///
744744
/// See [`MaybeUninit::zeroed`][zeroed] for examples of correct and incorrect usage
745745
/// of this method.
@@ -831,6 +831,85 @@ impl<T, A: Allocator> Box<[T], A> {
831831
pub fn new_zeroed_slice_in(len: usize, alloc: A) -> Box<[mem::MaybeUninit<T>], A> {
832832
unsafe { RawVec::with_capacity_zeroed_in(len, alloc).into_box(len) }
833833
}
834+
835+
/// Constructs a new boxed slice with uninitialized contents in the provided allocator. Returns an error if
836+
/// the allocation fails.
837+
///
838+
/// # Examples
839+
///
840+
/// ```
841+
/// #![feature(allocator_api, new_uninit)]
842+
///
843+
/// use std::alloc::System;
844+
///
845+
/// let mut values = Box::<[u32], _>::try_new_uninit_slice_in(3, System)?;
846+
/// let values = unsafe {
847+
/// // Deferred initialization:
848+
/// values[0].as_mut_ptr().write(1);
849+
/// values[1].as_mut_ptr().write(2);
850+
/// values[2].as_mut_ptr().write(3);
851+
/// values.assume_init()
852+
/// };
853+
///
854+
/// assert_eq!(*values, [1, 2, 3]);
855+
/// # Ok::<(), std::alloc::AllocError>(())
856+
/// ```
857+
#[unstable(feature = "allocator_api", issue = "32838")]
858+
#[inline]
859+
pub fn try_new_uninit_slice_in(
860+
len: usize,
861+
alloc: A,
862+
) -> Result<Box<[mem::MaybeUninit<T>], A>, AllocError> {
863+
let ptr = if T::IS_ZST || len == 0 {
864+
NonNull::dangling()
865+
} else {
866+
let layout = match Layout::array::<mem::MaybeUninit<T>>(len) {
867+
Ok(l) => l,
868+
Err(_) => return Err(AllocError),
869+
};
870+
alloc.allocate(layout)?.cast()
871+
};
872+
unsafe { Ok(RawVec::from_raw_parts_in(ptr.as_ptr(), len, alloc).into_box(len)) }
873+
}
874+
875+
/// Constructs a new boxed slice with uninitialized contents in the provided allocator, with the memory
876+
/// being filled with `0` bytes. Returns an error if the allocation fails.
877+
///
878+
/// See [`MaybeUninit::zeroed`][zeroed] for examples of correct and incorrect usage
879+
/// of this method.
880+
///
881+
/// # Examples
882+
///
883+
/// ```
884+
/// #![feature(allocator_api, new_uninit)]
885+
///
886+
/// use std::alloc::System;
887+
///
888+
/// let values = Box::<[u32], _>::try_new_zeroed_slice_in(3, System)?;
889+
/// let values = unsafe { values.assume_init() };
890+
///
891+
/// assert_eq!(*values, [0, 0, 0]);
892+
/// # Ok::<(), std::alloc::AllocError>(())
893+
/// ```
894+
///
895+
/// [zeroed]: mem::MaybeUninit::zeroed
896+
#[unstable(feature = "allocator_api", issue = "32838")]
897+
#[inline]
898+
pub fn try_new_zeroed_slice_in(
899+
len: usize,
900+
alloc: A,
901+
) -> Result<Box<[mem::MaybeUninit<T>], A>, AllocError> {
902+
let ptr = if T::IS_ZST || len == 0 {
903+
NonNull::dangling()
904+
} else {
905+
let layout = match Layout::array::<mem::MaybeUninit<T>>(len) {
906+
Ok(l) => l,
907+
Err(_) => return Err(AllocError),
908+
};
909+
alloc.allocate_zeroed(layout)?.cast()
910+
};
911+
unsafe { Ok(RawVec::from_raw_parts_in(ptr.as_ptr(), len, alloc).into_box(len)) }
912+
}
834913
}
835914

836915
impl<T, A: Allocator> Box<mem::MaybeUninit<T>, A> {

0 commit comments

Comments
 (0)