servo: Merge #16874 - Use a SmallVec when gathering applicable declarations (from bholley:applicable_declarations_smallvec); r=emilio

https://bugzilla.mozilla.org/show_bug.cgi?id=1364952

Source-Repo: https://github.com/servo/servo
Source-Revision: 7ca393a9603d7fa72e58a36bd53c29db396f6ea4

--HG--
extra : subtree_source : https%3A//hg.mozilla.org/projects/converted-servo-linear
extra : subtree_revision : 95bb6753c4dac353f55d7d3013de5c3b589c68fa
This commit is contained in:
Bobby Holley 2017-05-15 23:19:43 -05:00
Родитель 58df9c7c0c
Коммит 4caa12c2c1
2 изменённых файлов: 16 добавлений и 9 удалений

Просмотреть файл

@ -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| {

Просмотреть файл

@ -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,