@@ -754,29 +754,32 @@ impl Tree {
754
754
// list of remaining children back in.
755
755
let mut children_of_node =
756
756
mem:: take ( & mut self . nodes . get_mut ( * tag) . unwrap ( ) . children ) ;
757
- // Remove all useless children, and save them for later.
758
- // The closure needs `&self` and the loop below needs `&mut self`, so we need to `collect`
759
- // in to a temporary list.
760
- let to_remove: Vec < _ > =
761
- children_of_node. drain_filter ( |x| self . is_useless ( * x, live) ) . collect ( ) ;
757
+ // Remove all useless children.
758
+ children_of_node. retain_mut ( |idx| {
759
+ if self . is_useless ( * idx, live) {
760
+ // Note: In the rest of this comment, "this node" refers to `idx`.
761
+ // This node has no more children (if there were any, they have already been removed).
762
+ // It is also unreachable as determined by the GC, so we can remove it everywhere.
763
+ // Due to the API of UniMap we must make sure to call
764
+ // `UniValMap::remove` for the key of this node on *all* maps that used it
765
+ // (which are `self.nodes` and every range of `self.rperms`)
766
+ // before we can safely apply `UniKeyMap::remove` to truly remove
767
+ // this tag from the `tag_mapping`.
768
+ let node = self . nodes . remove ( * idx) . unwrap ( ) ;
769
+ for ( _perms_range, perms) in self . rperms . iter_mut_all ( ) {
770
+ perms. remove ( * idx) ;
771
+ }
772
+ self . tag_mapping . remove ( & node. tag ) ;
773
+ // now delete it
774
+ false
775
+ } else {
776
+ // do nothing, but retain
777
+ true
778
+ }
779
+ } ) ;
762
780
// Put back the now-filtered vector.
763
781
self . nodes . get_mut ( * tag) . unwrap ( ) . children = children_of_node;
764
- // Now, all that is left is unregistering the children saved in `to_remove`.
765
- for idx in to_remove {
766
- // Note: In the rest of this comment, "this node" refers to `idx`.
767
- // This node has no more children (if there were any, they have already been removed).
768
- // It is also unreachable as determined by the GC, so we can remove it everywhere.
769
- // Due to the API of UniMap we must make sure to call
770
- // `UniValMap::remove` for the key of this node on *all* maps that used it
771
- // (which are `self.nodes` and every range of `self.rperms`)
772
- // before we can safely apply `UniKeyMap::remove` to truly remove
773
- // this tag from the `tag_mapping`.
774
- let node = self . nodes . remove ( idx) . unwrap ( ) ;
775
- for ( _perms_range, perms) in self . rperms . iter_mut_all ( ) {
776
- perms. remove ( idx) ;
777
- }
778
- self . tag_mapping . remove ( & node. tag ) ;
779
- }
782
+
780
783
// We are done, the parent can continue.
781
784
stack. pop ( ) ;
782
785
continue ;
0 commit comments