Use raw_ref_op in A|Rc::as_ptr
This commit is contained in:
parent
25687caa2e
commit
db539c6498
3 changed files with 3 additions and 10 deletions
|
@ -109,6 +109,7 @@
|
|||
#![feature(pattern)]
|
||||
#![feature(ptr_internals)]
|
||||
#![feature(ptr_offset_from)]
|
||||
#![feature(raw_ref_op)]
|
||||
#![feature(rustc_attrs)]
|
||||
#![feature(receiver_trait)]
|
||||
#![feature(min_specialization)]
|
||||
|
|
|
@ -591,17 +591,13 @@ impl<T: ?Sized> Rc<T> {
|
|||
#[stable(feature = "weak_into_raw", since = "1.45.0")]
|
||||
pub fn as_ptr(this: &Self) -> *const T {
|
||||
let ptr: *mut RcBox<T> = NonNull::as_ptr(this.ptr);
|
||||
let fake_ptr = ptr as *mut T;
|
||||
|
||||
// SAFETY: This cannot go through Deref::deref.
|
||||
// Instead, we manually offset the pointer rather than manifesting a reference.
|
||||
// This is so that the returned pointer retains the same provenance as our pointer.
|
||||
// This is required so that e.g. `get_mut` can write through the pointer
|
||||
// after the Rc is recovered through `from_raw`.
|
||||
unsafe {
|
||||
let offset = data_offset(&(*ptr).value);
|
||||
set_data_ptr(fake_ptr, (ptr as *mut u8).offset(offset))
|
||||
}
|
||||
unsafe { &raw const (*ptr).value }
|
||||
}
|
||||
|
||||
/// Constructs an `Rc<T>` from a raw pointer.
|
||||
|
|
|
@ -590,17 +590,13 @@ impl<T: ?Sized> Arc<T> {
|
|||
#[stable(feature = "weak_into_raw", since = "1.45.0")]
|
||||
pub fn as_ptr(this: &Self) -> *const T {
|
||||
let ptr: *mut ArcInner<T> = NonNull::as_ptr(this.ptr);
|
||||
let fake_ptr = ptr as *mut T;
|
||||
|
||||
// SAFETY: This cannot go through Deref::deref.
|
||||
// Instead, we manually offset the pointer rather than manifesting a reference.
|
||||
// This is so that the returned pointer retains the same provenance as our pointer.
|
||||
// This is required so that e.g. `get_mut` can write through the pointer
|
||||
// after the Arc is recovered through `from_raw`.
|
||||
unsafe {
|
||||
let offset = data_offset(&(*ptr).data);
|
||||
set_data_ptr(fake_ptr, (ptr as *mut u8).offset(offset))
|
||||
}
|
||||
unsafe { &raw const (*ptr).data }
|
||||
}
|
||||
|
||||
/// Constructs an `Arc<T>` from a raw pointer.
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue