diff --git a/deps/v8/src/objects.cc b/deps/v8/src/objects.cc index 29eceb9724f003..339e7db472e664 100644 --- a/deps/v8/src/objects.cc +++ b/deps/v8/src/objects.cc @@ -14667,6 +14667,7 @@ Handle CompilationCacheTable::PutRegExp( void CompilationCacheTable::Age() { DisallowHeapAllocation no_allocation; Object* the_hole_value = GetHeap()->the_hole_value(); + uint32_t capacity = Capacity(); for (int entry = 0, size = Capacity(); entry < size; entry++) { int entry_index = EntryToIndex(entry); int value_index = entry_index + 1; @@ -14690,6 +14691,16 @@ void CompilationCacheTable::Age() { } } } + // Wipe deleted entries. + Heap* heap = GetHeap(); + Object* the_hole = heap->the_hole_value(); + Object* undefined = heap->undefined_value(); + for (uint32_t current = 0; current < capacity; current++) { + if (get(EntryToIndex(current)) == the_hole) { + set(EntryToIndex(current), undefined); + } + } + SetNumberOfDeletedElements(0); } @@ -15212,6 +15223,12 @@ Handle ObjectHashTable::Put(Handle table, } } + // Rehash if more than 25% of the entries are deleted entries. + // TODO(jochen): Consider to shrink the fixed array in place. + if ((table->NumberOfDeletedElements() << 1) > table->NumberOfElements()) { + table->Rehash(isolate->factory()->undefined_value()); + } + // Check whether the hash table should be extended. table = EnsureCapacity(table, 1, key); table->AddEntry(table->FindInsertionEntry(hash), *key, *value); diff --git a/deps/v8/test/cctest/test-weakmaps.cc b/deps/v8/test/cctest/test-weakmaps.cc index 31b812e2874b4b..e84b92f6be1b69 100644 --- a/deps/v8/test/cctest/test-weakmaps.cc +++ b/deps/v8/test/cctest/test-weakmaps.cc @@ -123,7 +123,7 @@ TEST(Weakness) { heap->CollectAllGarbage(false); CHECK_EQ(1, NumberOfWeakCalls); CHECK_EQ(0, ObjectHashTable::cast(weakmap->table())->NumberOfElements()); - CHECK_EQ(2, + CHECK_EQ(0, ObjectHashTable::cast(weakmap->table())->NumberOfDeletedElements()); } diff --git a/deps/v8/test/cctest/test-weaksets.cc b/deps/v8/test/cctest/test-weaksets.cc index 3595af288fb4ea..ea3ee29f4469e0 100644 --- a/deps/v8/test/cctest/test-weaksets.cc +++ b/deps/v8/test/cctest/test-weaksets.cc @@ -122,8 +122,8 @@ TEST(WeakSet_Weakness) { heap->CollectAllGarbage(false); CHECK_EQ(1, NumberOfWeakCalls); CHECK_EQ(0, ObjectHashTable::cast(weakset->table())->NumberOfElements()); - CHECK_EQ( - 1, ObjectHashTable::cast(weakset->table())->NumberOfDeletedElements()); + CHECK_EQ(0, + ObjectHashTable::cast(weakset->table())->NumberOfDeletedElements()); }