diff --git a/parser/html/nsHtml5AtomTable.cpp b/parser/html/nsHtml5AtomTable.cpp
index d523f58b0..1b6b72fff 100644
--- a/parser/html/nsHtml5AtomTable.cpp
+++ b/parser/html/nsHtml5AtomTable.cpp
@@ -24,6 +24,7 @@ nsHtml5AtomEntry::~nsHtml5AtomEntry()
}
nsHtml5AtomTable::nsHtml5AtomTable()
+ : mRecentlyUsedParserAtoms()
{
#ifdef DEBUG
NS_GetMainThread(getter_AddRefs(mPermittedLookupThread));
@@ -44,13 +45,23 @@ nsHtml5AtomTable::GetAtom(const nsAString& aKey)
NS_ASSERTION(mPermittedLookupThread == currentThread, "Wrong thread!");
}
#endif
+
+ uint32_t index = mozilla::HashString(aKey) % RECENTLY_USED_PARSER_ATOMS_SIZE;
+ nsIAtom* cachedAtom = mRecentlyUsedParserAtoms[index];
+ if (cachedAtom && cachedAtom->Equals(aKey)) {
+ return cachedAtom;
+ }
+
nsIAtom* atom = NS_GetStaticAtom(aKey);
if (atom) {
+ mRecentlyUsedParserAtoms[index] = atom;
return atom;
}
nsHtml5AtomEntry* entry = mTable.PutEntry(aKey);
if (!entry) {
return nullptr;
}
+
+ mRecentlyUsedParserAtoms[index] = entry->GetAtom();
return entry->GetAtom();
}
diff --git a/parser/html/nsHtml5AtomTable.h b/parser/html/nsHtml5AtomTable.h
index a7df2192d..a6ab4af31 100644
--- a/parser/html/nsHtml5AtomTable.h
+++ b/parser/html/nsHtml5AtomTable.h
@@ -11,6 +11,8 @@
#include "nsIAtom.h"
#include "nsIThread.h"
+#define RECENTLY_USED_PARSER_ATOMS_SIZE 31
+
class nsHtml5Atom;
class nsHtml5AtomEntry : public nsStringHashKey
@@ -92,6 +94,9 @@ class nsHtml5AtomTable
* Empties the table.
*/
void Clear() {
+ for (uint32_t i = 0; i < RECENTLY_USED_PARSER_ATOMS_SIZE; ++i) {
+ mRecentlyUsedParserAtoms[i] = nullptr;
+ }
mTable.Clear();
}
@@ -103,6 +108,7 @@ class nsHtml5AtomTable
private:
nsTHashtable mTable;
+ nsIAtom* mRecentlyUsedParserAtoms[RECENTLY_USED_PARSER_ATOMS_SIZE];
#ifdef DEBUG
nsCOMPtr mPermittedLookupThread;
#endif