Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(674)

Unified Diff: Source/core/css/RuleSet.h

Issue 17314010: RuleSet causes 600 kB of memory fragmentation (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Address reviewer feedback Created 7 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | Source/core/css/RuleSet.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/core/css/RuleSet.h
diff --git a/Source/core/css/RuleSet.h b/Source/core/css/RuleSet.h
index 0d9e99958167f05e461cc717be2cfd6428cb7217..c41f8ceafbc003165bb8186ba61513baabc2a8a7 100644
--- a/Source/core/css/RuleSet.h
+++ b/Source/core/css/RuleSet.h
@@ -24,10 +24,11 @@
#include "core/css/RuleFeature.h"
#include "core/css/StyleRule.h"
-#include <wtf/Forward.h>
-#include <wtf/HashMap.h>
-#include <wtf/HashSet.h>
-#include <wtf/text/AtomicString.h>
+#include "wtf/Forward.h"
+#include "wtf/HashMap.h"
+#include "wtf/HashSet.h"
+#include "wtf/LinkedStack.h"
+#include "wtf/text/AtomicString.h"
namespace WebCore {
@@ -112,23 +113,23 @@ public:
const RuleFeatureSet& features() const { return m_features; }
- const Vector<RuleData>* idRules(AtomicStringImpl* key) const { ASSERT(!m_hasDirtyRules); return m_idRules.get(key); }
- const Vector<RuleData>* classRules(AtomicStringImpl* key) const { ASSERT(!m_hasDirtyRules); return m_classRules.get(key); }
- const Vector<RuleData>* tagRules(AtomicStringImpl* key) const { ASSERT(!m_hasDirtyRules); return m_tagRules.get(key); }
- const Vector<RuleData>* shadowPseudoElementRules(AtomicStringImpl* key) const { ASSERT(!m_hasDirtyRules); return m_shadowPseudoElementRules.get(key); }
- const Vector<RuleData>* linkPseudoClassRules() const { ASSERT(!m_hasDirtyRules); return &m_linkPseudoClassRules; }
- const Vector<RuleData>* cuePseudoRules() const { ASSERT(!m_hasDirtyRules); return &m_cuePseudoRules; }
- const Vector<RuleData>* focusPseudoClassRules() const { ASSERT(!m_hasDirtyRules); return &m_focusPseudoClassRules; }
- const Vector<RuleData>* universalRules() const { ASSERT(!m_hasDirtyRules); return &m_universalRules; }
- const Vector<StyleRulePage*>& pageRules() const { ASSERT(!m_hasDirtyRules); return m_pageRules; }
+ const Vector<RuleData>* idRules(AtomicStringImpl* key) const { ASSERT(!m_pendingRules); return m_idRules.get(key); }
+ const Vector<RuleData>* classRules(AtomicStringImpl* key) const { ASSERT(!m_pendingRules); return m_classRules.get(key); }
+ const Vector<RuleData>* tagRules(AtomicStringImpl* key) const { ASSERT(!m_pendingRules); return m_tagRules.get(key); }
+ const Vector<RuleData>* shadowPseudoElementRules(AtomicStringImpl* key) const { ASSERT(!m_pendingRules); return m_shadowPseudoElementRules.get(key); }
+ const Vector<RuleData>* linkPseudoClassRules() const { ASSERT(!m_pendingRules); return &m_linkPseudoClassRules; }
+ const Vector<RuleData>* cuePseudoRules() const { ASSERT(!m_pendingRules); return &m_cuePseudoRules; }
+ const Vector<RuleData>* focusPseudoClassRules() const { ASSERT(!m_pendingRules); return &m_focusPseudoClassRules; }
+ const Vector<RuleData>* universalRules() const { ASSERT(!m_pendingRules); return &m_universalRules; }
+ const Vector<StyleRulePage*>& pageRules() const { ASSERT(!m_pendingRules); return m_pageRules; }
unsigned ruleCount() const { return m_ruleCount; }
void compactRulesIfNeeded()
{
- if (!m_hasDirtyRules)
+ if (!m_pendingRules)
return;
- shrinkToFit();
+ compactRules();
}
void reportMemoryUsage(MemoryObjectInfo*) const;
@@ -145,28 +146,42 @@ public:
Vector<RuleSetSelectorPair> m_regionSelectorsAndRuleSets;
private:
- typedef HashMap<AtomicStringImpl*, OwnPtr<Vector<RuleData> > > AtomRuleMap;
+ typedef HashMap<AtomicStringImpl*, OwnPtr<LinkedStack<RuleData> > > PendingRuleMap;
+ typedef HashMap<AtomicStringImpl*, OwnPtr<Vector<RuleData> > > CompactRuleMap;
RuleSet()
: m_ruleCount(0)
- , m_hasDirtyRules(false)
{
}
- void addToRuleSet(AtomicStringImpl* key, AtomRuleMap&, const RuleData&);
+ void addToRuleSet(AtomicStringImpl* key, PendingRuleMap&, const RuleData&);
void addPageRule(StyleRulePage*);
void addRegionRule(StyleRuleRegion*, bool hasDocumentSecurityOrigin);
void addChildRules(const Vector<RefPtr<StyleRuleBase> >&, const MediaQueryEvaluator& medium, StyleResolver*, const ContainerNode* scope, bool hasDocumentSecurityOrigin, AddRuleFlags);
bool findBestRuleSetAndAdd(const CSSSelector*, RuleData&);
- void shrinkToFit();
- static inline void shrinkMapVectorsToFit(AtomRuleMap&);
+ void compactRules();
+ static void compactPendingRules(PendingRuleMap&, CompactRuleMap&);
- AtomRuleMap m_idRules;
- AtomRuleMap m_classRules;
- AtomRuleMap m_tagRules;
- AtomRuleMap m_shadowPseudoElementRules;
+ struct PendingRuleMaps {
+ PendingRuleMap idRules;
+ PendingRuleMap classRules;
+ PendingRuleMap tagRules;
+ PendingRuleMap shadowPseudoElementRules;
+ };
+
+ PendingRuleMaps* ensurePendingRules()
+ {
+ if (!m_pendingRules)
+ m_pendingRules = adoptPtr(new PendingRuleMaps);
+ return m_pendingRules.get();
+ }
+
+ CompactRuleMap m_idRules;
+ CompactRuleMap m_classRules;
+ CompactRuleMap m_tagRules;
+ CompactRuleMap m_shadowPseudoElementRules;
Vector<RuleData> m_linkPseudoClassRules;
Vector<RuleData> m_cuePseudoRules;
Vector<RuleData> m_focusPseudoClassRules;
@@ -175,7 +190,7 @@ private:
Vector<StyleRulePage*> m_pageRules;
unsigned m_ruleCount;
- bool m_hasDirtyRules;
+ OwnPtr<PendingRuleMaps> m_pendingRules;
};
} // namespace WebCore
« no previous file with comments | « no previous file | Source/core/css/RuleSet.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698