diff --git a/deps/v8/src/objects.cc b/deps/v8/src/objects.cc index 6dec886a194a82..c86806811ce9e4 100644 --- a/deps/v8/src/objects.cc +++ b/deps/v8/src/objects.cc @@ -18740,6 +18740,19 @@ Handle ObjectHashTable::Put(Handle table, if ((table->NumberOfDeletedElements() << 1) > table->NumberOfElements()) { table->Rehash(isolate->factory()->undefined_value()); } + // If we're out of luck, we didn't get a GC recently, and so rehashing + // isn't enough to avoid a crash. + int nof = table->NumberOfElements() + 1; + if (!table->HasSufficientCapacity(nof)) { + int capacity = ObjectHashTable::ComputeCapacity(nof * 2); + if (capacity > ObjectHashTable::kMaxCapacity) { + for (size_t i = 0; i < 2; ++i) { + isolate->heap()->CollectAllGarbage( + Heap::kFinalizeIncrementalMarkingMask, "full object hash table"); + } + table->Rehash(isolate->factory()->undefined_value()); + } + } // Check whether the hash table should be extended. table = EnsureCapacity(table, 1, key);