diff --git a/src/objects.cc b/src/objects.cc index 30329e8f2d..2fd384d191 100644 --- a/src/objects.cc +++ b/src/objects.cc @@ -14673,7 +14673,9 @@ int NameDictionary::FindEntry(Handle key) { template -void HashTable::Rehash(Derived* new_table, Key key) { +void HashTable::Rehash( + Handle new_table, + Key key) { ASSERT(NumberOfElements() < new_table->Capacity()); DisallowHeapAllocation no_gc; @@ -14774,39 +14776,6 @@ void HashTable::Rehash(Key key) { } -template -MaybeObject* HashTable::EnsureCapacity( - int n, - Key key, - PretenureFlag pretenure) { - int capacity = Capacity(); - int nof = NumberOfElements() + n; - int nod = NumberOfDeletedElements(); - // Return if: - // 50% is still free after adding n elements and - // at most 50% of the free elements are deleted elements. - if (nod <= (capacity - nof) >> 1) { - int needed_free = nof >> 1; - if (nof + needed_free <= capacity) return this; - } - - const int kMinCapacityForPretenure = 256; - bool should_pretenure = pretenure == TENURED || - ((capacity > kMinCapacityForPretenure) && !GetHeap()->InNewSpace(this)); - Object* obj; - { MaybeObject* maybe_obj = - Allocate(GetHeap(), - nof * 2, - USE_DEFAULT_MINIMUM_CAPACITY, - should_pretenure ? TENURED : NOT_TENURED); - if (!maybe_obj->ToObject(&obj)) return maybe_obj; - } - - Rehash(Derived::cast(obj), key); - return Derived::cast(obj); -} - - template Handle HashTable::EnsureCapacity( Handle table, @@ -14814,10 +14783,29 @@ Handle HashTable::EnsureCapacity( Key key, PretenureFlag pretenure) { Isolate* isolate = table->GetIsolate(); - CALL_HEAP_FUNCTION( + int capacity = table->Capacity(); + int nof = table->NumberOfElements() + n; + int nod = table->NumberOfDeletedElements(); + // Return if: + // 50% is still free after adding n elements and + // at most 50% of the free elements are deleted elements. + if (nod <= (capacity - nof) >> 1) { + int needed_free = nof >> 1; + if (nof + needed_free <= capacity) return table; + } + + const int kMinCapacityForPretenure = 256; + bool should_pretenure = pretenure == TENURED || + ((capacity > kMinCapacityForPretenure) && + !isolate->heap()->InNewSpace(*table)); + Handle new_table = HashTable::New( isolate, - static_cast(*table)->EnsureCapacity(n, key, pretenure), - Derived); + nof * 2, + USE_DEFAULT_MINIMUM_CAPACITY, + should_pretenure ? TENURED : NOT_TENURED); + + table->Rehash(new_table, key); + return new_table; } @@ -14842,13 +14830,13 @@ Handle HashTable::Shrink(Handle table, bool pretenure = (at_least_room_for > kMinCapacityForPretenure) && !isolate->heap()->InNewSpace(*table); - Handle new_table = New( + Handle new_table = HashTable::New( isolate, at_least_room_for, USE_DEFAULT_MINIMUM_CAPACITY, pretenure ? TENURED : NOT_TENURED); - table->Rehash(*new_table, key); + table->Rehash(new_table, key); return new_table; } diff --git a/src/objects.h b/src/objects.h index 70d4410672..b2b36c1b1c 100644 --- a/src/objects.h +++ b/src/objects.h @@ -3722,7 +3722,7 @@ class HashTable: public FixedArray { PretenureFlag pretenure = NOT_TENURED); // Returns a new HashTable object. - static Handle New( + MUST_USE_RESULT static Handle New( Isolate* isolate, int at_least_space_for, MinimumCapacity capacity_option = USE_DEFAULT_MINIMUM_CAPACITY, @@ -3829,6 +3829,17 @@ class HashTable: public FixedArray { return (last + number) & (size - 1); } + // Attempt to shrink hash table after removal of key. + static Handle Shrink(Handle table, Key key); + + // Ensure enough space for n additional elements. + MUST_USE_RESULT static Handle EnsureCapacity( + Handle table, + int n, + Key key, + PretenureFlag pretenure = NOT_TENURED); + + private: // Returns _expected_ if one of entries given by the first _probe_ probes is // equal to _expected_. Otherwise, returns the entry given by the probe // number _probe_. @@ -3837,21 +3848,7 @@ class HashTable: public FixedArray { void Swap(uint32_t entry1, uint32_t entry2, WriteBarrierMode mode); // Rehashes this hash-table into the new table. - void Rehash(Derived* new_table, Key key); - - // Attempt to shrink hash table after removal of key. - static Handle Shrink(Handle table, Key key); - - // Ensure enough space for n additional elements. - MUST_USE_RESULT MaybeObject* EnsureCapacity( - int n, - Key key, - PretenureFlag pretenure = NOT_TENURED); - static Handle EnsureCapacity( - Handle table, - int n, - Key key, - PretenureFlag pretenure = NOT_TENURED); + void Rehash(Handle new_table, Key key); };