diff options
| author | bors <bors@rust-lang.org> | 2016-03-03 08:35:51 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2016-03-03 08:35:51 +0000 |
| commit | 4aa913cd23057484a0128547fef9bad6e5d7bff4 (patch) | |
| tree | 96bd731950903204ba3533174a25f82e29ab1b6a | |
| parent | 7cee8b9ffb6a2dac7e2f729988c2324e2f8ac10f (diff) | |
| parent | 7ceafaee4f3d8ed2268b1659dd99a541d71689a3 (diff) | |
| download | rust-4aa913cd23057484a0128547fef9bad6e5d7bff4.tar.gz rust-4aa913cd23057484a0128547fef9bad6e5d7bff4.zip | |
Auto merge of #32012 - bluss:more-drop-in-place, r=alexcrichton
Use `drop_in_place` in Vec and VecDeque We can use drop_in_place's DST capabilities directly in Vec::drop and similarly in VecDeque::drop. I verfied this has the same effect as the previous `needs_drop` code; `drop_in_place` it itself an intrinsic. The VecDeque replacement should be more efficient too, even in release mode (slice iteration makes a more efficient loop than the deque iterator).
| -rw-r--r-- | src/libcollections/vec.rs | 18 | ||||
| -rw-r--r-- | src/libcollections/vec_deque.rs | 7 |
2 files changed, 13 insertions, 12 deletions
diff --git a/src/libcollections/vec.rs b/src/libcollections/vec.rs index ae442e155c0..efcb5d2ceb3 100644 --- a/src/libcollections/vec.rs +++ b/src/libcollections/vec.rs @@ -66,7 +66,7 @@ use borrow::ToOwned; use core::cmp::Ordering; use core::fmt; use core::hash::{self, Hash}; -use core::intrinsics::{arith_offset, assume, needs_drop}; +use core::intrinsics::{arith_offset, assume}; use core::iter::FromIterator; use core::mem; use core::ops::{Index, IndexMut}; @@ -497,10 +497,11 @@ impl<T> Vec<T> { unsafe { // drop any extra elements while len < self.len { - // decrement len before the read(), so a panic on Drop doesn't - // re-drop the just-failed value. + // decrement len before the drop_in_place(), so a panic on Drop + // doesn't re-drop the just-failed value. self.len -= 1; - ptr::read(self.get_unchecked(self.len)); + let len = self.len; + ptr::drop_in_place(self.get_unchecked_mut(len)); } } } @@ -1471,13 +1472,8 @@ impl<T> Drop for Vec<T> { fn drop(&mut self) { if self.buf.unsafe_no_drop_flag_needs_drop() { unsafe { - // The branch on needs_drop() is an -O1 performance optimization. - // Without the branch, dropping Vec<u8> takes linear time. - if needs_drop::<T>() { - for x in self.iter_mut() { - ptr::drop_in_place(x); - } - } + // use drop for [T] + ptr::drop_in_place(&mut self[..]); } } // RawVec handles deallocation diff --git a/src/libcollections/vec_deque.rs b/src/libcollections/vec_deque.rs index f34fe2da7e8..3e48f14d387 100644 --- a/src/libcollections/vec_deque.rs +++ b/src/libcollections/vec_deque.rs @@ -70,7 +70,12 @@ impl<T: Clone> Clone for VecDeque<T> { impl<T> Drop for VecDeque<T> { #[unsafe_destructor_blind_to_params] fn drop(&mut self) { - self.clear(); + let (front, back) = self.as_mut_slices(); + unsafe { + // use drop for [T] + ptr::drop_in_place(front); + ptr::drop_in_place(back); + } // RawVec handles deallocation } } |
