mirror of
https://github.com/servo/servo.git
synced 2025-08-03 12:40:06 +01:00
Auto merge of #16874 - bholley:applicable_declarations_smallvec, r=emilio
Use a SmallVec when gathering applicable declarations https://bugzilla.mozilla.org/show_bug.cgi?id=1364952 <!-- Reviewable:start --> --- This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/16874) <!-- Reviewable:end -->
This commit is contained in:
commit
7ca393a960
2 changed files with 16 additions and 9 deletions
|
@ -29,7 +29,7 @@ use selectors::matching::AFFECTED_BY_PSEUDO_ELEMENTS;
|
||||||
use shared_lock::StylesheetGuards;
|
use shared_lock::StylesheetGuards;
|
||||||
use sink::ForgetfulSink;
|
use sink::ForgetfulSink;
|
||||||
use stylearc::Arc;
|
use stylearc::Arc;
|
||||||
use stylist::ApplicableDeclarationBlock;
|
use stylist::ApplicableDeclarationList;
|
||||||
|
|
||||||
/// The way a style should be inherited.
|
/// The way a style should be inherited.
|
||||||
enum InheritMode {
|
enum InheritMode {
|
||||||
|
@ -865,11 +865,11 @@ trait PrivateMatchMethods: TElement {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn compute_rule_node<E: TElement>(rule_tree: &RuleTree,
|
fn compute_rule_node<E: TElement>(rule_tree: &RuleTree,
|
||||||
applicable_declarations: &mut Vec<ApplicableDeclarationBlock>,
|
applicable_declarations: &mut ApplicableDeclarationList,
|
||||||
guards: &StylesheetGuards)
|
guards: &StylesheetGuards)
|
||||||
-> StrongRuleNode
|
-> 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);
|
let rule_node = rule_tree.insert_ordered_rules_with_important(rules, guards);
|
||||||
rule_node
|
rule_node
|
||||||
}
|
}
|
||||||
|
@ -994,8 +994,7 @@ pub trait MatchMethods : TElement {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let mut applicable_declarations =
|
let mut applicable_declarations = ApplicableDeclarationList::new();
|
||||||
Vec::<ApplicableDeclarationBlock>::with_capacity(16);
|
|
||||||
|
|
||||||
let stylist = &context.shared.stylist;
|
let stylist = &context.shared.stylist;
|
||||||
let style_attribute = self.style_attribute();
|
let style_attribute = self.style_attribute();
|
||||||
|
@ -1054,8 +1053,7 @@ pub trait MatchMethods : TElement {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
let mut applicable_declarations =
|
let mut applicable_declarations = ApplicableDeclarationList::new();
|
||||||
Vec::<ApplicableDeclarationBlock>::with_capacity(16);
|
|
||||||
|
|
||||||
let map = &mut context.thread_local.selector_flags;
|
let map = &mut context.thread_local.selector_flags;
|
||||||
let mut set_selector_flags = |element: &Self, flags: ElementSelectorFlags| {
|
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 selectors::visitor::SelectorVisitor;
|
||||||
use shared_lock::{Locked, SharedRwLockReadGuard, StylesheetGuards};
|
use shared_lock::{Locked, SharedRwLockReadGuard, StylesheetGuards};
|
||||||
use sink::Push;
|
use sink::Push;
|
||||||
use smallvec::VecLike;
|
use smallvec::{SmallVec, VecLike};
|
||||||
use std::borrow::Borrow;
|
use std::borrow::Borrow;
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
use std::hash::Hash;
|
use std::hash::Hash;
|
||||||
|
@ -49,6 +49,15 @@ use viewport::{self, MaybeNew, ViewportRule};
|
||||||
|
|
||||||
pub use ::fnv::FnvHashMap;
|
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
|
/// This structure holds all the selectors and device characteristics
|
||||||
/// for a given document. The selectors are converted into `Rule`s
|
/// for a given document. The selectors are converted into `Rule`s
|
||||||
/// (defined in rust-selectors), and introduced in a `SelectorMap`
|
/// (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,
|
self.push_applicable_declarations(element,
|
||||||
None,
|
None,
|
||||||
None,
|
None,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue