Bug 1357583: Avoid unconditionally popping under RulesIterator. r=heycam

Not sure it's worth it, really, but seemed like it could be.

Feel free to r- if it doesn't feel like it.

MozReview-Commit-ID: HTsBNfEqQy4
This commit is contained in:
Emilio Cobos Álvarez 2017-05-27 00:55:52 +02:00
parent ac5872b48c
commit 7c5fabaf83
No known key found for this signature in database
GPG key ID: 056B727BB9C1027C

View file

@ -1123,13 +1123,27 @@ impl<'a, 'b, C> Iterator for RulesIterator<'a, 'b, C>
type Item = &'a CssRule; type Item = &'a CssRule;
fn next(&mut self) -> Option<Self::Item> { fn next(&mut self) -> Option<Self::Item> {
while let Some(mut nested_iter) = self.stack.pop() { let mut nested_iter_finished = false;
let rule = match nested_iter.next() { while !self.stack.is_empty() {
if nested_iter_finished {
self.stack.pop();
nested_iter_finished = false;
continue;
}
let rule;
let sub_iter;
{
let mut nested_iter = self.stack.last_mut().unwrap();
rule = match nested_iter.next() {
Some(r) => r, Some(r) => r,
None => continue, None => {
nested_iter_finished = true;
continue
}
}; };
let sub_iter = match *rule { sub_iter = match *rule {
CssRule::Import(ref import_rule) => { CssRule::Import(ref import_rule) => {
let import_rule = import_rule.read_with(self.guard); let import_rule = import_rule.read_with(self.guard);
@ -1171,8 +1185,7 @@ impl<'a, 'b, C> Iterator for RulesIterator<'a, 'b, C>
CssRule::Keyframes(_) | CssRule::Keyframes(_) |
CssRule::Page(_) => None, CssRule::Page(_) => None,
}; };
}
self.stack.push(nested_iter);
if let Some(sub_iter) = sub_iter { if let Some(sub_iter) = sub_iter {
self.stack.push(sub_iter); self.stack.push(sub_iter);