Browse Source

drop scopes in order when dropping the virtual dom

Evan Almloff 1 year ago
parent
commit
c172914b21
2 changed files with 7 additions and 3 deletions
  1. 1 1
      packages/core/src/arena.rs
  2. 6 2
      packages/core/src/virtual_dom.rs

+ 1 - 1
packages/core/src/arena.rs

@@ -64,7 +64,7 @@ impl VirtualDom {
         self.elements.try_remove(el.0).map(|_| ())
     }
 
-    // Drop a scope and all its children
+    // Drop a scope without dropping its children
     //
     // Note: This will not remove any ids from the arena
     pub(crate) fn drop_scope(&mut self, id: ScopeId) {

+ 6 - 2
packages/core/src/virtual_dom.rs

@@ -762,7 +762,11 @@ impl VirtualDom {
 
 impl Drop for VirtualDom {
     fn drop(&mut self) {
-        // Simply drop this scope which drops all of its children
-        self.drop_scope(ScopeId::ROOT);
+        // Drop all scopes in order of height
+        let mut scopes = self.scopes.drain().collect::<Vec<_>>();
+        scopes.sort_by_key(|scope| scope.context().height);
+        for scope in scopes.into_iter().rev() {
+            drop(scope);
+        }
     }
 }