mirror of
https://github.com/servo/servo.git
synced 2025-07-24 07:40:27 +01:00
Stylo: replace uses of mem::uninitialized with MaybeUninit
MozReview-Commit-ID: KGhYL6DJRaR
This commit is contained in:
parent
00b3fb49c4
commit
17ec774a49
9 changed files with 60 additions and 68 deletions
|
@ -52,25 +52,6 @@ use std::sync::atomic;
|
|||
use std::sync::atomic::Ordering::{Acquire, Relaxed, Release};
|
||||
use std::{isize, usize};
|
||||
|
||||
// Private macro to get the offset of a struct field in bytes from the address of the struct.
|
||||
macro_rules! offset_of {
|
||||
($container:path, $field:ident) => {{
|
||||
// Make sure the field actually exists. This line ensures that a compile-time error is
|
||||
// generated if $field is accessed through a Deref impl.
|
||||
let $container { $field: _, .. };
|
||||
|
||||
// Create an (invalid) instance of the container and calculate the offset to its
|
||||
// field. Using a null pointer might be UB if `&(*(0 as *const T)).field` is interpreted to
|
||||
// be nullptr deref.
|
||||
let invalid: $container = ::std::mem::uninitialized();
|
||||
let offset = &invalid.$field as *const _ as usize - &invalid as *const _ as usize;
|
||||
|
||||
// Do not run destructors on the made up invalid instance.
|
||||
::std::mem::forget(invalid);
|
||||
offset as isize
|
||||
}};
|
||||
}
|
||||
|
||||
/// A soft limit on the amount of references that may be made to an `Arc`.
|
||||
///
|
||||
/// Going above this limit will abort your program (although not
|
||||
|
@ -196,6 +177,14 @@ struct ArcInner<T: ?Sized> {
|
|||
unsafe impl<T: ?Sized + Sync + Send> Send for ArcInner<T> {}
|
||||
unsafe impl<T: ?Sized + Sync + Send> Sync for ArcInner<T> {}
|
||||
|
||||
/// Computes the offset of the data field within ArcInner.
|
||||
fn data_offset<T>() -> usize {
|
||||
let size = size_of::<ArcInner<()>>();
|
||||
let align = align_of::<T>();
|
||||
// https://github.com/rust-lang/rust/blob/1.36.0/src/libcore/alloc.rs#L187-L207
|
||||
size.wrapping_add(align).wrapping_sub(1) & !align.wrapping_sub(1)
|
||||
}
|
||||
|
||||
impl<T> Arc<T> {
|
||||
/// Construct an `Arc<T>`
|
||||
#[inline]
|
||||
|
@ -251,7 +240,7 @@ impl<T> Arc<T> {
|
|||
unsafe fn from_raw(ptr: *const T) -> Self {
|
||||
// To find the corresponding pointer to the `ArcInner` we need
|
||||
// to subtract the offset of the `data` field from the pointer.
|
||||
let ptr = (ptr as *const u8).offset(-offset_of!(ArcInner<T>, data));
|
||||
let ptr = (ptr as *const u8).sub(data_offset::<T>());
|
||||
Arc {
|
||||
p: ptr::NonNull::new_unchecked(ptr as *mut ArcInner<T>),
|
||||
phantom: PhantomData,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue