Rollup merge of #54851 - alexcrichton:revert-optimize, r=sfackler
Fix a regression in 1.30 by reverting #53564 Investigation on #54477 revealed https://github.com/rust-lang/rust/pull/53564 as the culprit in the regression for that crate. I've reproduced the regression with the [detailed test cases provided](https://github.com/rust-lang/rust/issues/54477#issuecomment-427398456). While we figure out how to fix the regression this commit reverts the current culprit.
This commit is contained in:
commit
402c69950b
@ -19,7 +19,6 @@
|
|||||||
|
|
||||||
use core::cmp::Ordering;
|
use core::cmp::Ordering;
|
||||||
use core::fmt;
|
use core::fmt;
|
||||||
use core::isize;
|
|
||||||
use core::iter::{repeat, FromIterator, FusedIterator};
|
use core::iter::{repeat, FromIterator, FusedIterator};
|
||||||
use core::mem;
|
use core::mem;
|
||||||
use core::ops::Bound::{Excluded, Included, Unbounded};
|
use core::ops::Bound::{Excluded, Included, Unbounded};
|
||||||
@ -203,33 +202,6 @@ impl<T> VecDeque<T> {
|
|||||||
len);
|
len);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Copies all values from `src` to the back of `self`, wrapping around if needed.
|
|
||||||
///
|
|
||||||
/// # Safety
|
|
||||||
///
|
|
||||||
/// The capacity must be sufficient to hold self.len() + src.len() elements.
|
|
||||||
/// If so, this function never panics.
|
|
||||||
#[inline]
|
|
||||||
unsafe fn copy_slice(&mut self, src: &[T]) {
|
|
||||||
/// This is guaranteed by `RawVec`.
|
|
||||||
debug_assert!(self.capacity() <= isize::MAX as usize);
|
|
||||||
|
|
||||||
let expected_new_len = self.len() + src.len();
|
|
||||||
debug_assert!(self.capacity() >= expected_new_len);
|
|
||||||
|
|
||||||
let dst_high_ptr = self.ptr().add(self.head);
|
|
||||||
let dst_high_len = self.cap() - self.head;
|
|
||||||
|
|
||||||
let split = cmp::min(src.len(), dst_high_len);
|
|
||||||
let (src_high, src_low) = src.split_at(split);
|
|
||||||
|
|
||||||
ptr::copy_nonoverlapping(src_high.as_ptr(), dst_high_ptr, src_high.len());
|
|
||||||
ptr::copy_nonoverlapping(src_low.as_ptr(), self.ptr(), src_low.len());
|
|
||||||
|
|
||||||
self.head = self.wrap_add(self.head, src.len());
|
|
||||||
debug_assert!(self.len() == expected_new_len);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Copies a potentially wrapping block of memory len long from src to dest.
|
/// Copies a potentially wrapping block of memory len long from src to dest.
|
||||||
/// (abs(dst - src) + len) must be no larger than cap() (There must be at
|
/// (abs(dst - src) + len) must be no larger than cap() (There must be at
|
||||||
/// most one continuous overlapping region between src and dest).
|
/// most one continuous overlapping region between src and dest).
|
||||||
@ -1052,7 +1024,7 @@ impl<T> VecDeque<T> {
|
|||||||
iter: Iter {
|
iter: Iter {
|
||||||
tail: drain_tail,
|
tail: drain_tail,
|
||||||
head: drain_head,
|
head: drain_head,
|
||||||
ring: unsafe { self.buffer_as_slice() },
|
ring: unsafe { self.buffer_as_mut_slice() },
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1862,22 +1834,8 @@ impl<T> VecDeque<T> {
|
|||||||
#[inline]
|
#[inline]
|
||||||
#[stable(feature = "append", since = "1.4.0")]
|
#[stable(feature = "append", since = "1.4.0")]
|
||||||
pub fn append(&mut self, other: &mut Self) {
|
pub fn append(&mut self, other: &mut Self) {
|
||||||
unsafe {
|
// naive impl
|
||||||
// Guarantees there is space in `self` for `other`.
|
self.extend(other.drain(..));
|
||||||
self.reserve(other.len());
|
|
||||||
|
|
||||||
{
|
|
||||||
let (src_high, src_low) = other.as_slices();
|
|
||||||
|
|
||||||
// This is only safe because copy_slice never panics when capacity is sufficient.
|
|
||||||
self.copy_slice(src_low);
|
|
||||||
self.copy_slice(src_high);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Some values now exist in both `other` and `self` but are made inaccessible
|
|
||||||
// in`other`.
|
|
||||||
other.tail = other.head;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Retains only the elements specified by the predicate.
|
/// Retains only the elements specified by the predicate.
|
||||||
@ -2635,8 +2593,8 @@ impl<T> From<VecDeque<T>> for Vec<T> {
|
|||||||
let mut right_offset = 0;
|
let mut right_offset = 0;
|
||||||
for i in left_edge..right_edge {
|
for i in left_edge..right_edge {
|
||||||
right_offset = (i - left_edge) % (cap - right_edge);
|
right_offset = (i - left_edge) % (cap - right_edge);
|
||||||
let src = right_edge + right_offset;
|
let src: isize = (right_edge + right_offset) as isize;
|
||||||
ptr::swap(buf.add(i), buf.add(src));
|
ptr::swap(buf.add(i), buf.offset(src));
|
||||||
}
|
}
|
||||||
let n_ops = right_edge - left_edge;
|
let n_ops = right_edge - left_edge;
|
||||||
left_edge += n_ops;
|
left_edge += n_ops;
|
||||||
|
Loading…
Reference in New Issue
Block a user