diff options
Diffstat (limited to 'deps/v8/src/objects/ordered-hash-table.cc')
-rw-r--r-- | deps/v8/src/objects/ordered-hash-table.cc | 204 |
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++; } |