use {
crate::{
proxy::low_level::owned::UntypedOwnedProxyData,
utils::sync_ptr::{SyncNonNull, SyncPtr},
},
std::mem::{self, ManuallyDrop},
};
pub(crate) struct ProxyDataDestruction {
data: Option<SyncNonNull<UntypedOwnedProxyData>>,
event_handler: Option<(SyncPtr<u8>, SyncPtr<u8>)>,
}
impl ProxyDataDestruction {
pub(super) fn new(
data: Option<SyncNonNull<UntypedOwnedProxyData>>,
event_handler: Option<(SyncPtr<u8>, SyncPtr<u8>)>,
) -> Self {
Self {
data,
event_handler,
}
}
pub(super) fn is_noop(&self) -> bool {
self.data.is_none() && self.event_handler.is_none()
}
pub(crate) unsafe fn run(self) {
let slf = ManuallyDrop::new(self);
if let Some((event_handler, drop_event_handler)) = slf.event_handler {
let drop_event_handler =
unsafe { mem::transmute::<*mut u8, unsafe fn(*mut u8)>(*drop_event_handler) };
unsafe {
drop_event_handler(*event_handler);
}
}
if let Some(data) = slf.data {
let _ = unsafe { Box::from_raw(data.as_ptr()) };
}
}
}