@@ -11,8 +11,8 @@ pub(crate) fn diff(
11 cached_set: &CachedSet,
11 cached_set: &CachedSet,
12 change_list: &mut ChangeListBuilder,
12 change_list: &mut ChangeListBuilder,
13 registry: &mut EventsRegistry,
13 registry: &mut EventsRegistry,
14− old: Node,
14+ old: &Node,
15− new: Node,
15+ new: &Node,
16 cached_roots: &mut FxHashSet<CacheId>,
16 cached_roots: &mut FxHashSet<CacheId>,
18 match (&new.kind, &old.kind) {
18 match (&new.kind, &old.kind) {
@@ -197,6 +197,11 @@ fn diff_children(
201+ create_children(cached_set, change_list, registry, new, cached_roots);
200 debug!(" updating children shared by old and new");
205 debug!(" updating children shared by old and new");
202 let num_children_to_diff = cmp::min(new.len(), old.len());
207 let num_children_to_diff = cmp::min(new.len(), old.len());
@@ -222,8 +227,8 @@ fn diff_children(
222 cached_set,
227 cached_set,
223 change_list,
228 change_list,
224 registry,
229 registry,
225− old_child.clone(),
230+ old_child,
226− new_child.clone(),
231+ new_child,
227 cached_roots,
232 cached_roots,
@@ -240,20 +245,17 @@ fn diff_children(
240 pushed = false;
245 pushed = false;
242 debug!(" creating new children");
247 debug!(" creating new children");
243− for (i, new_child) in new_children.enumerate() {
244− if i == 0 && pushed {
248+ if pushed {
245− change_list.pop();
249+ change_list.pop();
246− pushed = false;
250+ pushed = false;
255− change_list.append_child();
259 debug!(" done updating children");
261 debug!(" done updating children");
@@ -262,6 +264,21 @@ fn diff_children(
267+fn create_children<'a, I>(
268+ cached_set: &CachedSet,
269+ change_list: &mut ChangeListBuilder,
270+ registry: &mut EventsRegistry,
272+ cached_roots: &mut FxHashSet<CacheId>,
274+ I: IntoIterator<Item = &'a Node<'a>>,
277+ create(cached_set, change_list, registry, child, cached_roots);
278+ change_list.append_child();
265fn remove_children(
282fn remove_children(
266 change_list: &mut ChangeListBuilder,
283 change_list: &mut ChangeListBuilder,
267 registry: &mut EventsRegistry,
284 registry: &mut EventsRegistry,
@@ -279,7 +296,7 @@ fn create(
279 cached_set: &CachedSet,
296 cached_set: &CachedSet,
280 change_list: &mut ChangeListBuilder,
297 change_list: &mut ChangeListBuilder,
281 registry: &mut EventsRegistry,
298 registry: &mut EventsRegistry,
282− node: Node,
299+ node: &Node,
283 cached_roots: &mut FxHashSet<CacheId>,
300 cached_roots: &mut FxHashSet<CacheId>,
285 match node.kind {
302 match node.kind {
@@ -308,17 +325,11 @@ fn create(
308 change_list.set_attribute(&attr.name, &attr.value);
325 change_list.set_attribute(&attr.name, &attr.value);
310 for child in children {
327 for child in children {
311− create(
328+ create(cached_set, change_list, registry, child, cached_roots);
318 change_list.append_child();
329 change_list.append_child();
321− NodeKind::Cached(c) => {
332+ NodeKind::Cached(ref c) => {
322 cached_roots.insert(c.id);
333 cached_roots.insert(c.id);
323 let node = cached_set.get(c.id);
334 let node = cached_set.get(c.id);
324 create(cached_set, change_list, registry, node, cached_roots)
335 create(cached_set, change_list, registry, node, cached_roots)