summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMoonchild <moonchild@palemoon.org>2022-04-16 16:27:21 +0000
committerMoonchild <moonchild@palemoon.org>2022-04-16 16:27:21 +0000
commit95cda916d103651472d27261b6a4464cad6b5130 (patch)
tree7d65173ab28577f6090941509b329356f8704ad3
parent08842d77aef11d7d9690feba8e8707315a511f88 (diff)
parent4ea9a83b7500a84bd6e3095ac55296a761eb4962 (diff)
downloaduxp-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
-rw-r--r--layout/base/nsGenConList.cpp11
-rw-r--r--layout/base/nsGenConList.h6
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___ */