From f0fe671bd897ff1940200d1bf42e6c421736bbb5 Mon Sep 17 00:00:00 2001 From: Shadow Cat Date: Sat, 20 Dec 2025 17:58:10 -0500 Subject: [PATCH] fix illegal instruction during handle ptr creation in release mode --- core/src/widget/handle.rs | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/core/src/widget/handle.rs b/core/src/widget/handle.rs index e82c83c..f2ac213 100644 --- a/core/src/widget/handle.rs +++ b/core/src/widget/handle.rs @@ -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::{ HasUi, Widget, @@ -44,7 +44,7 @@ impl WidgetHandle { id, counter: RefCounter::new(), send, - ty: unsafe { MaybeUninit::zeroed().assume_init() }, + ty: null_ptr(), } } @@ -69,10 +69,7 @@ impl WidgetHandle { impl WidgetRef { pub(crate) fn new(id: WidgetId) -> Self { - Self { - id, - ty: unsafe { MaybeUninit::zeroed().assume_init() }, - } + Self { id, ty: null_ptr() } } pub fn id(&self) -> WidgetId { @@ -163,3 +160,12 @@ impl<'a, W: Widget + 'a, State: HasUi> FnOnce<(&'a mut State,)> for WidgetRef &mut args.0.ui_mut()[self] } } + +fn null_ptr() -> *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]) } + } +}