diff options
-rw-r--r-- | components/style/matching.rs | 12 | ||||
-rw-r--r-- | components/style/stylist.rs | 13 |
2 files changed, 16 insertions, 9 deletions
diff --git a/components/style/matching.rs b/components/style/matching.rs index 47562dbb335..764f58ec080 100644 --- a/components/style/matching.rs +++ b/components/style/matching.rs @@ -29,7 +29,7 @@ use selectors::matching::AFFECTED_BY_PSEUDO_ELEMENTS; use shared_lock::StylesheetGuards; use sink::ForgetfulSink; use stylearc::Arc; -use stylist::ApplicableDeclarationBlock; +use stylist::ApplicableDeclarationList; /// The way a style should be inherited. enum InheritMode { @@ -865,11 +865,11 @@ trait PrivateMatchMethods: TElement { } fn compute_rule_node<E: TElement>(rule_tree: &RuleTree, - applicable_declarations: &mut Vec<ApplicableDeclarationBlock>, + applicable_declarations: &mut ApplicableDeclarationList, guards: &StylesheetGuards) -> StrongRuleNode { - let rules = applicable_declarations.drain(..).map(|d| (d.source, d.level)); + let rules = applicable_declarations.drain().map(|d| (d.source, d.level)); let rule_node = rule_tree.insert_ordered_rules_with_important(rules, guards); rule_node } @@ -994,8 +994,7 @@ pub trait MatchMethods : TElement { } } - let mut applicable_declarations = - Vec::<ApplicableDeclarationBlock>::with_capacity(16); + let mut applicable_declarations = ApplicableDeclarationList::new(); let stylist = &context.shared.stylist; let style_attribute = self.style_attribute(); @@ -1054,8 +1053,7 @@ pub trait MatchMethods : TElement { return false; } - let mut applicable_declarations = - Vec::<ApplicableDeclarationBlock>::with_capacity(16); + let mut applicable_declarations = ApplicableDeclarationList::new(); let map = &mut context.thread_local.selector_flags; let mut set_selector_flags = |element: &Self, flags: ElementSelectorFlags| { diff --git a/components/style/stylist.rs b/components/style/stylist.rs index 5f64588d186..4cb2ce0ad26 100644 --- a/components/style/stylist.rs +++ b/components/style/stylist.rs @@ -33,7 +33,7 @@ use selectors::parser::{SelectorMethods, LocalName as LocalNameSelector}; use selectors::visitor::SelectorVisitor; use shared_lock::{Locked, SharedRwLockReadGuard, StylesheetGuards}; use sink::Push; -use smallvec::VecLike; +use smallvec::{SmallVec, VecLike}; use std::borrow::Borrow; use std::collections::HashMap; use std::hash::Hash; @@ -49,6 +49,15 @@ use viewport::{self, MaybeNew, ViewportRule}; pub use ::fnv::FnvHashMap; +/// List of applicable declaration. This is a transient structure that shuttles +/// declarations between selector matching and inserting into the rule tree, and +/// therefore we want to avoid heap-allocation where possible. +/// +/// In measurements on wikipedia, we pretty much never have more than 8 applicable +/// declarations, so we could consider making this 8 entries instead of 16. +/// However, it may depend a lot on workload, and stack space is cheap. +pub type ApplicableDeclarationList = SmallVec<[ApplicableDeclarationBlock; 16]>; + /// This structure holds all the selectors and device characteristics /// for a given document. The selectors are converted into `Rule`s /// (defined in rust-selectors), and introduced in a `SelectorMap` @@ -678,7 +687,7 @@ impl Stylist { }; - let mut declarations = vec![]; + let mut declarations = ApplicableDeclarationList::new(); self.push_applicable_declarations(element, None, None, |