anchor.diff:    }
   }
   
  -List<Component> _dirtyComponents = new List<Component>();
  +
   Set<Component> _mountedComponents = new HashSet<Component>();
   Set<Component> _unmountedComponents = new HashSet<Component>();
   
  +void _enqueueDidMount(Component c) {
  +  assert(!_notifingMountStatus);
  +  _mountedComponents.add(c);
  +}
  +
  +void _enqueueDidUnmount(Component c) {
  +  assert(!_notifingMountStatus);
  +  _unmountedComponents.add(c);
  +}
  +
  +bool _notifingMountStatus = false;
  +
  +void _notifyMountStatusChanged() {
  +  try {
  +    _notifingMountStatus = true;
  +    _unmountedComponents.forEach((c) => c._didUnmount());
  +    _mountedComponents.forEach((c) => c._didMount());
  +    _mountedComponents.clear();
  +    _unmountedComponents.clear();
  +  } finally {
  +    _notifingMountStatus = false;
  +  }
  +}
  +
  +List<Component> _dirtyComponents = new List<Component>();
   bool _buildScheduled = false;
   bool _inRenderDirtyComponents = false;
   
  -void _notifyMountStatusChanged() {
  -  _unmountedComponents.forEach((c) => c._didUnmount());
  -  _mountedComponents.forEach((c) => c._didMount());
  -  _mountedComponents.clear();
  -  _unmountedComponents.clear();
  -}
   
   void _buildDirtyComponents() {
     Stopwatch sw;
  
positive.code:     }
  
      if (node._willSync(oldNode)) {
        _trace('_sync(statefull) ${node._key}');
        oldNode._sync(node, host, insertBefore);
        node._defunct = true;
        assert(oldNode._root is sky.Node);
  
negative.code:     assert(oldNode == null || node._key == oldNode._key);
  
      if (node == oldNode) {
        _traceSync(_SyncOperation.IDENTICAL, node._key);
        return node; // Nothing to do. Subtrees must be identical.
      }
  
  