Bug 1676688 - Part 4: Use HashSet in ParserAtomTable. r=arai

Differential Revision: https://phabricator.services.mozilla.com/D96897
This commit is contained in:
Ted Campbell 2020-11-12 20:37:31 +00:00
Родитель cee7e57c4c
Коммит 9ffbf2b06d
2 изменённых файлов: 16 добавлений и 18 удалений

Просмотреть файл

@ -311,7 +311,7 @@ ParserAtomsTable::ParserAtomsTable(JSRuntime* rt, LifoAlloc& alloc,
entries_(entries) {} entries_(entries) {}
JS::Result<const ParserAtom*, OOM> ParserAtomsTable::addEntry( JS::Result<const ParserAtom*, OOM> ParserAtomsTable::addEntry(
JSContext* cx, EntryMap::AddPtr& addPtr, ParserAtomEntry* entry) { JSContext* cx, EntrySet::AddPtr& addPtr, ParserAtomEntry* entry) {
MOZ_ASSERT(!addPtr); MOZ_ASSERT(!addPtr);
ParserAtomIndex index = ParserAtomIndex(entries_.length()); ParserAtomIndex index = ParserAtomIndex(entries_.length());
if (size_t(index) >= TaggedParserAtomIndex::IndexLimit) { if (size_t(index) >= TaggedParserAtomIndex::IndexLimit) {
@ -322,7 +322,7 @@ JS::Result<const ParserAtom*, OOM> ParserAtomsTable::addEntry(
return RaiseParserAtomsOOMError(cx); return RaiseParserAtomsOOMError(cx);
} }
entry->setParserAtomIndex(index); entry->setParserAtomIndex(index);
if (!entryMap_.add(addPtr, entry, index)) { if (!entrySet_.add(addPtr, entry)) {
return RaiseParserAtomsOOMError(cx); return RaiseParserAtomsOOMError(cx);
} }
return entry->asAtom(); return entry->asAtom();
@ -330,7 +330,7 @@ JS::Result<const ParserAtom*, OOM> ParserAtomsTable::addEntry(
template <typename AtomCharT, typename SeqCharT> template <typename AtomCharT, typename SeqCharT>
JS::Result<const ParserAtom*, OOM> ParserAtomsTable::internChar16Seq( JS::Result<const ParserAtom*, OOM> ParserAtomsTable::internChar16Seq(
JSContext* cx, EntryMap::AddPtr& addPtr, HashNumber hash, JSContext* cx, EntrySet::AddPtr& addPtr, HashNumber hash,
InflatedChar16Sequence<SeqCharT> seq, uint32_t length) { InflatedChar16Sequence<SeqCharT> seq, uint32_t length) {
MOZ_ASSERT(!addPtr); MOZ_ASSERT(!addPtr);
@ -364,9 +364,9 @@ JS::Result<const ParserAtom*, OOM> ParserAtomsTable::internLatin1(
} }
// Check for existing atom. // Check for existing atom.
auto addPtr = entryMap_.lookupForAdd(lookup); auto addPtr = entrySet_.lookupForAdd(lookup);
if (addPtr) { if (addPtr) {
return addPtr->key()->asAtom(); return (*addPtr)->asAtom();
} }
return internChar16Seq<Latin1Char>(cx, addPtr, lookup.hash(), seq, length); return internChar16Seq<Latin1Char>(cx, addPtr, lookup.hash(), seq, length);
@ -467,9 +467,9 @@ JS::Result<const ParserAtom*, OOM> ParserAtomsTable::internUtf8(
InflatedChar16Sequence<mozilla::Utf8Unit> seq(utf8Ptr, nbyte); InflatedChar16Sequence<mozilla::Utf8Unit> seq(utf8Ptr, nbyte);
SpecificParserAtomLookup<mozilla::Utf8Unit> lookup(seq); SpecificParserAtomLookup<mozilla::Utf8Unit> lookup(seq);
MOZ_ASSERT(wellKnownTable_.lookupChar16Seq(lookup) == nullptr); MOZ_ASSERT(wellKnownTable_.lookupChar16Seq(lookup) == nullptr);
EntryMap::AddPtr addPtr = entryMap_.lookupForAdd(lookup); EntrySet::AddPtr addPtr = entrySet_.lookupForAdd(lookup);
if (addPtr) { if (addPtr) {
return addPtr->key()->asAtom(); return (*addPtr)->asAtom();
} }
// Compute length in code-points. // Compute length in code-points.
@ -503,9 +503,9 @@ JS::Result<const ParserAtom*, OOM> ParserAtomsTable::internChar16(
} }
// Check for existing atom. // Check for existing atom.
EntryMap::AddPtr addPtr = entryMap_.lookupForAdd(lookup); EntrySet::AddPtr addPtr = entrySet_.lookupForAdd(lookup);
if (addPtr) { if (addPtr) {
return addPtr->key()->asAtom(); return (*addPtr)->asAtom();
} }
// Compute the target encoding. // Compute the target encoding.
@ -597,9 +597,9 @@ JS::Result<const ParserAtom*, OOM> ParserAtomsTable::concatAtoms(
SpecificParserAtomLookup<const ParserAtom*> lookup(seq); SpecificParserAtomLookup<const ParserAtom*> lookup(seq);
// Check for existing atom. // Check for existing atom.
auto addPtr = entryMap_.lookupForAdd(lookup); auto addPtr = entrySet_.lookupForAdd(lookup);
if (addPtr) { if (addPtr) {
return addPtr->key()->asAtom(); return (*addPtr)->asAtom();
} }
// Otherwise, add new entry. // Otherwise, add new entry.

Просмотреть файл

@ -657,9 +657,9 @@ class ParserAtomsTable {
LifoAlloc& alloc_; LifoAlloc& alloc_;
// The ParserAtomEntry are owned by the LifoAlloc. // The ParserAtomEntry are owned by the LifoAlloc.
using EntryMap = HashMap<ParserAtomEntry*, ParserAtomIndex, using EntrySet = HashSet<const ParserAtomEntry*, ParserAtomLookupHasher,
ParserAtomLookupHasher, js::SystemAllocPolicy>; js::SystemAllocPolicy>;
EntryMap entryMap_; EntrySet entrySet_;
ParserAtomVector& entries_; ParserAtomVector& entries_;
public: public:
@ -670,16 +670,14 @@ class ParserAtomsTable {
// Internal APIs for interning to the table after well-known atoms cases have // Internal APIs for interning to the table after well-known atoms cases have
// been tested. // been tested.
JS::Result<const ParserAtom*, OOM> addEntry(JSContext* cx, JS::Result<const ParserAtom*, OOM> addEntry(JSContext* cx,
EntryMap::AddPtr& addPtr, EntrySet::AddPtr& addPtr,
ParserAtomEntry* entry); ParserAtomEntry* entry);
template <typename AtomCharT, typename SeqCharT> template <typename AtomCharT, typename SeqCharT>
JS::Result<const ParserAtom*, OOM> internChar16Seq( JS::Result<const ParserAtom*, OOM> internChar16Seq(
JSContext* cx, EntryMap::AddPtr& addPtr, HashNumber hash, JSContext* cx, EntrySet::AddPtr& addPtr, HashNumber hash,
InflatedChar16Sequence<SeqCharT> seq, uint32_t length); InflatedChar16Sequence<SeqCharT> seq, uint32_t length);
public: public:
bool empty() const { return entryMap_.empty(); }
JS::Result<const ParserAtom*, OOM> internAscii(JSContext* cx, JS::Result<const ParserAtom*, OOM> internAscii(JSContext* cx,
const char* asciiPtr, const char* asciiPtr,
uint32_t length); uint32_t length);