From bc14c2c23b8c4480dae1c3765fdfb8ce3c7076fa Mon Sep 17 00:00:00 2001 From: Ms2ger Date: Sat, 10 Jan 2015 16:57:21 +0100 Subject: [PATCH] Rewrite ReverseChildrenIterator to return Temporary. --- components/script/dom/node.rs | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/components/script/dom/node.rs b/components/script/dom/node.rs index f92e29626b1..bc44aeda8ba 100644 --- a/components/script/dom/node.rs +++ b/components/script/dom/node.rs @@ -398,7 +398,7 @@ impl<'a> Iterator> for QuerySelectorIterator<'a> { pub trait NodeHelpers<'a> { fn ancestors(self) -> AncestorIterator<'a>; fn children(self) -> NodeChildrenIterator<'a>; - fn rev_children(self) -> ReverseChildrenIterator<'a>; + fn rev_children(self) -> ReverseChildrenIterator; fn child_elements(self) -> ChildElementIterator<'a>; fn following_siblings(self) -> NodeChildrenIterator<'a>; fn is_in_doc(self) -> bool; @@ -816,9 +816,9 @@ impl<'a> NodeHelpers<'a> for JSRef<'a, Node> { } } - fn rev_children(self) -> ReverseChildrenIterator<'a> { + fn rev_children(self) -> ReverseChildrenIterator { ReverseChildrenIterator { - current: self.last_child.get().map(|node| *node.root().deref()), + current: self.last_child.get().root(), } } @@ -1022,14 +1022,14 @@ impl<'a> Iterator> for NodeChildrenIterator<'a> { } } -pub struct ReverseChildrenIterator<'a> { - current: Option>, +pub struct ReverseChildrenIterator { + current: Option>, } -impl<'a> Iterator> for ReverseChildrenIterator<'a> { - fn next(&mut self) -> Option> { - let node = self.current; - self.current = node.and_then(|node| node.prev_sibling().map(|node| *node.root().deref())); +impl Iterator> for ReverseChildrenIterator { + fn next(&mut self) -> Option> { + let node = self.current.r().map(Temporary::from_rooted); + self.current = self.current.take().and_then(|node| node.r().prev_sibling()).root(); node } } @@ -1064,7 +1064,9 @@ impl<'a> TreeIterator<'a> { impl<'a> Iterator> for TreeIterator<'a> { fn next(&mut self) -> Option> { let ret = self.stack.pop(); - ret.map(|node| self.stack.extend(node.rev_children())); + ret.map(|node| { + self.stack.extend(node.rev_children().map(|c| *c.root())) + }); ret } }