fix illegal instruction during handle ptr creation in release mode

This commit is contained in:
2025-12-20 17:58:10 -05:00
parent 1ccf947220
commit f0fe671bd8

View File

@@ -1,4 +1,4 @@
use std::{marker::Unsize, mem::MaybeUninit, ops::CoerceUnsized, sync::mpsc::Sender}; use std::{marker::Unsize, ops::CoerceUnsized, sync::mpsc::Sender};
use crate::{ use crate::{
HasUi, Widget, HasUi, Widget,
@@ -44,7 +44,7 @@ impl<W: ?Sized> WidgetHandle<W> {
id, id,
counter: RefCounter::new(), counter: RefCounter::new(),
send, send,
ty: unsafe { MaybeUninit::zeroed().assume_init() }, ty: null_ptr(),
} }
} }
@@ -69,10 +69,7 @@ impl<W: ?Sized> WidgetHandle<W> {
impl<W: ?Sized> WidgetRef<W> { impl<W: ?Sized> WidgetRef<W> {
pub(crate) fn new(id: WidgetId) -> Self { pub(crate) fn new(id: WidgetId) -> Self {
Self { Self { id, ty: null_ptr() }
id,
ty: unsafe { MaybeUninit::zeroed().assume_init() },
}
} }
pub fn id(&self) -> WidgetId { pub fn id(&self) -> WidgetId {
@@ -163,3 +160,12 @@ impl<'a, W: Widget + 'a, State: HasUi> FnOnce<(&'a mut State,)> for WidgetRef<W>
&mut args.0.ui_mut()[self] &mut args.0.ui_mut()[self]
} }
} }
fn null_ptr<W: ?Sized>() -> *const W {
if size_of::<&W>() == size_of::<*const dyn Widget>() {
let w: *const dyn Widget = &();
unsafe { std::mem::transmute_copy(&w) }
} else {
unsafe { std::mem::transmute_copy(&[0usize; 1]) }
}
}