diff options
Diffstat (limited to 'src/deferred.rs')
-rw-r--r-- | src/deferred.rs | 11 |
1 files changed, 6 insertions, 5 deletions
diff --git a/src/deferred.rs b/src/deferred.rs index d953c46..c33d515 100644 --- a/src/deferred.rs +++ b/src/deferred.rs @@ -18,7 +18,7 @@ type Data = [usize; DATA_WORDS]; /// This is a handy way of keeping an unsized `FnOnce()` within a sized structure. pub(crate) struct Deferred { call: unsafe fn(*mut u8), - data: Data, + data: MaybeUninit<Data>, _marker: PhantomData<*mut ()>, // !Send + !Sync } @@ -46,7 +46,7 @@ impl Deferred { Deferred { call: call::<F>, - data: data.assume_init(), + data, _marker: PhantomData, } } else { @@ -57,14 +57,13 @@ impl Deferred { unsafe fn call<F: FnOnce()>(raw: *mut u8) { // It's safe to cast `raw` from `*mut u8` to `*mut Box<F>`, because `raw` is // originally derived from `*mut Box<F>`. - #[allow(clippy::cast_ptr_alignment)] let b: Box<F> = ptr::read(raw as *mut Box<F>); (*b)(); } Deferred { call: call::<F>, - data: data.assume_init(), + data, _marker: PhantomData, } } @@ -75,12 +74,14 @@ impl Deferred { #[inline] pub(crate) fn call(mut self) { let call = self.call; - unsafe { call(&mut self.data as *mut Data as *mut u8) }; + unsafe { call(self.data.as_mut_ptr() as *mut u8) }; } } #[cfg(all(test, not(crossbeam_loom)))] mod tests { + #![allow(clippy::drop_copy)] + use super::Deferred; use std::cell::Cell; |