Reviewed by Maciej.
authorthatcher <thatcher@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 2 Dec 2005 09:13:26 +0000 (09:13 +0000)
committerthatcher <thatcher@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 2 Dec 2005 09:13:26 +0000 (09:13 +0000)
        Cache the lastItem and lastItemOffset for fast retrieval of the
        same index or indeicies greater than lastItemOffset. Also cache
        the length. Like other node lists these cached values rest when the
        subtree under the root node changes.

        * khtml/xml/dom_nodeimpl.cpp:
        (ChildNodeListImpl::length): Use cachedLength when possible.
        (ChildNodeListImpl::item): Use lastItemOffset and lastItem if we can.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@11396 268f45cc-cd09-0410-ab3c-d52691b4dbfc

WebCore/ChangeLog-2005-12-19
WebCore/khtml/xml/dom_nodeimpl.cpp

index b33b8c4e1ef592d687959f8bcbbdd49ff9db2c17..18c63da5fd9e9dce55ed5640fe3a4b0f7ca9f30f 100644 (file)
@@ -1,3 +1,16 @@
+2005-12-02  Timothy Hatcher  <timothy@apple.com>
+
+        Reviewed by Maciej.
+
+        Cache the lastItem and lastItemOffset for fast retrieval of the
+        same index or indeicies greater than lastItemOffset. Also cache
+        the length. Like other node lists these cached values rest when the
+        subtree under the root node changes.
+
+        * khtml/xml/dom_nodeimpl.cpp:
+        (ChildNodeListImpl::length): Use cachedLength when possible.
+        (ChildNodeListImpl::item): Use lastItemOffset and lastItem if we can.
+
 2005-12-01  Graham Dennis  <Graham.Dennis@gmail.com>
     
         <http://bugzilla.opendarwin.org/show_bug.cgi?id=4003>
index 2b5e3317cf92785b8daba471a82f10ee07adf347..db2ee38ba367a65df49c0a6360cf57b29016a152 100644 (file)
@@ -2915,7 +2915,7 @@ NodeImpl *NodeListImpl::recursiveItem ( unsigned offset, NodeImpl *start) const
                 if (!remainingOffset) {
                     lastItem = n;
                     lastItemOffset = offset;
-                    isItemCacheValid = 1;
+                    isItemCacheValid = true;
                     return n;
                 }
                 remainingOffset--;
@@ -2962,6 +2962,7 @@ void NodeListImpl::rootNodeChildrenChanged()
 {
     isLengthCacheValid = false;
     isItemCacheValid = false;     
+    lastItem = 0;
 }
 
 ChildNodeListImpl::ChildNodeListImpl( NodeImpl *n )
@@ -2971,11 +2972,17 @@ ChildNodeListImpl::ChildNodeListImpl( NodeImpl *n )
 
 unsigned ChildNodeListImpl::length() const
 {
+    if (isLengthCacheValid)
+        return cachedLength;
+
     unsigned len = 0;
     NodeImpl *n;
     for(n = rootNode->firstChild(); n != 0; n = n->nextSibling())
         len++;
 
+    cachedLength = len;
+    isLengthCacheValid = true;
+
     return len;
 }
 
@@ -2984,13 +2991,28 @@ NodeImpl *ChildNodeListImpl::item ( unsigned index ) const
     unsigned int pos = 0;
     NodeImpl *n = rootNode->firstChild();
 
-    while( n != 0 && pos < index )
-    {
+    if (isItemCacheValid) {
+        if (index == lastItemOffset) {
+            return lastItem;
+        } else if (index > lastItemOffset) {
+            n = lastItem;
+            pos = lastItemOffset;
+        }
+    }
+
+    while (n && pos < index) {
         n = n->nextSibling();
         pos++;
     }
 
-    return n;
+    if (n) {
+        lastItem = n;
+        lastItemOffset = pos;
+        isItemCacheValid = true;
+        return n;
+    }
+
+    return 0;
 }
 
 bool ChildNodeListImpl::nodeMatches(NodeImpl *testNode) const