diff options
author | Moonchild <moonchild@palemoon.org> | 2022-04-16 16:27:21 +0000 |
---|---|---|
committer | Moonchild <moonchild@palemoon.org> | 2022-04-16 16:27:21 +0000 |
commit | 95cda916d103651472d27261b6a4464cad6b5130 (patch) | |
tree | 7d65173ab28577f6090941509b329356f8704ad3 /layout | |
parent | 08842d77aef11d7d9690feba8e8707315a511f88 (diff) | |
parent | 4ea9a83b7500a84bd6e3095ac55296a761eb4962 (diff) | |
download | uxp-95cda916d103651472d27261b6a4464cad6b5130.tar.gz |
Merge pull request 'Cache the most recent nsGenConNode to speed up future insertions' (#1867) from win7-7/UXP:pr-1861 into master
Reviewed-on: https://repo.palemoon.org/MoonchildProductions/UXP/pulls/1867
Diffstat (limited to 'layout')
-rw-r--r-- | layout/base/nsGenConList.cpp | 11 | ||||
-rw-r--r-- | layout/base/nsGenConList.h | 6 |
2 files changed, 16 insertions, 1 deletions
diff --git a/layout/base/nsGenConList.cpp b/layout/base/nsGenConList.cpp index bdb47e1838..fb0733f2e7 100644 --- a/layout/base/nsGenConList.cpp +++ b/layout/base/nsGenConList.cpp @@ -19,6 +19,7 @@ nsGenConList::Clear() delete node; } mSize = 0; + mLastInserted = nullptr; } bool @@ -41,6 +42,9 @@ nsGenConList::DestroyNodesFor(nsIFrame* aFrame) node = nextNode; } + // Modification of the list invalidates the cached pointer. + mLastInserted = nullptr; + return true; } @@ -108,6 +112,11 @@ nsGenConList::Insert(nsGenConNode* aNode) // Check for append. if (mList.isEmpty() || NodeAfter(aNode, mList.getLast())) { mList.insertBack(aNode); + } else if (mLastInserted && mLastInserted != mList.getLast() && + NodeAfter(aNode, mLastInserted) && + NodeAfter(Next(mLastInserted), aNode)) { + // Fast path for inserting many consecutive nodes in one place + mLastInserted->setNext(aNode); } else { // Binary search. @@ -142,6 +151,8 @@ nsGenConList::Insert(nsGenConNode* aNode) } ++mSize; + mLastInserted = aNode; + // Set the mapping only if it is the first node of the frame. // The DEBUG blocks below are for ensuring the invariant required by // nsGenConList::DestroyNodesFor. See comment there. diff --git a/layout/base/nsGenConList.h b/layout/base/nsGenConList.h index 55bf6bc32e..58421d4301 100644 --- a/layout/base/nsGenConList.h +++ b/layout/base/nsGenConList.h @@ -86,7 +86,7 @@ protected: uint32_t mSize; public: - nsGenConList() : mSize(0) {} + nsGenConList() : mSize(0), mLastInserted(nullptr) {} ~nsGenConList() { Clear(); } void Clear(); static nsGenConNode* Next(nsGenConNode* aNode) { @@ -127,6 +127,10 @@ private: // Map from frame to the first nsGenConNode of it in the list. nsDataHashtable<nsPtrHashKey<nsIFrame>, nsGenConNode*> mNodes; + + // A weak pointer to the node most recently inserted, used to avoid repeated + // list traversals in Insert(). + nsGenConNode* mLastInserted; }; #endif /* nsGenConList_h___ */ |