From 58bd97db70a95efc7eb8f5eb337c26294b16c05b Mon Sep 17 00:00:00 2001 From: Ms2ger Date: Sun, 9 Feb 2014 09:04:36 +0100 Subject: [PATCH] Bug 968766 - Part i: Move the document.all NodeLists into a separate hashtable; r=jst --- content/base/src/nsDocument.cpp | 3 -- content/base/src/nsDocument.h | 4 --- content/html/document/src/nsHTMLDocument.cpp | 23 +++++---------- content/html/document/src/nsHTMLDocument.h | 1 + xpcom/glue/nsCycleCollectionParticipant.h | 31 ++++++++++++++++++++ 5 files changed, 40 insertions(+), 22 deletions(-) diff --git a/content/base/src/nsDocument.cpp b/content/base/src/nsDocument.cpp index 91189f9c7c50..1b65c096581e 100644 --- a/content/base/src/nsDocument.cpp +++ b/content/base/src/nsDocument.cpp @@ -241,9 +241,6 @@ nsIdentifierMapEntry::Traverse(nsCycleCollectionTraversalCallback* aCallback) "mIdentifierMap mNameContentList"); aCallback->NoteXPCOMChild(static_cast(mNameContentList)); - NS_CYCLE_COLLECTION_NOTE_EDGE_NAME(*aCallback, "mIdentifierMap mDocAllList"); - aCallback->NoteXPCOMChild(static_cast(mDocAllList)); - if (mImageElement) { NS_CYCLE_COLLECTION_NOTE_EDGE_NAME(*aCallback, "mIdentifierMap mImageElement element"); diff --git a/content/base/src/nsDocument.h b/content/base/src/nsDocument.h index bb09a62443ab..fd2edf27ccd2 100644 --- a/content/base/src/nsDocument.h +++ b/content/base/src/nsDocument.h @@ -189,9 +189,6 @@ public: void Traverse(nsCycleCollectionTraversalCallback* aCallback); - void SetDocAllList(nsContentList* aContentList) { mDocAllList = aContentList; } - nsContentList* GetDocAllList() { return mDocAllList; } - struct ChangeCallback { nsIDocument::IDTargetObserver mCallback; void* mData; @@ -236,7 +233,6 @@ private: // The elements are stored as weak pointers. nsSmallVoidArray mIdContentList; nsRefPtr mNameContentList; - nsRefPtr mDocAllList; nsAutoPtr > mChangeCallbacks; nsRefPtr mImageElement; }; diff --git a/content/html/document/src/nsHTMLDocument.cpp b/content/html/document/src/nsHTMLDocument.cpp index f91ed90fc003..c3d11ae6469f 100644 --- a/content/html/document/src/nsHTMLDocument.cpp +++ b/content/html/document/src/nsHTMLDocument.cpp @@ -199,8 +199,9 @@ nsHTMLDocument::~nsHTMLDocument() { } -NS_IMPL_CYCLE_COLLECTION_INHERITED_11(nsHTMLDocument, nsDocument, +NS_IMPL_CYCLE_COLLECTION_INHERITED_12(nsHTMLDocument, nsDocument, mAll, + mAllMap, mImages, mApplets, mEmbeds, @@ -2596,11 +2597,8 @@ nsHTMLDocument::GetDocumentAllList(const nsAString& aID, nsresult *aResult) { *aResult = NS_OK; - nsIdentifierMapEntry *entry = mIdentifierMap.PutEntry(aID); - if (!entry) { - *aResult = NS_ERROR_OUT_OF_MEMORY; - - return nullptr; + if (nsContentList* docAllList = mAllMap.GetWeak(aID)) { + return docAllList; } Element* root = GetRootElement(); @@ -2608,15 +2606,10 @@ nsHTMLDocument::GetDocumentAllList(const nsAString& aID, nsresult *aResult) return nullptr; } - nsRefPtr docAllList = entry->GetDocAllList(); - if (!docAllList) { - nsCOMPtr id = do_GetAtom(aID); - - docAllList = new nsContentList(root, DocAllResultMatch, - nullptr, nullptr, true, id); - entry->SetDocAllList(docAllList); - } - + nsCOMPtr id = do_GetAtom(aID); + nsRefPtr docAllList = + new nsContentList(root, DocAllResultMatch, nullptr, nullptr, true, id); + mAllMap.Put(aID, docAllList); return docAllList; } diff --git a/content/html/document/src/nsHTMLDocument.h b/content/html/document/src/nsHTMLDocument.h index 5f96115393d1..c475ec5db634 100644 --- a/content/html/document/src/nsHTMLDocument.h +++ b/content/html/document/src/nsHTMLDocument.h @@ -292,6 +292,7 @@ protected: nsRefPtr mFormControls; nsRefPtr mAll; + nsRefPtrHashtable mAllMap; /** # of forms in the document, synchronously set */ int32_t mNumForms; diff --git a/xpcom/glue/nsCycleCollectionParticipant.h b/xpcom/glue/nsCycleCollectionParticipant.h index 502bd1e63313..8d0057d03377 100644 --- a/xpcom/glue/nsCycleCollectionParticipant.h +++ b/xpcom/glue/nsCycleCollectionParticipant.h @@ -1145,6 +1145,37 @@ static NS_CYCLE_COLLECTION_INNERCLASS NS_CYCLE_COLLECTION_INNERNAME; NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_f11) \ NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END +#define NS_IMPL_CYCLE_COLLECTION_INHERITED_12(_class, _base, _f1, _f2, _f3, _f4, _f5, _f6, _f7, _f8, _f9, _f10, _f11, _f12) \ + NS_IMPL_CYCLE_COLLECTION_CLASS(_class) \ + NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_INHERITED(_class, _base) \ + NS_IMPL_CYCLE_COLLECTION_UNLINK(_f1) \ + NS_IMPL_CYCLE_COLLECTION_UNLINK(_f2) \ + NS_IMPL_CYCLE_COLLECTION_UNLINK(_f3) \ + NS_IMPL_CYCLE_COLLECTION_UNLINK(_f4) \ + NS_IMPL_CYCLE_COLLECTION_UNLINK(_f5) \ + NS_IMPL_CYCLE_COLLECTION_UNLINK(_f6) \ + NS_IMPL_CYCLE_COLLECTION_UNLINK(_f7) \ + NS_IMPL_CYCLE_COLLECTION_UNLINK(_f8) \ + NS_IMPL_CYCLE_COLLECTION_UNLINK(_f9) \ + NS_IMPL_CYCLE_COLLECTION_UNLINK(_f10) \ + NS_IMPL_CYCLE_COLLECTION_UNLINK(_f11) \ + NS_IMPL_CYCLE_COLLECTION_UNLINK(_f12) \ + NS_IMPL_CYCLE_COLLECTION_UNLINK_END \ + NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(_class, _base) \ + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_f1) \ + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_f2) \ + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_f3) \ + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_f4) \ + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_f5) \ + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_f6) \ + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_f7) \ + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_f8) \ + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_f9) \ + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_f10) \ + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_f11) \ + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_f12) \ + NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END + #define NS_CYCLE_COLLECTION_NOTE_EDGE_NAME CycleCollectionNoteEdgeName #endif // nsCycleCollectionParticipant_h__