Skip to content

Commit e093a04

Browse files
jeisingerCommit bot
authored andcommitted
Rehash and clear deleted entries in weak collections during GC
Otherwise, they'll just keep growing until we run out of memory or hit the FixedArray's maximum capacity. BUG=v8:4909 R=hpayer@chromium.org LOG=n Review URL: https://codereview.chromium.org/1877233005 Cr-Commit-Position: refs/heads/master@{#35514}
1 parent 71453f1 commit e093a04

File tree

5 files changed

+24
-3
lines changed

5 files changed

+24
-3
lines changed

src/heap/mark-compact.cc

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2572,6 +2572,13 @@ void MarkCompactCollector::ClearWeakCollections() {
25722572
table->RemoveEntry(i);
25732573
}
25742574
}
2575+
// Rehash if more than 25% of the entries are deleted entries.
2576+
// TODO(jochen): Consider to shrink the fixed array in place.
2577+
if ((table->NumberOfDeletedElements() << kJSWeakCollectionLoadFactorExp) >
2578+
table->NumberOfElements()) {
2579+
HandleScope scope(heap()->isolate());
2580+
table->Rehash(heap()->isolate()->factory()->undefined_value());
2581+
}
25752582
}
25762583
weak_collection_obj = weak_collection->next();
25772584
weak_collection->set_next(heap()->undefined_value());

src/heap/mark-compact.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -512,6 +512,10 @@ class MarkCompactCollector {
512512
static const uint32_t kSingleFreeEncoding = 0;
513513
static const uint32_t kMultiFreeEncoding = 1;
514514

515+
// If the number of deleted slots in a JSWeakCollection exceeds the number
516+
// of entries / 2^(factor), we rehash the table.
517+
static const int kJSWeakCollectionLoadFactorExp = 1;
518+
515519
static inline bool IsMarked(Object* obj);
516520
static bool IsUnmarkedHeapObjectWithHeap(Heap* heap, Object** p);
517521

src/objects.cc

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16860,6 +16860,16 @@ void HashTable<Derived, Shape, Key>::Rehash(Key key) {
1686016860
}
1686116861
}
1686216862
}
16863+
// Wipe deleted entries.
16864+
Heap* heap = GetHeap();
16865+
Object* the_hole = heap->the_hole_value();
16866+
Object* undefined = heap->undefined_value();
16867+
for (uint32_t current = 0; current < capacity; current++) {
16868+
if (get(EntryToIndex(current)) == the_hole) {
16869+
set(EntryToIndex(current), undefined);
16870+
}
16871+
}
16872+
SetNumberOfDeletedElements(0);
1686316873
}
1686416874

1686516875

test/cctest/test-weakmaps.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ TEST(Weakness) {
124124
heap->CollectAllGarbage(false);
125125
CHECK_EQ(1, NumberOfWeakCalls);
126126
CHECK_EQ(0, ObjectHashTable::cast(weakmap->table())->NumberOfElements());
127-
CHECK_EQ(2,
127+
CHECK_EQ(0,
128128
ObjectHashTable::cast(weakmap->table())->NumberOfDeletedElements());
129129
}
130130

test/cctest/test-weaksets.cc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -123,8 +123,8 @@ TEST(WeakSet_Weakness) {
123123
heap->CollectAllGarbage(false);
124124
CHECK_EQ(1, NumberOfWeakCalls);
125125
CHECK_EQ(0, ObjectHashTable::cast(weakset->table())->NumberOfElements());
126-
CHECK_EQ(
127-
1, ObjectHashTable::cast(weakset->table())->NumberOfDeletedElements());
126+
CHECK_EQ(0,
127+
ObjectHashTable::cast(weakset->table())->NumberOfDeletedElements());
128128
}
129129

130130

0 commit comments

Comments
 (0)