Use byte_sub in [a]rc impl

This commit is contained in:
Maybe Waffle 2022-07-10 14:14:28 +04:00
parent 95e77648e4
commit 69f8eb17c6
3 changed files with 11 additions and 12 deletions

View File

@ -125,6 +125,7 @@
#![cfg_attr(test, feature(new_uninit))]
#![feature(nonnull_slice_from_raw_parts)]
#![feature(pattern)]
#![feature(pointer_byte_offsets)]
#![feature(ptr_internals)]
#![feature(ptr_metadata)]
#![feature(ptr_sub_ptr)]

View File

@ -907,8 +907,7 @@ impl<T: ?Sized> Rc<T> {
let offset = unsafe { data_offset(ptr) };
// Reverse the offset to find the original RcBox.
let rc_ptr =
unsafe { (ptr as *mut u8).offset(-offset).with_metadata_of(ptr as *mut RcBox<T>) };
let rc_ptr = unsafe { ptr.byte_sub(offset) as *mut RcBox<T> };
unsafe { Self::from_ptr(rc_ptr) }
}
@ -2331,7 +2330,7 @@ impl<T: ?Sized> Weak<T> {
let offset = unsafe { data_offset(ptr) };
// Thus, we reverse the offset to get the whole RcBox.
// SAFETY: the pointer originated from a Weak, so this offset is safe.
unsafe { (ptr as *mut u8).offset(-offset).with_metadata_of(ptr as *mut RcBox<T>) }
unsafe { ptr.byte_sub(offset) as *mut RcBox<T> }
};
// SAFETY: we now have recovered the original Weak pointer, so can create the Weak.
@ -2684,7 +2683,7 @@ impl<T: ?Sized> Unpin for Rc<T> {}
///
/// The pointer must point to (and have valid metadata for) a previously
/// valid instance of T, but the T is allowed to be dropped.
unsafe fn data_offset<T: ?Sized>(ptr: *const T) -> isize {
unsafe fn data_offset<T: ?Sized>(ptr: *const T) -> usize {
// Align the unsized value to the end of the RcBox.
// Because RcBox is repr(C), it will always be the last field in memory.
// SAFETY: since the only unsized types possible are slices, trait objects,
@ -2695,7 +2694,7 @@ unsafe fn data_offset<T: ?Sized>(ptr: *const T) -> isize {
}
#[inline]
fn data_offset_align(align: usize) -> isize {
fn data_offset_align(align: usize) -> usize {
let layout = Layout::new::<RcBox<()>>();
(layout.size() + layout.padding_needed_for(align)) as isize
layout.size() + layout.padding_needed_for(align)
}

View File

@ -908,8 +908,7 @@ impl<T: ?Sized> Arc<T> {
let offset = data_offset(ptr);
// Reverse the offset to find the original ArcInner.
let arc_ptr =
(ptr as *mut u8).offset(-offset).with_metadata_of(ptr as *mut ArcInner<T>);
let arc_ptr = ptr.byte_sub(offset) as *mut ArcInner<T>;
Self::from_ptr(arc_ptr)
}
@ -1942,7 +1941,7 @@ impl<T: ?Sized> Weak<T> {
let offset = unsafe { data_offset(ptr) };
// Thus, we reverse the offset to get the whole RcBox.
// SAFETY: the pointer originated from a Weak, so this offset is safe.
unsafe { (ptr as *mut u8).offset(-offset).with_metadata_of(ptr as *mut ArcInner<T>) }
unsafe { ptr.byte_sub(offset) as *mut ArcInner<T> }
};
// SAFETY: we now have recovered the original Weak pointer, so can create the Weak.
@ -2749,7 +2748,7 @@ impl<T: ?Sized> Unpin for Arc<T> {}
///
/// The pointer must point to (and have valid metadata for) a previously
/// valid instance of T, but the T is allowed to be dropped.
unsafe fn data_offset<T: ?Sized>(ptr: *const T) -> isize {
unsafe fn data_offset<T: ?Sized>(ptr: *const T) -> usize {
// Align the unsized value to the end of the ArcInner.
// Because RcBox is repr(C), it will always be the last field in memory.
// SAFETY: since the only unsized types possible are slices, trait objects,
@ -2760,7 +2759,7 @@ unsafe fn data_offset<T: ?Sized>(ptr: *const T) -> isize {
}
#[inline]
fn data_offset_align(align: usize) -> isize {
fn data_offset_align(align: usize) -> usize {
let layout = Layout::new::<ArcInner<()>>();
(layout.size() + layout.padding_needed_for(align)) as isize
layout.size() + layout.padding_needed_for(align)
}