Auto merge of #96946 - WaffleLapkin:ptr_mask, r=scottmcm
Add pointer masking convenience functions This PR adds the following public API: ```rust impl<T: ?Sized> *const T { fn mask(self, mask: usize) -> *const T; } impl<T: ?Sized> *mut T { fn mask(self, mask: usize) -> *const T; } // mod intrinsics fn mask<T>(ptr: *const T, mask: usize) -> *const T ``` This is equivalent to `ptr.map_addr(|a| a & mask)` but also uses a cool llvm intrinsic. Proposed in https://github.com/rust-lang/rust/pull/95643#issuecomment-1121562352 cc `@Gankra` `@scottmcm` `@RalfJung` r? rust-lang/libs-api
This commit is contained in:
commit
1e978a3627
10 changed files with 87 additions and 1 deletions
|
@ -575,6 +575,21 @@ impl<T: ?Sized> *mut T {
|
|||
)
|
||||
}
|
||||
|
||||
/// Masks out bits of the pointer according to a mask.
|
||||
///
|
||||
/// This is convenience for `ptr.map_addr(|a| a & mask)`.
|
||||
///
|
||||
/// For non-`Sized` pointees this operation changes only the data pointer,
|
||||
/// leaving the metadata untouched.
|
||||
#[cfg(not(bootstrap))]
|
||||
#[unstable(feature = "ptr_mask", issue = "98290")]
|
||||
#[must_use = "returns a new pointer rather than modifying its argument"]
|
||||
#[inline(always)]
|
||||
pub fn mask(self, mask: usize) -> *mut T {
|
||||
let this = intrinsics::ptr_mask(self.cast::<()>(), mask) as *mut ();
|
||||
from_raw_parts_mut::<T>(this, metadata(self))
|
||||
}
|
||||
|
||||
/// Returns `None` if the pointer is null, or else returns a unique reference to
|
||||
/// the value wrapped in `Some`. If the value may be uninitialized, [`as_uninit_mut`]
|
||||
/// must be used instead.
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue