diff --git a/components/selectors/parser.rs b/components/selectors/parser.rs index 2be48151ce7..8ee4378cdc7 100644 --- a/components/selectors/parser.rs +++ b/components/selectors/parser.rs @@ -5,6 +5,7 @@ use arcslice::ArcSlice; use cssparser::{Token, Parser as CssParser, parse_nth, ToCss, serialize_identifier, CssStringWriter}; use precomputed_hash::PrecomputedHash; +use smallvec::SmallVec; use std::ascii::AsciiExt; use std::borrow::{Borrow, Cow}; use std::cmp; @@ -886,13 +887,23 @@ fn parse_selector(parser: &P, input: &mut CssParser) -> Result 8 entries, we save two reallocations. +type ParseVec = SmallVec<[Component; 8]>; + fn parse_complex_selector_and_pseudo_element( parser: &P, input: &mut CssParser) -> Result<(ComplexSelector, Option), ()> where P: Parser, Impl: SelectorImpl { - let mut sequence = Vec::new(); + let mut sequence = ParseVec::new(); let mut pseudo_element; 'outer_loop: loop { // Parse a sequence of simple selectors. @@ -935,7 +946,7 @@ fn parse_complex_selector_and_pseudo_element( sequence.push(Component::Combinator(combinator)); } - let complex = ComplexSelector(ArcSlice::new(sequence.into_boxed_slice())); + let complex = ComplexSelector(ArcSlice::new(sequence.into_vec().into_boxed_slice())); Ok((complex, pseudo_element)) } @@ -956,7 +967,7 @@ impl ComplexSelector { /// * `Err(())`: Invalid selector, abort /// * `Ok(None)`: Not a type selector, could be something else. `input` was not consumed. /// * `Ok(Some(vec))`: Length 0 (`*|*`), 1 (`*|E` or `ns|*`) or 2 (`|E` or `ns|E`) -fn parse_type_selector(parser: &P, input: &mut CssParser, sequence: &mut Vec>) +fn parse_type_selector(parser: &P, input: &mut CssParser, sequence: &mut ParseVec) -> Result where P: Parser, Impl: SelectorImpl { @@ -1170,7 +1181,7 @@ fn parse_negation(parser: &P, fn parse_compound_selector( parser: &P, input: &mut CssParser, - mut sequence: &mut Vec>) + mut sequence: &mut ParseVec) -> Result, ()> where P: Parser, Impl: SelectorImpl {