From 796bc41752c97254231adf6692cec7c9d42953aa Mon Sep 17 00:00:00 2001 From: Shadow Cat Date: Mon, 19 Jan 2026 21:39:13 -0500 Subject: [PATCH] didn't actually remove state on widget remove (mem leak) --- src/default/mod.rs | 1 + src/default/state.rs | 16 ++++++++++++---- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/default/mod.rs b/src/default/mod.rs index 2c2f08f..ea00eb7 100644 --- a/src/default/mod.rs +++ b/src/default/mod.rs @@ -143,6 +143,7 @@ impl UiRsc for DefaultRsc { fn on_remove(&mut self, id: WidgetId) { self.events.remove(id); + self.state.remove(id); } } diff --git a/src/default/state.rs b/src/default/state.rs index 395a1cf..6a5b0b2 100644 --- a/src/default/state.rs +++ b/src/default/state.rs @@ -1,4 +1,7 @@ -use iris_core::{WidgetId, util::HashMap}; +use iris_core::{ + WidgetId, + util::{HashMap, HashSet}, +}; use std::{ any::{Any, TypeId}, marker::PhantomData, @@ -13,6 +16,7 @@ struct Key { #[derive(Default)] pub struct WidgetState { + widgets: HashMap>, counts: HashMap<(WidgetId, TypeId), usize>, map: HashMap>, } @@ -24,16 +28,20 @@ impl WidgetState { pub fn add(&mut self, id: WidgetId, data: T) -> WeakState { let ty = TypeId::of::(); let count = self.counts.entry((id, ty)).or_default(); - let key = Key { ty, i: *count, id }; + let i = *count; + let key = Key { ty, i, id }; self.map.insert(key, Box::new(data)); + self.widgets.entry(id).or_default().insert((ty, i)); *count += 1; WeakState { key, _pd: PhantomData, } } - pub fn remove(&mut self, state: WeakState) { - self.map.remove(&state.key); + pub fn remove(&mut self, id: WidgetId) { + for &(ty, i) in self.widgets.get(&id).into_iter().flatten() { + self.map.remove(&Key { id, ty, i }); + } } pub fn get(&self, state: WeakState) -> &T { self.map.get(&state.key).unwrap().downcast_ref().unwrap()