From 69f8eb17c68b485c0ebd5454896942c615e20816 Mon Sep 17 00:00:00 2001 From: Maybe Waffle Date: Sun, 10 Jul 2022 14:14:28 +0400 Subject: [PATCH] Use `byte_sub` in [a]rc impl --- library/alloc/src/lib.rs | 1 + library/alloc/src/rc.rs | 11 +++++------ library/alloc/src/sync.rs | 11 +++++------ 3 files changed, 11 insertions(+), 12 deletions(-) diff --git a/library/alloc/src/lib.rs b/library/alloc/src/lib.rs index d3816d70b635d..e8ae12af9e415 100644 --- a/library/alloc/src/lib.rs +++ b/library/alloc/src/lib.rs @@ -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)] diff --git a/library/alloc/src/rc.rs b/library/alloc/src/rc.rs index a248cd458df81..b89b03683baef 100644 --- a/library/alloc/src/rc.rs +++ b/library/alloc/src/rc.rs @@ -907,8 +907,7 @@ impl Rc { 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) }; + let rc_ptr = unsafe { ptr.byte_sub(offset) as *mut RcBox }; unsafe { Self::from_ptr(rc_ptr) } } @@ -2331,7 +2330,7 @@ impl Weak { 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) } + unsafe { ptr.byte_sub(offset) as *mut RcBox } }; // SAFETY: we now have recovered the original Weak pointer, so can create the Weak. @@ -2684,7 +2683,7 @@ impl Unpin for Rc {} /// /// 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(ptr: *const T) -> isize { +unsafe fn data_offset(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(ptr: *const T) -> isize { } #[inline] -fn data_offset_align(align: usize) -> isize { +fn data_offset_align(align: usize) -> usize { let layout = Layout::new::>(); - (layout.size() + layout.padding_needed_for(align)) as isize + layout.size() + layout.padding_needed_for(align) } diff --git a/library/alloc/src/sync.rs b/library/alloc/src/sync.rs index 24e849aab4cce..4c03cc3ed158a 100644 --- a/library/alloc/src/sync.rs +++ b/library/alloc/src/sync.rs @@ -908,8 +908,7 @@ impl Arc { 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); + let arc_ptr = ptr.byte_sub(offset) as *mut ArcInner; Self::from_ptr(arc_ptr) } @@ -1942,7 +1941,7 @@ impl Weak { 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) } + unsafe { ptr.byte_sub(offset) as *mut ArcInner } }; // SAFETY: we now have recovered the original Weak pointer, so can create the Weak. @@ -2749,7 +2748,7 @@ impl Unpin for Arc {} /// /// 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(ptr: *const T) -> isize { +unsafe fn data_offset(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(ptr: *const T) -> isize { } #[inline] -fn data_offset_align(align: usize) -> isize { +fn data_offset_align(align: usize) -> usize { let layout = Layout::new::>(); - (layout.size() + layout.padding_needed_for(align)) as isize + layout.size() + layout.padding_needed_for(align) }