зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1676688 - Part 4: Use HashSet in ParserAtomTable. r=arai
Differential Revision: https://phabricator.services.mozilla.com/D96897
This commit is contained in:
Родитель
cee7e57c4c
Коммит
9ffbf2b06d
|
@ -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);
|
||||||
|
|
Загрузка…
Ссылка в новой задаче