mirror of
https://github.com/rust-lang/rust.git
synced 2025-05-04 05:57:36 +00:00
avoid materializing unintialized Boxes in RawVec
This commit is contained in:
parent
ed2a5115da
commit
a23a77fb19
@ -546,9 +546,12 @@ impl<T: Copy> From<&[T]> for Box<[T]> {
|
|||||||
/// println!("{:?}", boxed_slice);
|
/// println!("{:?}", boxed_slice);
|
||||||
/// ```
|
/// ```
|
||||||
fn from(slice: &[T]) -> Box<[T]> {
|
fn from(slice: &[T]) -> Box<[T]> {
|
||||||
let mut boxed = unsafe { RawVec::with_capacity(slice.len()).into_box() };
|
let len = slice.len();
|
||||||
boxed.copy_from_slice(slice);
|
let buf = RawVec::with_capacity(len);
|
||||||
boxed
|
unsafe {
|
||||||
|
ptr::copy_nonoverlapping(slice.as_ptr(), buf.ptr(), len);
|
||||||
|
buf.into_box()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -685,12 +685,14 @@ impl<T, A: Alloc> RawVec<T, A> {
|
|||||||
impl<T> RawVec<T, Global> {
|
impl<T> RawVec<T, Global> {
|
||||||
/// Converts the entire buffer into `Box<[T]>`.
|
/// Converts the entire buffer into `Box<[T]>`.
|
||||||
///
|
///
|
||||||
/// While it is not *strictly* Undefined Behavior to call
|
|
||||||
/// this procedure while some of the RawVec is uninitialized,
|
|
||||||
/// it certainly makes it trivial to trigger it.
|
|
||||||
///
|
|
||||||
/// Note that this will correctly reconstitute any `cap` changes
|
/// Note that this will correctly reconstitute any `cap` changes
|
||||||
/// that may have been performed. (see description of type for details)
|
/// that may have been performed. (see description of type for details)
|
||||||
|
///
|
||||||
|
/// # Undefined Behavior
|
||||||
|
///
|
||||||
|
/// All elements of `RawVec<T, Global>` must be initialized. Notice that
|
||||||
|
/// the rules around uninitialized boxed values are not finalized yet,
|
||||||
|
/// but until they are, it is advisable to avoid them.
|
||||||
pub unsafe fn into_box(self) -> Box<[T]> {
|
pub unsafe fn into_box(self) -> Box<[T]> {
|
||||||
// NOTE: not calling `cap()` here, actually using the real `cap` field!
|
// NOTE: not calling `cap()` here, actually using the real `cap` field!
|
||||||
let slice = slice::from_raw_parts_mut(self.ptr(), self.cap);
|
let slice = slice::from_raw_parts_mut(self.ptr(), self.cap);
|
||||||
|
Loading…
Reference in New Issue
Block a user