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;
fn next(&mut self) -> Option<Self::Item> {
while let Some(mut nested_iter) = self.stack.pop() {
let rule = match nested_iter.next() {
let mut nested_iter_finished = false;
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,
None => continue,
None => {
nested_iter_finished = true;
continue
}
};
let sub_iter = match *rule {
sub_iter = match *rule {
CssRule::Import(ref import_rule) => {
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::Page(_) => None,
};
self.stack.push(nested_iter);
}
if let Some(sub_iter) = sub_iter {
self.stack.push(sub_iter);