Merge from rustc
This commit is contained in:
commit
1a2908bfaa
1116 changed files with 27941 additions and 19637 deletions
|
|
@ -241,10 +241,15 @@ impl<T, A: Allocator> RawVec<T, A> {
|
|||
if T::IS_ZST || self.cap == 0 {
|
||||
None
|
||||
} else {
|
||||
// We have an allocated chunk of memory, so we can bypass runtime
|
||||
// checks to get our current layout.
|
||||
// We could use Layout::array here which ensures the absence of isize and usize overflows
|
||||
// and could hypothetically handle differences between stride and size, but this memory
|
||||
// has already been allocated so we know it can't overflow and currently rust does not
|
||||
// support such types. So we can do better by skipping some checks and avoid an unwrap.
|
||||
let _: () = const { assert!(mem::size_of::<T>() % mem::align_of::<T>() == 0) };
|
||||
unsafe {
|
||||
let layout = Layout::array::<T>(self.cap).unwrap_unchecked();
|
||||
let align = mem::align_of::<T>();
|
||||
let size = mem::size_of::<T>().unchecked_mul(self.cap);
|
||||
let layout = Layout::from_size_align_unchecked(size, align);
|
||||
Some((self.ptr.cast().into(), layout))
|
||||
}
|
||||
}
|
||||
|
|
@ -426,11 +431,13 @@ impl<T, A: Allocator> RawVec<T, A> {
|
|||
assert!(cap <= self.capacity(), "Tried to shrink to a larger capacity");
|
||||
|
||||
let (ptr, layout) = if let Some(mem) = self.current_memory() { mem } else { return Ok(()) };
|
||||
|
||||
// See current_memory() why this assert is here
|
||||
let _: () = const { assert!(mem::size_of::<T>() % mem::align_of::<T>() == 0) };
|
||||
let ptr = unsafe {
|
||||
// `Layout::array` cannot overflow here because it would have
|
||||
// overflowed earlier when capacity was larger.
|
||||
let new_layout = Layout::array::<T>(cap).unwrap_unchecked();
|
||||
let new_size = mem::size_of::<T>().unchecked_mul(cap);
|
||||
let new_layout = Layout::from_size_align_unchecked(new_size, layout.align());
|
||||
self.alloc
|
||||
.shrink(ptr, layout, new_layout)
|
||||
.map_err(|_| AllocError { layout: new_layout, non_exhaustive: () })?
|
||||
|
|
|
|||
|
|
@ -42,8 +42,6 @@
|
|||
|
||||
#![stable(feature = "rust1", since = "1.0.0")]
|
||||
|
||||
#[cfg(not(no_global_oom_handling))]
|
||||
use core::char::{decode_utf16, REPLACEMENT_CHARACTER};
|
||||
use core::error::Error;
|
||||
use core::fmt;
|
||||
use core::hash;
|
||||
|
|
@ -683,7 +681,7 @@ impl String {
|
|||
// This isn't done via collect::<Result<_, _>>() for performance reasons.
|
||||
// FIXME: the function can be simplified again when #48994 is closed.
|
||||
let mut ret = String::with_capacity(v.len());
|
||||
for c in decode_utf16(v.iter().cloned()) {
|
||||
for c in char::decode_utf16(v.iter().cloned()) {
|
||||
if let Ok(c) = c {
|
||||
ret.push(c);
|
||||
} else {
|
||||
|
|
@ -722,7 +720,9 @@ impl String {
|
|||
#[inline]
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
pub fn from_utf16_lossy(v: &[u16]) -> String {
|
||||
decode_utf16(v.iter().cloned()).map(|r| r.unwrap_or(REPLACEMENT_CHARACTER)).collect()
|
||||
char::decode_utf16(v.iter().cloned())
|
||||
.map(|r| r.unwrap_or(char::REPLACEMENT_CHARACTER))
|
||||
.collect()
|
||||
}
|
||||
|
||||
/// Decomposes a `String` into its raw components.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue