diff options
| author | Trevor Spiteri <tspiteri@ieee.org> | 2020-04-04 14:24:26 +0200 |
|---|---|---|
| committer | Trevor Spiteri <tspiteri@ieee.org> | 2020-04-04 14:30:33 +0200 |
| commit | 2b718e8d9ca6efdccf4d72647cb3d3101e15b7fa (patch) | |
| tree | 35051115f6fd6fb728e25c6619456a03fed85e83 /src/liballoc/raw_vec.rs | |
| parent | 1b521f57735663de9373679cf8c6502622036bf1 (diff) | |
| download | rust-2b718e8d9ca6efdccf4d72647cb3d3101e15b7fa.tar.gz rust-2b718e8d9ca6efdccf4d72647cb3d3101e15b7fa.zip | |
use ManuallyDrop instead of forget inside collections
This commit changes some usage of mem::forget into mem::ManuallyDrop in some Vec, VecDeque, BTreeMap and Box methods. Before the commit, the generated IR for some of the methods was longer, and even after optimization, some unwinding artifacts were still present.
Diffstat (limited to 'src/liballoc/raw_vec.rs')
| -rw-r--r-- | src/liballoc/raw_vec.rs | 16 |
1 files changed, 7 insertions, 9 deletions
diff --git a/src/liballoc/raw_vec.rs b/src/liballoc/raw_vec.rs index 2bf40490e78..12e32fd9d35 100644 --- a/src/liballoc/raw_vec.rs +++ b/src/liballoc/raw_vec.rs @@ -3,7 +3,7 @@ use core::alloc::MemoryBlock; use core::cmp; -use core::mem::{self, MaybeUninit}; +use core::mem::{self, ManuallyDrop, MaybeUninit}; use core::ops::Drop; use core::ptr::{NonNull, Unique}; use core::slice; @@ -112,11 +112,10 @@ impl<T> RawVec<T, Global> { } /// Converts a `Box<[T]>` into a `RawVec<T>`. - pub fn from_box(mut slice: Box<[T]>) -> Self { + pub fn from_box(slice: Box<[T]>) -> Self { unsafe { - let result = RawVec::from_raw_parts(slice.as_mut_ptr(), slice.len()); - mem::forget(slice); - result + let mut slice = ManuallyDrop::new(slice); + RawVec::from_raw_parts(slice.as_mut_ptr(), slice.len()) } } } @@ -579,11 +578,10 @@ impl<T> RawVec<T, Global> { "`len` must be smaller than or equal to `self.capacity()`" ); + let me = ManuallyDrop::new(self); // NOTE: not calling `capacity()` here; actually using the real `cap` field! - let slice = slice::from_raw_parts_mut(self.ptr() as *mut MaybeUninit<T>, len); - let output = Box::from_raw(slice); - mem::forget(self); - output + let slice = slice::from_raw_parts_mut(me.ptr() as *mut MaybeUninit<T>, len); + Box::from_raw(slice) } } |
