|
@@ -136,8 +136,10 @@ impl VirtualDom {
|
|
}
|
|
}
|
|
|
|
|
|
/// Descend through the tree, removing any borrowed props and listeners
|
|
/// Descend through the tree, removing any borrowed props and listeners
|
|
- pub(crate) fn ensure_drop_safety(&self, scope: ScopeId) {
|
|
|
|
- let scope = &self.scopes[scope.0];
|
|
|
|
|
|
+ pub(crate) fn ensure_drop_safety(&self, scope_id: ScopeId) {
|
|
|
|
+ let scope = &self.scopes[scope_id.0];
|
|
|
|
+
|
|
|
|
+ log::debug!("Dropping props on scope {:?}", scope_id);
|
|
|
|
|
|
// make sure we drop all borrowed props manually to guarantee that their drop implementation is called before we
|
|
// make sure we drop all borrowed props manually to guarantee that their drop implementation is called before we
|
|
// run the hooks (which hold an &mut Reference)
|
|
// run the hooks (which hold an &mut Reference)
|
|
@@ -145,10 +147,15 @@ impl VirtualDom {
|
|
let mut props = scope.borrowed_props.borrow_mut();
|
|
let mut props = scope.borrowed_props.borrow_mut();
|
|
props.drain(..).for_each(|comp| {
|
|
props.drain(..).for_each(|comp| {
|
|
let comp = unsafe { &*comp };
|
|
let comp = unsafe { &*comp };
|
|
- if let Some(scope_id) = comp.scope.get() {
|
|
|
|
- self.ensure_drop_safety(scope_id);
|
|
|
|
|
|
+ match comp.scope.get() {
|
|
|
|
+ Some(child) if child != scope_id => self.ensure_drop_safety(child),
|
|
|
|
+ _ => (),
|
|
|
|
+ }
|
|
|
|
+ if let Ok(mut props) = comp.props.try_borrow_mut() {
|
|
|
|
+ *props = None;
|
|
|
|
+ } else {
|
|
|
|
+ log::debug!("cannot drop props for comp {:?}", scope_id);
|
|
}
|
|
}
|
|
- drop(comp.props.take());
|
|
|
|
});
|
|
});
|
|
|
|
|
|
// Now that all the references are gone, we can safely drop our own references in our listeners.
|
|
// Now that all the references are gone, we can safely drop our own references in our listeners.
|