move WriteCloneIntoRaw into alloc::alloc
This commit is contained in:
parent
f89f30fb2c
commit
1f1a3b4857
4 changed files with 31 additions and 27 deletions
|
@ -397,3 +397,26 @@ pub mod __alloc_error_handler {
|
||||||
unsafe { oom_impl(layout) }
|
unsafe { oom_impl(layout) }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Specialize clones into pre-allocated, uninitialized memory.
|
||||||
|
/// Used by `Box::clone` and `Rc`/`Arc::make_mut`.
|
||||||
|
pub(crate) trait WriteCloneIntoRaw: Sized {
|
||||||
|
unsafe fn write_clone_into_raw(&self, target: *mut Self);
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<T: Clone> WriteCloneIntoRaw for T {
|
||||||
|
#[inline]
|
||||||
|
default unsafe fn write_clone_into_raw(&self, target: *mut Self) {
|
||||||
|
// Having allocated *first* may allow the optimizer to create
|
||||||
|
// the cloned value in-place, skipping the local and move.
|
||||||
|
unsafe { target.write(self.clone()) };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<T: Copy> WriteCloneIntoRaw for T {
|
||||||
|
#[inline]
|
||||||
|
unsafe fn write_clone_into_raw(&self, target: *mut Self) {
|
||||||
|
// We can always copy in-place, without ever involving a local value.
|
||||||
|
unsafe { target.copy_from_nonoverlapping(self, 1) };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -151,7 +151,7 @@ use core::pin::Pin;
|
||||||
use core::ptr::{self, Unique};
|
use core::ptr::{self, Unique};
|
||||||
use core::task::{Context, Poll};
|
use core::task::{Context, Poll};
|
||||||
|
|
||||||
use crate::alloc::{handle_alloc_error, AllocError, Allocator, Global, Layout};
|
use crate::alloc::{handle_alloc_error, AllocError, Allocator, Global, Layout, WriteCloneIntoRaw};
|
||||||
use crate::borrow::Cow;
|
use crate::borrow::Cow;
|
||||||
use crate::raw_vec::RawVec;
|
use crate::raw_vec::RawVec;
|
||||||
use crate::str::from_boxed_utf8_unchecked;
|
use crate::str::from_boxed_utf8_unchecked;
|
||||||
|
@ -1047,28 +1047,6 @@ impl<T: Clone, A: Allocator + Clone> Clone for Box<T, A> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Specialize clones into pre-allocated, uninitialized memory.
|
|
||||||
pub(crate) trait WriteCloneIntoRaw: Sized {
|
|
||||||
unsafe fn write_clone_into_raw(&self, target: *mut Self);
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<T: Clone> WriteCloneIntoRaw for T {
|
|
||||||
#[inline]
|
|
||||||
default unsafe fn write_clone_into_raw(&self, target: *mut Self) {
|
|
||||||
// Having allocated *first* may allow the optimizer to create
|
|
||||||
// the cloned value in-place, skipping the local and move.
|
|
||||||
unsafe { target.write(self.clone()) };
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<T: Copy> WriteCloneIntoRaw for T {
|
|
||||||
#[inline]
|
|
||||||
unsafe fn write_clone_into_raw(&self, target: *mut Self) {
|
|
||||||
// We can always copy in-place, without ever involving a local value.
|
|
||||||
unsafe { target.copy_from_nonoverlapping(self, 1) };
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[stable(feature = "box_slice_clone", since = "1.3.0")]
|
#[stable(feature = "box_slice_clone", since = "1.3.0")]
|
||||||
impl Clone for Box<str> {
|
impl Clone for Box<str> {
|
||||||
fn clone(&self) -> Self {
|
fn clone(&self) -> Self {
|
||||||
|
|
|
@ -263,9 +263,10 @@ use core::pin::Pin;
|
||||||
use core::ptr::{self, NonNull};
|
use core::ptr::{self, NonNull};
|
||||||
use core::slice::from_raw_parts_mut;
|
use core::slice::from_raw_parts_mut;
|
||||||
|
|
||||||
use crate::alloc::{box_free, handle_alloc_error, AllocError, Allocator, Global, Layout};
|
use crate::alloc::{
|
||||||
|
box_free, handle_alloc_error, AllocError, Allocator, Global, Layout, WriteCloneIntoRaw,
|
||||||
|
};
|
||||||
use crate::borrow::{Cow, ToOwned};
|
use crate::borrow::{Cow, ToOwned};
|
||||||
use crate::boxed::WriteCloneIntoRaw;
|
|
||||||
use crate::string::String;
|
use crate::string::String;
|
||||||
use crate::vec::Vec;
|
use crate::vec::Vec;
|
||||||
|
|
||||||
|
|
|
@ -22,9 +22,11 @@ use core::slice::from_raw_parts_mut;
|
||||||
use core::sync::atomic;
|
use core::sync::atomic;
|
||||||
use core::sync::atomic::Ordering::{Acquire, Relaxed, Release, SeqCst};
|
use core::sync::atomic::Ordering::{Acquire, Relaxed, Release, SeqCst};
|
||||||
|
|
||||||
use crate::alloc::{box_free, handle_alloc_error, AllocError, Allocator, Global, Layout};
|
use crate::alloc::{
|
||||||
|
box_free, handle_alloc_error, AllocError, Allocator, Global, Layout, WriteCloneIntoRaw,
|
||||||
|
};
|
||||||
use crate::borrow::{Cow, ToOwned};
|
use crate::borrow::{Cow, ToOwned};
|
||||||
use crate::boxed::{Box, WriteCloneIntoRaw};
|
use crate::boxed::Box;
|
||||||
use crate::rc::is_dangling;
|
use crate::rc::is_dangling;
|
||||||
use crate::string::String;
|
use crate::string::String;
|
||||||
use crate::vec::Vec;
|
use crate::vec::Vec;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue