From e1f12fb358b833ba212bc88fe7a2e1c5a8ec22b3 Mon Sep 17 00:00:00 2001 From: Matt Loring Date: Tue, 12 Jul 2016 13:08:34 -0700 Subject: [PATCH] deps: cherry-pick b93c80a from v8 upstream Original commit message: If we can't rehash the backing store for weak sets & maps, do a last resort GC BUG=v8:4909 R=hpayer@chromium.org Committed: https://crrev.com/b93c80a6039c757723e70420ae73375b5d277814 Cr-Commit-Position: refs/heads/master@{#37591} Fixes: https://github.com/nodejs/node/issues/6180 Ref: https://github.com/nodejs/node/pull/7883 PR-URL: https://github.com/nodejs/node/pull/7689 Reviewed-By: Matt Loring Reviewed-By: Ben Noordhuis --- deps/v8/include/v8-version.h | 2 +- deps/v8/src/objects.cc | 13 +++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/deps/v8/include/v8-version.h b/deps/v8/include/v8-version.h index cfd3fdb73a..6cd4ac3b44 100644 --- a/deps/v8/include/v8-version.h +++ b/deps/v8/include/v8-version.h @@ -11,7 +11,7 @@ #define V8_MAJOR_VERSION 4 #define V8_MINOR_VERSION 5 #define V8_BUILD_NUMBER 103 -#define V8_PATCH_LEVEL 39 +#define V8_PATCH_LEVEL 40 // Use 1 for candidates and 0 otherwise. // (Boolean macro values are not supported by all preprocessors.) diff --git a/deps/v8/src/objects.cc b/deps/v8/src/objects.cc index 5cc43e3599..d16c8e408c 100644 --- a/deps/v8/src/objects.cc +++ b/deps/v8/src/objects.cc @@ -15213,6 +15213,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);