Title: [280638] trunk/Source/WebCore
Revision
280638
Author
[email protected]
Date
2021-08-04 10:39:50 -0700 (Wed, 04 Aug 2021)

Log Message

Reduce Vector<> wasted capacity in some RuleSet code
https://bugs.webkit.org/show_bug.cgi?id=224160
<rdar://problem/76369555>

Unreviewed, reverting revert r279242.

Reland as this was not related to the crashes seen.


* style/RuleSet.cpp:
(WebCore::Style::RuleSet::addRulesFromSheet):
(WebCore::Style::RuleSet::evaluateDynamicMediaQueryRules):
(WebCore::Style::shrinkDynamicRules):
(WebCore::Style::RuleSet::shrinkToFit):
* style/RuleSet.h:

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (280637 => 280638)


--- trunk/Source/WebCore/ChangeLog	2021-08-04 17:33:00 UTC (rev 280637)
+++ trunk/Source/WebCore/ChangeLog	2021-08-04 17:39:50 UTC (rev 280638)
@@ -1,3 +1,20 @@
+2021-08-04  Antti Koivisto  <[email protected]>
+
+        Reduce Vector<> wasted capacity in some RuleSet code
+        https://bugs.webkit.org/show_bug.cgi?id=224160
+        <rdar://problem/76369555>
+
+        Unreviewed, reverting revert r279242.
+
+        Reland as this was not related to the crashes seen.
+
+        * style/RuleSet.cpp:
+        (WebCore::Style::RuleSet::addRulesFromSheet):
+        (WebCore::Style::RuleSet::evaluateDynamicMediaQueryRules):
+        (WebCore::Style::shrinkDynamicRules):
+        (WebCore::Style::RuleSet::shrinkToFit):
+        * style/RuleSet.h:
+
 2021-08-04  Andres Gonzalez  <[email protected]>
 
         Add support for aria-selected value changes in table cells.

Modified: trunk/Source/WebCore/style/RuleSet.cpp (280637 => 280638)


--- trunk/Source/WebCore/style/RuleSet.cpp	2021-08-04 17:33:00 UTC (rev 280637)
+++ trunk/Source/WebCore/style/RuleSet.cpp	2021-08-04 17:39:50 UTC (rev 280638)
@@ -313,6 +313,9 @@
 {
     auto mediaQueryCollector = MediaQueryCollector { evaluator };
     addRulesFromSheet(sheet, mediaQueryCollector, nullptr, AddRulesMode::Normal);
+
+    if (m_autoShrinkToFitEnabled)
+        shrinkToFit();
 }
 
 void RuleSet::addRulesFromSheet(StyleSheetContents& sheet, MediaQuerySet* sheetQuery, const MediaQueryEvaluator& evaluator, Style::Resolver& resolver)
@@ -333,14 +336,16 @@
 
     m_hasViewportDependentMediaQueries = mediaQueryCollector.hasViewportDependentMediaQueries;
 
-    if (mediaQueryCollector.dynamicMediaQueryRules.isEmpty())
-        return;
+    if (!mediaQueryCollector.dynamicMediaQueryRules.isEmpty()) {
+        auto firstNewIndex = m_dynamicMediaQueryRules.size();
+        m_dynamicMediaQueryRules.appendVector(WTFMove(mediaQueryCollector.dynamicMediaQueryRules));
 
-    auto firstNewIndex = m_dynamicMediaQueryRules.size();
-    m_dynamicMediaQueryRules.appendVector(WTFMove(mediaQueryCollector.dynamicMediaQueryRules));
+        // Set the initial values.
+        evaluateDynamicMediaQueryRules(evaluator, firstNewIndex);
+    }
 
-    // Set the initial values.
-    evaluateDynamicMediaQueryRules(evaluator, firstNewIndex);
+    if (m_autoShrinkToFitEnabled)
+        shrinkToFit();
 }
 
 void RuleSet::addRulesFromSheet(StyleSheetContents& sheet, MediaQueryCollector& mediaQueryCollector, Resolver* resolver, AddRulesMode mode)
@@ -355,9 +360,6 @@
     }
 
     addChildRules(sheet.childRules(), mediaQueryCollector, resolver, mode);
-
-    if (m_autoShrinkToFitEnabled && mode == AddRulesMode::Normal)
-        shrinkToFit();
 }
 
 void RuleSet::addStyleRule(const StyleRule& rule, MediaQueryCollector& mediaQueryCollector)
@@ -415,6 +417,7 @@
             for (auto& feature : *featureVector)
                 ruleSet->addRule(*feature.styleRule, feature.selectorIndex, feature.selectorListIndex);
         }
+        ruleSet->shrinkToFit();
         return ruleSet;
     }).iterator->value;
 
@@ -472,6 +475,14 @@
         vector->shrinkToFit();
 }
 
+static inline void shrinkDynamicRules(Vector<RuleSet::DynamicMediaQueryRules>& dynamicRules)
+{
+    for (auto& rule : dynamicRules)
+        rule.shrinkToFit();
+
+    dynamicRules.shrinkToFit();
+}
+
 void RuleSet::shrinkToFit()
 {
     shrinkMapVectorsToFit(m_idRules);
@@ -479,6 +490,7 @@
     shrinkMapVectorsToFit(m_tagLocalNameRules);
     shrinkMapVectorsToFit(m_tagLowercaseLocalNameRules);
     shrinkMapVectorsToFit(m_shadowPseudoElementRules);
+
     m_linkPseudoClassRules.shrinkToFit();
 #if ENABLE(VIDEO)
     m_cuePseudoRules.shrinkToFit();
@@ -485,10 +497,14 @@
 #endif
     m_hostPseudoClassRules.shrinkToFit();
     m_slottedPseudoElementRules.shrinkToFit();
+    m_partPseudoElementRules.shrinkToFit();
     m_focusPseudoClassRules.shrinkToFit();
     m_universalRules.shrinkToFit();
+
     m_pageRules.shrinkToFit();
     m_features.shrinkToFit();
+
+    shrinkDynamicRules(m_dynamicMediaQueryRules);
 }
 
 RuleSet::MediaQueryCollector::~MediaQueryCollector() = default;

Modified: trunk/Source/WebCore/style/RuleSet.h (280637 => 280638)


--- trunk/Source/WebCore/style/RuleSet.h	2021-08-04 17:33:00 UTC (rev 280637)
+++ trunk/Source/WebCore/style/RuleSet.h	2021-08-04 17:39:50 UTC (rev 280638)
@@ -76,6 +76,13 @@
         RuleFeatureVector ruleFeatures;
         bool requiresFullReset { false };
         bool result { true };
+
+        void shrinkToFit()
+        {
+            mediaQuerySets.shrinkToFit();
+            affectedRulePositions.shrinkToFit();
+            ruleFeatures.shrinkToFit();
+        }
     };
 
     struct MediaQueryCollector {
@@ -153,7 +160,6 @@
 
     template<typename Function> void traverseRuleDatas(Function&&);
 
-
     AtomRuleMap m_idRules;
     AtomRuleMap m_classRules;
     AtomRuleMap m_tagLocalNameRules;
@@ -169,13 +175,13 @@
     RuleDataVector m_focusPseudoClassRules;
     RuleDataVector m_universalRules;
     Vector<StyleRulePage*> m_pageRules;
+    RuleFeatureSet m_features;
+    Vector<DynamicMediaQueryRules> m_dynamicMediaQueryRules;
+    HashMap<Vector<size_t>, Ref<const RuleSet>> m_mediaQueryInvalidationRuleSetCache;
     unsigned m_ruleCount { 0 };
     bool m_hasHostPseudoClassRulesMatchingInShadowTree { false };
     bool m_autoShrinkToFitEnabled { true };
-    RuleFeatureSet m_features;
     bool m_hasViewportDependentMediaQueries { false };
-    Vector<DynamicMediaQueryRules> m_dynamicMediaQueryRules;
-    HashMap<Vector<size_t>, Ref<const RuleSet>> m_mediaQueryInvalidationRuleSetCache;
 };
 
 inline const RuleSet::RuleDataVector* RuleSet::tagRules(const AtomString& key, bool isHTMLName) const
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to