Bug 1728754 - Add layer_order to rules. r=boris

I want to land this separately because we might want to get smarter with
the size of the Rule struct (maybe restricting layer order to a u8 per
scope and packing it with the source order, since 255 layers seem
plenty), but I'd rather do the obvious thing for now.

Depends on D124336

Differential Revision: https://phabricator.services.mozilla.com/D124337
This commit is contained in:
Emilio Cobos Álvarez 2021-09-06 09:54:02 +00:00
Родитель 30f1b8637e
Коммит 13245e72d6
2 изменённых файлов: 24 добавлений и 12 удалений

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

@ -2004,7 +2004,7 @@ impl CascadeData {
selectors_for_cache_revalidation: SelectorMap::new_without_attribute_bucketing(), selectors_for_cache_revalidation: SelectorMap::new_without_attribute_bucketing(),
animations: Default::default(), animations: Default::default(),
layer_order: Default::default(), layer_order: Default::default(),
next_layer_order: 0, next_layer_order: 1, // 0 reserved for the root scope.
extra_data: ExtraStyleData::default(), extra_data: ExtraStyleData::default(),
effective_media_query_results: EffectiveMediaQueryResults::new(), effective_media_query_results: EffectiveMediaQueryResults::new(),
rules_source_order: 0, rules_source_order: 0,
@ -2168,6 +2168,7 @@ impl CascadeData {
guard: &SharedRwLockReadGuard, guard: &SharedRwLockReadGuard,
rebuild_kind: SheetRebuildKind, rebuild_kind: SheetRebuildKind,
current_layer: &mut LayerName, current_layer: &mut LayerName,
current_layer_order: u32,
mut precomputed_pseudo_element_decls: Option<&mut PrecomputedPseudoElementDeclarations>, mut precomputed_pseudo_element_decls: Option<&mut PrecomputedPseudoElementDeclarations>,
) -> Result<(), FailedAllocationError> ) -> Result<(), FailedAllocationError>
where where
@ -2215,6 +2216,7 @@ impl CascadeData {
hashes, hashes,
locked.clone(), locked.clone(),
self.rules_source_order, self.rules_source_order,
current_layer_order,
); );
if rebuild_kind.should_rebuild_invalidation() { if rebuild_kind.should_rebuild_invalidation() {
@ -2352,6 +2354,7 @@ impl CascadeData {
} }
let mut layer_names_to_pop = 0; let mut layer_names_to_pop = 0;
let mut children_layer_order = current_layer_order;
match *rule { match *rule {
CssRule::Import(ref lock) => { CssRule::Import(ref lock) => {
if rebuild_kind.should_rebuild_invalidation() { if rebuild_kind.should_rebuild_invalidation() {
@ -2370,15 +2373,17 @@ impl CascadeData {
CssRule::Layer(ref lock) => { CssRule::Layer(ref lock) => {
use crate::stylesheets::layer_rule::LayerRuleKind; use crate::stylesheets::layer_rule::LayerRuleKind;
fn maybe_register_layer(data: &mut CascadeData, layer: &LayerName) { fn maybe_register_layer(data: &mut CascadeData, layer: &LayerName) -> u32 {
// TODO: Measure what's more common / expensive, if // TODO: Measure what's more common / expensive, if
// layer.clone() or the double hash lookup in the insert // layer.clone() or the double hash lookup in the insert
// case. // case.
if data.layer_order.get(layer).is_some() { if let Some(order) = data.layer_order.get(layer) {
return; return *order;
} }
data.layer_order.insert(layer.clone(), data.next_layer_order); let order = data.next_layer_order;
data.layer_order.insert(layer.clone(), order);
data.next_layer_order += 1; data.next_layer_order += 1;
order
} }
let layer_rule = lock.read_with(guard); let layer_rule = lock.read_with(guard);
@ -2386,7 +2391,7 @@ impl CascadeData {
LayerRuleKind::Block { ref name, .. } => { LayerRuleKind::Block { ref name, .. } => {
for name in name.layer_names() { for name in name.layer_names() {
current_layer.0.push(name.clone()); current_layer.0.push(name.clone());
maybe_register_layer(self, &current_layer); children_layer_order = maybe_register_layer(self, &current_layer);
layer_names_to_pop += 1; layer_names_to_pop += 1;
} }
} }
@ -2414,6 +2419,7 @@ impl CascadeData {
guard, guard,
rebuild_kind, rebuild_kind,
current_layer, current_layer,
children_layer_order,
precomputed_pseudo_element_decls.as_deref_mut(), precomputed_pseudo_element_decls.as_deref_mut(),
)?; )?;
} }
@ -2458,6 +2464,7 @@ impl CascadeData {
guard, guard,
rebuild_kind, rebuild_kind,
&mut current_layer, &mut current_layer,
/* current_layer_order = */ 0,
precomputed_pseudo_element_decls.as_deref_mut(), precomputed_pseudo_element_decls.as_deref_mut(),
)?; )?;
@ -2576,7 +2583,7 @@ impl CascadeData {
} }
self.animations.clear(); self.animations.clear();
self.layer_order.clear(); self.layer_order.clear();
self.next_layer_order = 0; self.next_layer_order = 1;
self.extra_data.clear(); self.extra_data.clear();
self.rules_source_order = 0; self.rules_source_order = 0;
self.num_selectors = 0; self.num_selectors = 0;
@ -2665,6 +2672,9 @@ pub struct Rule {
/// we could repurpose that storage here if we needed to. /// we could repurpose that storage here if we needed to.
pub source_order: u32, pub source_order: u32,
/// The current layer order of this style rule.
pub layer_order: u32,
/// The actual style rule. /// The actual style rule.
#[cfg_attr( #[cfg_attr(
feature = "gecko", feature = "gecko",
@ -2702,12 +2712,14 @@ impl Rule {
hashes: AncestorHashes, hashes: AncestorHashes,
style_rule: Arc<Locked<StyleRule>>, style_rule: Arc<Locked<StyleRule>>,
source_order: u32, source_order: u32,
layer_order: u32,
) -> Self { ) -> Self {
Rule { Rule {
selector: selector, selector,
hashes: hashes, hashes,
style_rule: style_rule, style_rule,
source_order: source_order, source_order,
layer_order,
} }
} }
} }

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

@ -30,7 +30,7 @@ size_of_test!(size_of_pseudo_class, selector_parser::NonTSPseudoClass, 16);
// The size of this is critical to performance on the bloom-basic microbenchmark. // The size of this is critical to performance on the bloom-basic microbenchmark.
// When iterating over a large Rule array, we want to be able to fast-reject // When iterating over a large Rule array, we want to be able to fast-reject
// selectors (with the inline hashes) with as few cache misses as possible. // selectors (with the inline hashes) with as few cache misses as possible.
size_of_test!(test_size_of_rule, style::stylist::Rule, 32); size_of_test!(test_size_of_rule, style::stylist::Rule, 40);
// Large pages generate tens of thousands of ComputedValues. // Large pages generate tens of thousands of ComputedValues.
size_of_test!(test_size_of_cv, ComputedValues, 232); size_of_test!(test_size_of_cv, ComputedValues, 232);