diff --git a/packages/core/src/events.rs b/packages/core/src/events.rs index 74dca1dab..45ceabf53 100644 --- a/packages/core/src/events.rs +++ b/packages/core/src/events.rs @@ -138,6 +138,7 @@ pub mod on { //! #![allow(unused)] + use bumpalo::boxed::Box as BumpBox; use std::{cell::RefCell, fmt::Debug, ops::Deref, rc::Rc}; use crate::{ @@ -182,14 +183,18 @@ pub mod on { where F: FnMut($wrapper) + 'a { let bump = &c.bump(); + let cb: &mut dyn FnMut(VirtualEvent) = bump.alloc(move |evt: VirtualEvent| match evt { + VirtualEvent::$wrapper(event) => callback(event), + _ => unreachable!("Downcasted VirtualEvent to wrong event type - this is an internal bug!") + }); + + let callback: BumpBox = unsafe { BumpBox::from_raw(cb) }; + Listener { event: stringify!($name), mounted_node: Cell::new(None), scope: c.scope.our_arena_idx, - callback: RefCell::new(bump.alloc(move |evt: VirtualEvent| match evt { - VirtualEvent::$wrapper(event) => callback(event), - _ => unreachable!("Downcasted VirtualEvent to wrong event type - this is an internal bug!") - })), + callback: RefCell::new(callback), } } )* diff --git a/packages/core/src/nodes.rs b/packages/core/src/nodes.rs index d549aa1dd..36fce44b8 100644 --- a/packages/core/src/nodes.rs +++ b/packages/core/src/nodes.rs @@ -7,6 +7,7 @@ use crate::{ events::VirtualEvent, innerlude::{empty_cell, Context, DomTree, ElementId, Properties, Scope, ScopeId, FC}, }; +use bumpalo::boxed::Box as BumpBox; use std::{ cell::{Cell, RefCell}, fmt::{Arguments, Debug, Formatter}, @@ -112,7 +113,7 @@ pub struct Listener<'bump> { pub mounted_node: Cell>, - pub(crate) callback: RefCell<&'bump mut dyn FnMut(VirtualEvent)>, + pub(crate) callback: RefCell>, } /// Virtual Components for custom user-defined components