summaryrefslogtreecommitdiff
path: root/deps/v8/src/objects/ordered-hash-table.cc
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/src/objects/ordered-hash-table.cc')
-rw-r--r--deps/v8/src/objects/ordered-hash-table.cc204
1 files changed, 99 insertions, 105 deletions
diff --git a/deps/v8/src/objects/ordered-hash-table.cc b/deps/v8/src/objects/ordered-hash-table.cc
index 0b52160805..3d628cc406 100644
--- a/deps/v8/src/objects/ordered-hash-table.cc
+++ b/deps/v8/src/objects/ordered-hash-table.cc
@@ -4,10 +4,10 @@
#include "src/objects/ordered-hash-table.h"
+#include "src/execution/isolate.h"
#include "src/heap/heap-inl.h"
-#include "src/isolate.h"
-#include "src/objects-inl.h"
#include "src/objects/js-collection-inl.h"
+#include "src/objects/objects-inl.h"
#include "src/objects/ordered-hash-table-inl.h"
namespace v8 {
@@ -86,10 +86,10 @@ Handle<Derived> OrderedHashTable<Derived, entrysize>::Clear(
template <class Derived, int entrysize>
bool OrderedHashTable<Derived, entrysize>::HasKey(Isolate* isolate,
Derived table, Object key) {
- DCHECK_IMPLIES(entrysize == 1, table->IsOrderedHashSet());
- DCHECK_IMPLIES(entrysize == 2, table->IsOrderedHashMap());
+ DCHECK_IMPLIES(entrysize == 1, table.IsOrderedHashSet());
+ DCHECK_IMPLIES(entrysize == 2, table.IsOrderedHashMap());
DisallowHeapAllocation no_gc;
- int entry = table->FindEntry(isolate, key);
+ int entry = table.FindEntry(isolate, key);
return entry != kNotFound;
}
@@ -99,21 +99,21 @@ int OrderedHashTable<Derived, entrysize>::FindEntry(Isolate* isolate,
int entry;
// This special cases for Smi, so that we avoid the HandleScope
// creation below.
- if (key->IsSmi()) {
+ if (key.IsSmi()) {
uint32_t hash = ComputeUnseededHash(Smi::ToInt(key));
entry = HashToEntry(hash & Smi::kMaxValue);
} else {
HandleScope scope(isolate);
- Object hash = key->GetHash();
+ Object hash = key.GetHash();
// If the object does not have an identity hash, it was never used as a key
- if (hash->IsUndefined(isolate)) return kNotFound;
+ if (hash.IsUndefined(isolate)) return kNotFound;
entry = HashToEntry(Smi::ToInt(hash));
}
// Walk the chain in the bucket to find the key.
while (entry != kNotFound) {
Object candidate_key = KeyAt(entry);
- if (candidate_key->SameValueZero(key)) break;
+ if (candidate_key.SameValueZero(key)) break;
entry = NextChainEntry(entry);
}
@@ -123,13 +123,13 @@ int OrderedHashTable<Derived, entrysize>::FindEntry(Isolate* isolate,
Handle<OrderedHashSet> OrderedHashSet::Add(Isolate* isolate,
Handle<OrderedHashSet> table,
Handle<Object> key) {
- int hash = key->GetOrCreateHash(isolate)->value();
+ int hash = key->GetOrCreateHash(isolate).value();
int entry = table->HashToEntry(hash);
// Walk the chain of the bucket and try finding the key.
while (entry != kNotFound) {
Object candidate_key = table->KeyAt(entry);
// Do not add if we have the key already
- if (candidate_key->SameValueZero(*key)) return table;
+ if (candidate_key.SameValueZero(*key)) return table;
entry = table->NextChainEntry(entry);
}
@@ -164,12 +164,12 @@ Handle<FixedArray> OrderedHashSet::ConvertToKeysArray(
Object key = table->get(index);
if (convert == GetKeysConversion::kConvertToString) {
uint32_t index_value;
- if (key->ToArrayIndex(&index_value)) {
+ if (key.ToArrayIndex(&index_value)) {
// Avoid trashing the Number2String cache if indices get very large.
bool use_cache = i < kMaxStringTableEntries;
key = *isolate->factory()->Uint32ToString(index_value, use_cache);
} else {
- CHECK(key->IsName());
+ CHECK(key.IsName());
}
}
result->set(i, key);
@@ -203,12 +203,12 @@ Handle<Derived> OrderedHashTable<Derived, entrysize>::Rehash(
DisallowHeapAllocation no_gc;
for (int old_entry = 0; old_entry < (nof + nod); ++old_entry) {
Object key = table->KeyAt(old_entry);
- if (key->IsTheHole(isolate)) {
+ if (key.IsTheHole(isolate)) {
table->SetRemovedIndexAt(removed_holes_index++, old_entry);
continue;
}
- Object hash = key->GetHash();
+ Object hash = key.GetHash();
int bucket = Smi::ToInt(hash) & (new_buckets - 1);
Object chain_entry = new_table->get(HashTableStartIndex() + bucket);
new_table->set(HashTableStartIndex() + bucket, Smi::FromInt(new_entry));
@@ -257,20 +257,20 @@ template <class Derived, int entrysize>
bool OrderedHashTable<Derived, entrysize>::Delete(Isolate* isolate,
Derived table, Object key) {
DisallowHeapAllocation no_gc;
- int entry = table->FindEntry(isolate, key);
+ int entry = table.FindEntry(isolate, key);
if (entry == kNotFound) return false;
- int nof = table->NumberOfElements();
- int nod = table->NumberOfDeletedElements();
- int index = table->EntryToIndex(entry);
+ int nof = table.NumberOfElements();
+ int nod = table.NumberOfDeletedElements();
+ int index = table.EntryToIndex(entry);
Object hole = ReadOnlyRoots(isolate).the_hole_value();
for (int i = 0; i < entrysize; ++i) {
- table->set(index + i, hole);
+ table.set(index + i, hole);
}
- table->SetNumberOfElements(nof - 1);
- table->SetNumberOfDeletedElements(nod + 1);
+ table.SetNumberOfElements(nof - 1);
+ table.SetNumberOfDeletedElements(nod + 1);
return true;
}
@@ -278,11 +278,11 @@ bool OrderedHashTable<Derived, entrysize>::Delete(Isolate* isolate,
Address OrderedHashMap::GetHash(Isolate* isolate, Address raw_key) {
DisallowHeapAllocation no_gc;
Object key(raw_key);
- Object hash = key->GetHash();
+ Object hash = key.GetHash();
// If the object does not have an identity hash, it was never used as a key
- if (hash->IsUndefined(isolate)) return Smi::FromInt(-1).ptr();
- DCHECK(hash->IsSmi());
- DCHECK_GE(Smi::cast(hash)->value(), 0);
+ if (hash.IsUndefined(isolate)) return Smi::FromInt(-1).ptr();
+ DCHECK(hash.IsSmi());
+ DCHECK_GE(Smi::cast(hash).value(), 0);
return hash.ptr();
}
@@ -290,7 +290,7 @@ Handle<OrderedHashMap> OrderedHashMap::Add(Isolate* isolate,
Handle<OrderedHashMap> table,
Handle<Object> key,
Handle<Object> value) {
- int hash = key->GetOrCreateHash(isolate)->value();
+ int hash = key->GetOrCreateHash(isolate).value();
int entry = table->HashToEntry(hash);
// Walk the chain of the bucket and try finding the key.
{
@@ -299,7 +299,7 @@ Handle<OrderedHashMap> OrderedHashMap::Add(Isolate* isolate,
while (entry != kNotFound) {
Object candidate_key = table->KeyAt(entry);
// Do not add if we have the key already
- if (candidate_key->SameValueZero(raw_key)) return table;
+ if (candidate_key.SameValueZero(raw_key)) return table;
entry = table->NextChainEntry(entry);
}
}
@@ -326,14 +326,14 @@ V8_EXPORT_PRIVATE int OrderedHashTable<OrderedNameDictionary, 3>::FindEntry(
Isolate* isolate, Object key) {
DisallowHeapAllocation no_gc;
- DCHECK(key->IsUniqueName());
+ DCHECK(key.IsUniqueName());
Name raw_key = Name::cast(key);
- int entry = HashToEntry(raw_key->Hash());
+ int entry = HashToEntry(raw_key.Hash());
while (entry != kNotFound) {
Object candidate_key = KeyAt(entry);
- DCHECK(candidate_key->IsTheHole() ||
- Name::cast(candidate_key)->IsUniqueName());
+ DCHECK(candidate_key.IsTheHole() ||
+ Name::cast(candidate_key).IsUniqueName());
if (candidate_key == raw_key) return entry;
// TODO(gsathya): This is loading the bucket count from the hash
@@ -377,7 +377,7 @@ Handle<OrderedNameDictionary> OrderedNameDictionary::Add(
void OrderedNameDictionary::SetEntry(Isolate* isolate, int entry, Object key,
Object value, PropertyDetails details) {
DisallowHeapAllocation gc;
- DCHECK_IMPLIES(!key->IsName(), key->IsTheHole(isolate));
+ DCHECK_IMPLIES(!key.IsName(), key.IsTheHole(isolate));
DisallowHeapAllocation no_gc;
int index = EntryToIndex(entry);
this->set(index, key);
@@ -554,7 +554,7 @@ MaybeHandle<SmallOrderedHashSet> SmallOrderedHashSet::Add(
}
}
- int hash = key->GetOrCreateHash(isolate)->value();
+ int hash = key->GetOrCreateHash(isolate).value();
int nof = table->NumberOfElements();
// Read the existing bucket values.
@@ -597,7 +597,7 @@ MaybeHandle<SmallOrderedHashMap> SmallOrderedHashMap::Add(
}
}
- int hash = key->GetOrCreateHash(isolate)->value();
+ int hash = key->GetOrCreateHash(isolate).value();
int nof = table->NumberOfElements();
// Read the existing bucket values.
@@ -633,10 +633,10 @@ int V8_EXPORT_PRIVATE
SmallOrderedHashTable<SmallOrderedNameDictionary>::FindEntry(Isolate* isolate,
Object key) {
DisallowHeapAllocation no_gc;
- DCHECK(key->IsUniqueName());
+ DCHECK(key.IsUniqueName());
Name raw_key = Name::cast(key);
- int entry = HashToFirstEntry(raw_key->Hash());
+ int entry = HashToFirstEntry(raw_key.Hash());
// Walk the chain in the bucket to find the key.
while (entry != kNotFound) {
@@ -692,7 +692,7 @@ MaybeHandle<SmallOrderedNameDictionary> SmallOrderedNameDictionary::Add(
void SmallOrderedNameDictionary::SetEntry(Isolate* isolate, int entry,
Object key, Object value,
PropertyDetails details) {
- DCHECK_IMPLIES(!key->IsName(), key->IsTheHole(isolate));
+ DCHECK_IMPLIES(!key.IsName(), key.IsTheHole(isolate));
SetDataEntry(entry, SmallOrderedNameDictionary::kValueIndex, value);
SetDataEntry(entry, SmallOrderedNameDictionary::kKeyIndex, key);
@@ -713,19 +713,19 @@ template <class Derived>
bool SmallOrderedHashTable<Derived>::Delete(Isolate* isolate, Derived table,
Object key) {
DisallowHeapAllocation no_gc;
- int entry = table->FindEntry(isolate, key);
+ int entry = table.FindEntry(isolate, key);
if (entry == kNotFound) return false;
- int nof = table->NumberOfElements();
- int nod = table->NumberOfDeletedElements();
+ int nof = table.NumberOfElements();
+ int nod = table.NumberOfDeletedElements();
Object hole = ReadOnlyRoots(isolate).the_hole_value();
for (int j = 0; j < Derived::kEntrySize; j++) {
- table->SetDataEntry(entry, j, hole);
+ table.SetDataEntry(entry, j, hole);
}
- table->SetNumberOfElements(nof - 1);
- table->SetNumberOfDeletedElements(nod + 1);
+ table.SetNumberOfElements(nof - 1);
+ table.SetNumberOfDeletedElements(nod + 1);
return true;
}
@@ -765,9 +765,9 @@ Handle<Derived> SmallOrderedHashTable<Derived>::Rehash(Isolate* isolate,
DisallowHeapAllocation no_gc;
for (int old_entry = 0; old_entry < (nof + nod); ++old_entry) {
Object key = table->KeyAt(old_entry);
- if (key->IsTheHole(isolate)) continue;
+ if (key.IsTheHole(isolate)) continue;
- int hash = Smi::ToInt(key->GetHash());
+ int hash = Smi::ToInt(key.GetHash());
int bucket = new_table->HashToBucket(hash);
int chain = new_table->GetFirstEntry(bucket);
@@ -848,15 +848,15 @@ MaybeHandle<Derived> SmallOrderedHashTable<Derived>::Grow(
template <class Derived>
int SmallOrderedHashTable<Derived>::FindEntry(Isolate* isolate, Object key) {
DisallowHeapAllocation no_gc;
- Object hash = key->GetHash();
+ Object hash = key.GetHash();
- if (hash->IsUndefined(isolate)) return kNotFound;
+ if (hash.IsUndefined(isolate)) return kNotFound;
int entry = HashToFirstEntry(Smi::ToInt(hash));
// Walk the chain in the bucket to find the key.
while (entry != kNotFound) {
Object candidate_key = KeyAt(entry);
- if (candidate_key->SameValueZero(key)) return entry;
+ if (candidate_key.SameValueZero(key)) return entry;
entry = GetNextEntry(entry);
}
return kNotFound;
@@ -930,7 +930,6 @@ OrderedHashTableHandler<SmallOrderedNameDictionary,
OrderedNameDictionary>::Allocate(Isolate* isolate,
int capacity);
-#if !defined(V8_OS_WIN)
template <class SmallTable, class LargeTable>
bool OrderedHashTableHandler<SmallTable, LargeTable>::Delete(
Handle<HeapObject> table, Handle<Object> key) {
@@ -943,9 +942,7 @@ bool OrderedHashTableHandler<SmallTable, LargeTable>::Delete(
// down to a smaller hash table.
return LargeTable::Delete(Handle<LargeTable>::cast(table), key);
}
-#endif
-#if !defined(V8_OS_WIN)
template <class SmallTable, class LargeTable>
bool OrderedHashTableHandler<SmallTable, LargeTable>::HasKey(
Isolate* isolate, Handle<HeapObject> table, Handle<Object> key) {
@@ -956,7 +953,6 @@ bool OrderedHashTableHandler<SmallTable, LargeTable>::HasKey(
DCHECK(LargeTable::Is(table));
return LargeTable::HasKey(isolate, LargeTable::cast(*table), *key);
}
-#endif
template bool
OrderedHashTableHandler<SmallOrderedHashSet, OrderedHashSet>::HasKey(
@@ -1096,114 +1092,112 @@ void OrderedNameDictionaryHandler::SetEntry(Isolate* isolate, HeapObject table,
int entry, Object key, Object value,
PropertyDetails details) {
DisallowHeapAllocation no_gc;
- if (table->IsSmallOrderedNameDictionary()) {
- return SmallOrderedNameDictionary::cast(table)->SetEntry(
- isolate, entry, key, value, details);
+ if (table.IsSmallOrderedNameDictionary()) {
+ return SmallOrderedNameDictionary::cast(table).SetEntry(isolate, entry, key,
+ value, details);
}
- DCHECK(table->IsOrderedNameDictionary());
- return OrderedNameDictionary::cast(table)->SetEntry(isolate, entry, key,
- value, details);
+ DCHECK(table.IsOrderedNameDictionary());
+ return OrderedNameDictionary::cast(table).SetEntry(isolate, entry, key, value,
+ details);
}
int OrderedNameDictionaryHandler::FindEntry(Isolate* isolate, HeapObject table,
Name key) {
DisallowHeapAllocation no_gc;
- if (table->IsSmallOrderedNameDictionary()) {
- int entry =
- SmallOrderedNameDictionary::cast(table)->FindEntry(isolate, key);
+ if (table.IsSmallOrderedNameDictionary()) {
+ int entry = SmallOrderedNameDictionary::cast(table).FindEntry(isolate, key);
return entry == SmallOrderedNameDictionary::kNotFound
? OrderedNameDictionaryHandler::kNotFound
: entry;
}
- DCHECK(table->IsOrderedNameDictionary());
- int entry = OrderedNameDictionary::cast(table)->FindEntry(isolate, key);
+ DCHECK(table.IsOrderedNameDictionary());
+ int entry = OrderedNameDictionary::cast(table).FindEntry(isolate, key);
return entry == OrderedNameDictionary::kNotFound
? OrderedNameDictionaryHandler::kNotFound
: entry;
}
Object OrderedNameDictionaryHandler::ValueAt(HeapObject table, int entry) {
- if (table->IsSmallOrderedNameDictionary()) {
- return SmallOrderedNameDictionary::cast(table)->ValueAt(entry);
+ if (table.IsSmallOrderedNameDictionary()) {
+ return SmallOrderedNameDictionary::cast(table).ValueAt(entry);
}
- DCHECK(table->IsOrderedNameDictionary());
- return OrderedNameDictionary::cast(table)->ValueAt(entry);
+ DCHECK(table.IsOrderedNameDictionary());
+ return OrderedNameDictionary::cast(table).ValueAt(entry);
}
void OrderedNameDictionaryHandler::ValueAtPut(HeapObject table, int entry,
Object value) {
- if (table->IsSmallOrderedNameDictionary()) {
- return SmallOrderedNameDictionary::cast(table)->ValueAtPut(entry, value);
+ if (table.IsSmallOrderedNameDictionary()) {
+ return SmallOrderedNameDictionary::cast(table).ValueAtPut(entry, value);
}
- DCHECK(table->IsOrderedNameDictionary());
- OrderedNameDictionary::cast(table)->ValueAtPut(entry, value);
+ DCHECK(table.IsOrderedNameDictionary());
+ OrderedNameDictionary::cast(table).ValueAtPut(entry, value);
}
PropertyDetails OrderedNameDictionaryHandler::DetailsAt(HeapObject table,
int entry) {
- if (table->IsSmallOrderedNameDictionary()) {
- return SmallOrderedNameDictionary::cast(table)->DetailsAt(entry);
+ if (table.IsSmallOrderedNameDictionary()) {
+ return SmallOrderedNameDictionary::cast(table).DetailsAt(entry);
}
- DCHECK(table->IsOrderedNameDictionary());
- return OrderedNameDictionary::cast(table)->DetailsAt(entry);
+ DCHECK(table.IsOrderedNameDictionary());
+ return OrderedNameDictionary::cast(table).DetailsAt(entry);
}
void OrderedNameDictionaryHandler::DetailsAtPut(HeapObject table, int entry,
PropertyDetails details) {
- if (table->IsSmallOrderedNameDictionary()) {
- return SmallOrderedNameDictionary::cast(table)->DetailsAtPut(entry,
- details);
+ if (table.IsSmallOrderedNameDictionary()) {
+ return SmallOrderedNameDictionary::cast(table).DetailsAtPut(entry, details);
}
- DCHECK(table->IsOrderedNameDictionary());
- OrderedNameDictionary::cast(table)->DetailsAtPut(entry, details);
+ DCHECK(table.IsOrderedNameDictionary());
+ OrderedNameDictionary::cast(table).DetailsAtPut(entry, details);
}
int OrderedNameDictionaryHandler::Hash(HeapObject table) {
- if (table->IsSmallOrderedNameDictionary()) {
- return SmallOrderedNameDictionary::cast(table)->Hash();
+ if (table.IsSmallOrderedNameDictionary()) {
+ return SmallOrderedNameDictionary::cast(table).Hash();
}
- DCHECK(table->IsOrderedNameDictionary());
- return OrderedNameDictionary::cast(table)->Hash();
+ DCHECK(table.IsOrderedNameDictionary());
+ return OrderedNameDictionary::cast(table).Hash();
}
void OrderedNameDictionaryHandler::SetHash(HeapObject table, int hash) {
- if (table->IsSmallOrderedNameDictionary()) {
- return SmallOrderedNameDictionary::cast(table)->SetHash(hash);
+ if (table.IsSmallOrderedNameDictionary()) {
+ return SmallOrderedNameDictionary::cast(table).SetHash(hash);
}
- DCHECK(table->IsOrderedNameDictionary());
- OrderedNameDictionary::cast(table)->SetHash(hash);
+ DCHECK(table.IsOrderedNameDictionary());
+ OrderedNameDictionary::cast(table).SetHash(hash);
}
Name OrderedNameDictionaryHandler::KeyAt(HeapObject table, int entry) {
- if (table->IsSmallOrderedNameDictionary()) {
- return Name::cast(SmallOrderedNameDictionary::cast(table)->KeyAt(entry));
+ if (table.IsSmallOrderedNameDictionary()) {
+ return Name::cast(SmallOrderedNameDictionary::cast(table).KeyAt(entry));
}
- return Name::cast(OrderedNameDictionary::cast(table)->KeyAt(entry));
+ return Name::cast(OrderedNameDictionary::cast(table).KeyAt(entry));
}
int OrderedNameDictionaryHandler::NumberOfElements(HeapObject table) {
- if (table->IsSmallOrderedNameDictionary()) {
- return SmallOrderedNameDictionary::cast(table)->NumberOfElements();
+ if (table.IsSmallOrderedNameDictionary()) {
+ return SmallOrderedNameDictionary::cast(table).NumberOfElements();
}
- return OrderedNameDictionary::cast(table)->NumberOfElements();
+ return OrderedNameDictionary::cast(table).NumberOfElements();
}
int OrderedNameDictionaryHandler::Capacity(HeapObject table) {
- if (table->IsSmallOrderedNameDictionary()) {
- return SmallOrderedNameDictionary::cast(table)->Capacity();
+ if (table.IsSmallOrderedNameDictionary()) {
+ return SmallOrderedNameDictionary::cast(table).Capacity();
}
- return OrderedNameDictionary::cast(table)->Capacity();
+ return OrderedNameDictionary::cast(table).Capacity();
}
Handle<HeapObject> OrderedNameDictionaryHandler::Shrink(
@@ -1237,21 +1231,21 @@ template <class Derived, class TableType>
void OrderedHashTableIterator<Derived, TableType>::Transition() {
DisallowHeapAllocation no_allocation;
TableType table = TableType::cast(this->table());
- if (!table->IsObsolete()) return;
+ if (!table.IsObsolete()) return;
int index = Smi::ToInt(this->index());
- while (table->IsObsolete()) {
- TableType next_table = table->NextTable();
+ while (table.IsObsolete()) {
+ TableType next_table = table.NextTable();
if (index > 0) {
- int nod = table->NumberOfDeletedElements();
+ int nod = table.NumberOfDeletedElements();
if (nod == TableType::kClearedTableSentinel) {
index = 0;
} else {
int old_index = index;
for (int i = 0; i < nod; ++i) {
- int removed_index = table->RemovedIndexAt(i);
+ int removed_index = table.RemovedIndexAt(i);
if (removed_index >= old_index) break;
--index;
}
@@ -1274,9 +1268,9 @@ bool OrderedHashTableIterator<Derived, TableType>::HasMore() {
TableType table = TableType::cast(this->table());
int index = Smi::ToInt(this->index());
- int used_capacity = table->UsedCapacity();
+ int used_capacity = table.UsedCapacity();
- while (index < used_capacity && table->KeyAt(index)->IsTheHole(ro_roots)) {
+ while (index < used_capacity && table.KeyAt(index).IsTheHole(ro_roots)) {
index++;
}