diff --git a/parser/html/nsHtml5AtomTable.cpp b/parser/html/nsHtml5AtomTable.cpp index 06bad88bf477..b6db18409850 100644 --- a/parser/html/nsHtml5AtomTable.cpp +++ b/parser/html/nsHtml5AtomTable.cpp @@ -11,21 +11,19 @@ nsHtml5AtomTable::nsHtml5AtomTable() : mRecentlyUsedParserAtoms{} { #endif } -nsHtml5AtomTable::~nsHtml5AtomTable() {} +nsHtml5AtomTable::~nsHtml5AtomTable() = default; nsAtom* nsHtml5AtomTable::GetAtom(const nsAString& aKey) { -#ifdef DEBUG MOZ_ASSERT(mPermittedLookupEventTarget->IsOnCurrentThread()); -#endif - - uint32_t index = mozilla::HashString(aKey) % RECENTLY_USED_PARSER_ATOMS_SIZE; + uint32_t hash = mozilla::HashString(aKey); + uint32_t index = hash % RECENTLY_USED_PARSER_ATOMS_SIZE; if (nsAtom* atom = mRecentlyUsedParserAtoms[index]) { - if (atom->Equals(aKey)) { + if (atom->hash() == hash && atom->Equals(aKey)) { return atom; } } - RefPtr atom = NS_Atomize(aKey); + RefPtr atom = NS_Atomize(aKey, hash); nsAtom* ret = atom.get(); mRecentlyUsedParserAtoms[index] = std::move(atom); return ret; diff --git a/xpcom/ds/nsAtom.h b/xpcom/ds/nsAtom.h index 70cc0446fe0a..aa416e81ef49 100644 --- a/xpcom/ds/nsAtom.h +++ b/xpcom/ds/nsAtom.h @@ -247,6 +247,11 @@ already_AddRefed NS_Atomize(const char16_t* aUTF16String); // Find an atom that matches the given UTF-16 string. Never returns null. already_AddRefed NS_Atomize(const nsAString& aUTF16String); +// Find an atom that matches the given UTF-16 string, with a known +// already-computed hash via mozilla::HashString. Never returns null. +already_AddRefed NS_Atomize(const nsAString& aUTF16String, + uint32_t aKnownHash); + // An optimized version of the method above for the main thread. already_AddRefed NS_AtomizeMainThread(const nsAString& aUTF16String); diff --git a/xpcom/ds/nsAtomTable.cpp b/xpcom/ds/nsAtomTable.cpp index 8078e42076ea..c239ca0a53b9 100644 --- a/xpcom/ds/nsAtomTable.cpp +++ b/xpcom/ds/nsAtomTable.cpp @@ -11,6 +11,7 @@ #include "mozilla/MruCache.h" #include "mozilla/RWLock.h" #include "mozilla/TextUtils.h" +#include "nsHashKeys.h" #include "nsThreadUtils.h" #include "nsAtom.h" @@ -141,9 +142,16 @@ struct AtomTableKey { MOZ_ASSERT(HashString(mUTF16String, mLength) == mHash); } + AtomTableKey(const char16_t* aUTF16String, uint32_t aLength, uint32_t aHash) + : mUTF16String(aUTF16String), + mUTF8String(nullptr), + mLength(aLength), + mHash(aHash) { + MOZ_ASSERT(HashString(mUTF16String, mLength) == mHash); + } + AtomTableKey(const char16_t* aUTF16String, uint32_t aLength) - : mUTF16String(aUTF16String), mUTF8String(nullptr), mLength(aLength) { - mHash = HashString(mUTF16String, mLength); + : AtomTableKey(aUTF16String, aLength, HashString(aUTF16String, aLength)) { } AtomTableKey(const char* aUTF8String, uint32_t aLength, bool* aErr) @@ -209,7 +217,8 @@ class nsAtomTable { nsAtomSubTable& SelectSubTable(AtomTableKey& aKey); void AddSizeOfIncludingThis(MallocSizeOf aMallocSizeOf, AtomsSizes& aSizes); void GC(GCKind aKind); - already_AddRefed Atomize(const nsAString& aUTF16String); + already_AddRefed Atomize(const nsAString& aUTF16String, + uint32_t aHash); already_AddRefed Atomize(const nsACString& aUTF8String); already_AddRefed AtomizeMainThread(const nsAString& aUTF16String); nsStaticAtom* GetStaticAtom(const nsAString& aUTF16String); @@ -547,7 +556,7 @@ already_AddRefed nsAtomTable::Atomize(const nsACString& aUTF8String) { // and atomize the result. nsString str; CopyUTF8toUTF16(aUTF8String, str); - return Atomize(str); + return Atomize(str, HashString(str)); } nsAtomSubTable& table = SelectSubTable(key); { @@ -580,12 +589,12 @@ already_AddRefed NS_Atomize(const nsACString& aUTF8String) { } already_AddRefed NS_Atomize(const char16_t* aUTF16String) { - MOZ_ASSERT(gAtomTable); - return gAtomTable->Atomize(nsDependentString(aUTF16String)); + return NS_Atomize(nsDependentString(aUTF16String)); } -already_AddRefed nsAtomTable::Atomize(const nsAString& aUTF16String) { - AtomTableKey key(aUTF16String.Data(), aUTF16String.Length()); +already_AddRefed nsAtomTable::Atomize(const nsAString& aUTF16String, + uint32_t aHash) { + AtomTableKey key(aUTF16String.Data(), aUTF16String.Length(), aHash); nsAtomSubTable& table = SelectSubTable(key); { AutoReadLock lock(table.mLock); @@ -608,9 +617,14 @@ already_AddRefed nsAtomTable::Atomize(const nsAString& aUTF16String) { return atom.forget(); } -already_AddRefed NS_Atomize(const nsAString& aUTF16String) { +already_AddRefed NS_Atomize(const nsAString& aUTF16String, + uint32_t aKnownHash) { MOZ_ASSERT(gAtomTable); - return gAtomTable->Atomize(aUTF16String); + return gAtomTable->Atomize(aUTF16String, aKnownHash); +} + +already_AddRefed NS_Atomize(const nsAString& aUTF16String) { + return NS_Atomize(aUTF16String, HashString(aUTF16String)); } already_AddRefed nsAtomTable::AtomizeMainThread(