From 73e0be9e6518a06af57047060839d26f79f49a0a Mon Sep 17 00:00:00 2001 From: Evan Almloff Date: Mon, 11 Sep 2023 16:25:32 -0500 Subject: [PATCH] recycle vnode ids --- packages/core/src/arena.rs | 9 +++++++++ packages/core/src/diff.rs | 10 ++++++++++ 2 files changed, 19 insertions(+) diff --git a/packages/core/src/arena.rs b/packages/core/src/arena.rs index cd0f6efd1..fb6741a3f 100644 --- a/packages/core/src/arena.rs +++ b/packages/core/src/arena.rs @@ -89,6 +89,15 @@ impl VirtualDom { id, }); + // Remove all VNode ids from the scope + for id in self.scopes[id.0] + .element_refs_to_drop + .borrow_mut() + .drain(..) + { + self.element_refs.try_remove(id.0); + } + self.ensure_drop_safety(id); if recursive { diff --git a/packages/core/src/diff.rs b/packages/core/src/diff.rs index 10cdbeb88..359f7b3a8 100644 --- a/packages/core/src/diff.rs +++ b/packages/core/src/diff.rs @@ -893,6 +893,16 @@ impl<'b> VirtualDom { // Clean up the roots, assuming we need to generate mutations for these // This is done last in order to preserve Node ID reclaim order (reclaim in reverse order of claim) self.reclaim_roots(node, gen_muts); + + // Clean up the vnode id + self.reclaim_vnode_id(node); + } + + fn reclaim_vnode_id(&mut self, node: &'b VNode<'b>) { + // Clean up the vnode id + if let Some(id) = node.stable_id() { + self.element_refs.remove(id.0); + } } fn reclaim_roots(&mut self, node: &VNode, gen_muts: bool) {