Index: Source/core/dom/Document.cpp |
diff --git a/Source/core/dom/Document.cpp b/Source/core/dom/Document.cpp |
index 1d88dad2de2f487beae9c3360d3be30767429b41..31e1818108c426e95b796694d3db2f5c651cb700 100644 |
--- a/Source/core/dom/Document.cpp |
+++ b/Source/core/dom/Document.cpp |
@@ -5669,21 +5669,44 @@ bool Document::hasFocus() const |
return false; |
} |
+#if ENABLE(OILPAN) |
+template<unsigned type> |
+bool shouldInvalidateNodeListCachesForAttr(const HeapHashSet<WeakMember<const LiveNodeListBase> > nodeLists[], const QualifiedName& attrName) |
+{ |
+ if (!nodeLists[type].isEmpty() && LiveNodeListBase::shouldInvalidateTypeOnAttributeChange(static_cast<NodeListInvalidationType>(type), attrName)) |
+ return true; |
+ return shouldInvalidateNodeListCachesForAttr<type + 1>(nodeLists, attrName); |
+} |
+ |
+template<> |
+bool shouldInvalidateNodeListCachesForAttr<numNodeListInvalidationTypes>(const HeapHashSet<WeakMember<const LiveNodeListBase> >[], const QualifiedName&) |
+{ |
+ return false; |
+} |
+#else |
+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; |
+} |
+#endif |
+ |
bool Document::shouldInvalidateNodeListCaches(const QualifiedName* attrName) const |
{ |
if (attrName) { |
- for (int type = 1; type < numNodeListInvalidationTypes; ++type) { |
#if ENABLE(OILPAN) |
- if (m_nodeLists[type].isEmpty()) { |
+ return shouldInvalidateNodeListCachesForAttr<DoNotInvalidateOnAttributeChanges + 1>(m_nodeLists, *attrName); |
#else |
- if (!m_nodeListCounts[type]) { |
+ return shouldInvalidateNodeListCachesForAttr<DoNotInvalidateOnAttributeChanges + 1>(m_nodeListCounts, *attrName); |
#endif |
- continue; |
- } |
- |
- if (LiveNodeListBase::shouldInvalidateTypeOnAttributeChange(static_cast<NodeListInvalidationType>(type), *attrName)) |
- return true; |
- } |
} |
for (int type = 0; type < numNodeListInvalidationTypes; ++type) { |