From a9b5c92fbb608121f93db5c3458c6843efb464fb Mon Sep 17 00:00:00 2001 From: Evan Almloff Date: Tue, 28 Mar 2023 08:35:57 -0500 Subject: [PATCH] avoid duplicating dirty nodes in native core --- packages/native-core/src/passes.rs | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/packages/native-core/src/passes.rs b/packages/native-core/src/passes.rs index a98f81600..2a84e6df4 100644 --- a/packages/native-core/src/passes.rs +++ b/packages/native-core/src/passes.rs @@ -16,12 +16,12 @@ use crate::{NodeId, NodeMask}; #[derive(Default)] struct DirtyNodes { - nodes_dirty: Vec, + nodes_dirty: FxHashSet, } impl DirtyNodes { pub fn add_node(&mut self, node_id: NodeId) { - self.nodes_dirty.push(node_id); + self.nodes_dirty.insert(node_id); } pub fn is_empty(&self) -> bool { @@ -29,10 +29,14 @@ impl DirtyNodes { } pub fn pop(&mut self) -> Option { - self.nodes_dirty.pop() + self.nodes_dirty.iter().next().copied().map(|id| { + self.nodes_dirty.remove(&id); + id + }) } } +/// Tracks the dirty nodes sorted by height for each pass. We resolve passes based on the height of the node in order to avoid resolving any node twice in a pass. #[derive(Clone, Unique)] pub struct DirtyNodeStates { dirty: Arc>>>,