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

Unified Diff: Source/core/dom/Document.cpp

Issue 280123002: Oilpan: move LiveNodeList collections to the heap. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Have NodeRareData clear out NodeListsNodeData instead. Created 6 years, 7 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 | « Source/core/dom/Document.h ('k') | Source/core/dom/Element.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/core/dom/Document.cpp
diff --git a/Source/core/dom/Document.cpp b/Source/core/dom/Document.cpp
index b4b03dc399c7a823140d09f506fff9e6541c712c..0b0414e3eb79e690c30ee739b46997a4b9003193 100644
--- a/Source/core/dom/Document.cpp
+++ b/Source/core/dom/Document.cpp
@@ -509,8 +509,10 @@ Document::Document(const DocumentInit& initializer, DocumentClassFlags documentC
initSecurityContext(initializer);
initDNSPrefetch();
- for (unsigned i = 0; i < WTF_ARRAY_LENGTH(m_nodeListCounts); i++)
+#if !ENABLE(OILPAN)
+ for (unsigned i = 0; i < WTF_ARRAY_LENGTH(m_nodeListCounts); ++i)
m_nodeListCounts[i] = 0;
+#endif
InspectorCounters::incrementCounter(InspectorCounters::DocumentCounter);
@@ -592,12 +594,12 @@ Document::~Document()
// as well as Node. See a comment on TreeScope.h for the reason.
if (hasRareData())
clearRareData();
-#endif
- ASSERT(!m_listsInvalidatedAtDocument.size());
+ ASSERT(m_listsInvalidatedAtDocument.isEmpty());
- for (unsigned i = 0; i < WTF_ARRAY_LENGTH(m_nodeListCounts); i++)
+ for (unsigned i = 0; i < WTF_ARRAY_LENGTH(m_nodeListCounts); ++i)
ASSERT(!m_nodeListCounts[i]);
+#endif
setClient(0);
@@ -3695,22 +3697,51 @@ void Document::setCSSTarget(Element* n)
n->didAffectSelector(AffectedSelectorTarget);
}
-void Document::registerNodeList(LiveNodeListBase* list)
+void Document::registerNodeList(const LiveNodeListBase* list)
{
+#if ENABLE(OILPAN)
+ m_nodeLists[list->invalidationType()].add(list);
+#else
m_nodeListCounts[list->invalidationType()]++;
+#endif
if (list->isRootedAtDocument())
m_listsInvalidatedAtDocument.add(list);
}
-void Document::unregisterNodeList(LiveNodeListBase* list)
+void Document::unregisterNodeList(const LiveNodeListBase* list)
{
+#if ENABLE(OILPAN)
+ ASSERT(m_nodeLists[list->invalidationType()].contains(list));
+ m_nodeLists[list->invalidationType()].remove(list);
+#else
m_nodeListCounts[list->invalidationType()]--;
+#endif
if (list->isRootedAtDocument()) {
ASSERT(m_listsInvalidatedAtDocument.contains(list));
m_listsInvalidatedAtDocument.remove(list);
}
}
+void Document::registerNodeListWithIdNameCache(const LiveNodeListBase* list)
+{
+#if ENABLE(OILPAN)
+ m_nodeLists[InvalidateOnIdNameAttrChange].add(list);
+#else
+ m_nodeListCounts[InvalidateOnIdNameAttrChange]++;
+#endif
+}
+
+void Document::unregisterNodeListWithIdNameCache(const LiveNodeListBase* list)
+{
+#if ENABLE(OILPAN)
+ ASSERT(m_nodeLists[InvalidateOnIdNameAttrChange].contains(list));
+ m_nodeLists[InvalidateOnIdNameAttrChange].remove(list);
+#else
+ ASSERT(m_nodeListCounts[InvalidateOnIdNameAttrChange] > 0);
+ m_nodeListCounts[InvalidateOnIdNameAttrChange]--;
+#endif
+}
+
void Document::attachNodeIterator(NodeIterator* ni)
{
m_nodeIterators.add(ni);
@@ -4514,63 +4545,63 @@ bool Document::hasSVGRootNode() const
return isSVGSVGElement(documentElement());
}
-PassRefPtr<HTMLCollection> Document::ensureCachedCollection(CollectionType type)
+PassRefPtrWillBeRawPtr<HTMLCollection> Document::ensureCachedCollection(CollectionType type)
{
return ensureRareData().ensureNodeLists().addCache<HTMLCollection>(*this, type);
}
-PassRefPtr<HTMLCollection> Document::images()
+PassRefPtrWillBeRawPtr<HTMLCollection> Document::images()
{
return ensureCachedCollection(DocImages);
}
-PassRefPtr<HTMLCollection> Document::applets()
+PassRefPtrWillBeRawPtr<HTMLCollection> Document::applets()
{
return ensureCachedCollection(DocApplets);
}
-PassRefPtr<HTMLCollection> Document::embeds()
+PassRefPtrWillBeRawPtr<HTMLCollection> Document::embeds()
{
return ensureCachedCollection(DocEmbeds);
}
-PassRefPtr<HTMLCollection> Document::scripts()
+PassRefPtrWillBeRawPtr<HTMLCollection> Document::scripts()
{
return ensureCachedCollection(DocScripts);
}
-PassRefPtr<HTMLCollection> Document::links()
+PassRefPtrWillBeRawPtr<HTMLCollection> Document::links()
{
return ensureCachedCollection(DocLinks);
}
-PassRefPtr<HTMLCollection> Document::forms()
+PassRefPtrWillBeRawPtr<HTMLCollection> Document::forms()
{
return ensureCachedCollection(DocForms);
}
-PassRefPtr<HTMLCollection> Document::anchors()
+PassRefPtrWillBeRawPtr<HTMLCollection> Document::anchors()
{
return ensureCachedCollection(DocAnchors);
}
-PassRefPtr<HTMLAllCollection> Document::allForBinding()
+PassRefPtrWillBeRawPtr<HTMLAllCollection> Document::allForBinding()
{
UseCounter::count(*this, UseCounter::DocumentAll);
return all();
}
-PassRefPtr<HTMLAllCollection> Document::all()
+PassRefPtrWillBeRawPtr<HTMLAllCollection> Document::all()
{
return ensureRareData().ensureNodeLists().addCache<HTMLAllCollection>(*this, DocAll);
}
-PassRefPtr<HTMLCollection> Document::windowNamedItems(const AtomicString& name)
+PassRefPtrWillBeRawPtr<HTMLCollection> Document::windowNamedItems(const AtomicString& name)
{
return ensureRareData().ensureNodeLists().addCache<HTMLNameCollection>(*this, WindowNamedItems, name);
}
-PassRefPtr<HTMLCollection> Document::documentNamedItems(const AtomicString& name)
+PassRefPtrWillBeRawPtr<HTMLCollection> Document::documentNamedItems(const AtomicString& name)
{
return ensureRareData().ensureNodeLists().addCache<HTMLNameCollection>(*this, DocumentNamedItems, name);
}
@@ -5648,27 +5679,29 @@ bool Document::hasFocus() const
return false;
}
-template<unsigned type>
-bool shouldInvalidateNodeListCachesForAttr(const unsigned nodeListCounts[], const QualifiedName& attrName)
-{
- if (nodeListCounts[type] && LiveNodeListBase::shouldInvalidateTypeOnAttributeChange(static_cast<NodeListInvalidationType>(type), attrName))
- return true;
- return shouldInvalidateNodeListCachesForAttr<type + 1>(nodeListCounts, attrName);
-}
-
-template<>
-bool shouldInvalidateNodeListCachesForAttr<numNodeListInvalidationTypes>(const unsigned[], const QualifiedName&)
-{
- return false;
-}
-
bool Document::shouldInvalidateNodeListCaches(const QualifiedName* attrName) const
{
- if (attrName)
- return shouldInvalidateNodeListCachesForAttr<DoNotInvalidateOnAttributeChanges + 1>(m_nodeListCounts, *attrName);
+ if (attrName) {
+ for (int type = 1; type < numNodeListInvalidationTypes; ++type) {
+#if ENABLE(OILPAN)
+ if (m_nodeLists[type].isEmpty()) {
+#else
+ if (!m_nodeListCounts[type]) {
+#endif
+ continue;
+ }
+
+ if (LiveNodeListBase::shouldInvalidateTypeOnAttributeChange(static_cast<NodeListInvalidationType>(type), *attrName))
+ return true;
+ }
+ }
- for (int type = 0; type < numNodeListInvalidationTypes; type++) {
+ for (int type = 0; type < numNodeListInvalidationTypes; ++type) {
+#if ENABLE(OILPAN)
+ if (!m_nodeLists[type].isEmpty())
+#else
if (m_nodeListCounts[type])
+#endif
return true;
}
@@ -5677,8 +5710,8 @@ bool Document::shouldInvalidateNodeListCaches(const QualifiedName* attrName) con
void Document::invalidateNodeListCaches(const QualifiedName* attrName)
{
- HashSet<LiveNodeListBase*>::iterator end = m_listsInvalidatedAtDocument.end();
- for (HashSet<LiveNodeListBase*>::iterator it = m_listsInvalidatedAtDocument.begin(); it != end; ++it)
+ WillBeHeapHashSet<RawPtrWillBeWeakMember<const LiveNodeListBase> >::const_iterator end = m_listsInvalidatedAtDocument.end();
+ for (WillBeHeapHashSet<RawPtrWillBeWeakMember<const LiveNodeListBase> >::const_iterator it = m_listsInvalidatedAtDocument.begin(); it != end; ++it)
(*it)->invalidateCacheForAttribute(attrName);
}
@@ -5712,6 +5745,11 @@ void Document::trace(Visitor* visitor)
visitor->trace(m_markers);
visitor->trace(m_currentScriptStack);
visitor->trace(m_transformSourceDocument);
+ visitor->trace(m_listsInvalidatedAtDocument);
+#if ENABLE(OILPAN)
+ for (int i = 0; i < numNodeListInvalidationTypes; ++i)
+ visitor->trace(m_nodeLists[i]);
+#endif
visitor->trace(m_cssCanvasElements);
visitor->trace(m_topLayerElements);
visitor->trace(m_elemSheet);
« no previous file with comments | « Source/core/dom/Document.h ('k') | Source/core/dom/Element.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698