From e6887e2ceb1894d172cf3af27378b38fa3751d1d Mon Sep 17 00:00:00 2001 From: Matt Loring Date: Wed, 20 Jul 2016 13:37:45 -0700 Subject: [PATCH] deps: cherry-pick a76d133 from v8 upstream Original commit message: Fix incorrect parameter to HasSufficientCapacity It takes the number of additional elements, not the total target capacity. Also, avoid right-shifting a negative integer as this is undefined in general BUG=v8:4909 R=verwaest@chromium.org Review-Url: https://codereview.chromium.org/2162333002 Cr-Commit-Position: refs/heads/master@{#37901} Fixes: https://github.com/nodejs/node/issues/6180 PR-URL: https://github.com/nodejs/node/pull/7689 Reviewed-By: Matt Loring Reviewed-By: Ben Noordhuis --- deps/v8/src/objects.cc | 18 +++++++++--------- deps/v8/src/objects.h | 2 +- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/deps/v8/src/objects.cc b/deps/v8/src/objects.cc index 5d04eb5f4e7c64..a3da050fa49898 100644 --- a/deps/v8/src/objects.cc +++ b/deps/v8/src/objects.cc @@ -17437,7 +17437,7 @@ Handle HashTable::EnsureCapacity( int capacity = table->Capacity(); int nof = table->NumberOfElements() + n; - if (table->HasSufficientCapacity(n)) return table; + if (table->HasSufficientCapacityToAdd(n)) return table; const int kMinCapacityForPretenure = 256; bool should_pretenure = pretenure == TENURED || @@ -17453,16 +17453,16 @@ Handle HashTable::EnsureCapacity( return new_table; } - template -bool HashTable::HasSufficientCapacity(int n) { +bool HashTable::HasSufficientCapacityToAdd( + int number_of_additional_elements) { int capacity = Capacity(); - int nof = NumberOfElements() + n; + int nof = NumberOfElements() + number_of_additional_elements; int nod = NumberOfDeletedElements(); // Return true if: - // 50% is still free after adding n elements and + // 50% is still free after adding number_of_additional_elements elements and // at most 50% of the free elements are deleted elements. - if (nod <= (capacity - nof) >> 1) { + if ((nof < capacity) && ((nod <= (capacity - nof) >> 1))) { int needed_free = nof >> 1; if (nof + needed_free <= capacity) return true; } @@ -18378,7 +18378,7 @@ void Dictionary::SetRequiresCopyOnCapacityChange() { DCHECK_EQ(0, DerivedHashTable::NumberOfDeletedElements()); // Make sure that HashTable::EnsureCapacity will create a copy. DerivedHashTable::SetNumberOfDeletedElements(DerivedHashTable::Capacity()); - DCHECK(!DerivedHashTable::HasSufficientCapacity(1)); + DCHECK(!DerivedHashTable::HasSufficientCapacityToAdd(1)); } @@ -18791,8 +18791,8 @@ Handle ObjectHashTable::Put(Handle table, } // 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)) { + if (!table->HasSufficientCapacityToAdd(1)) { + int nof = table->NumberOfElements() + 1; int capacity = ObjectHashTable::ComputeCapacity(nof * 2); if (capacity > ObjectHashTable::kMaxCapacity) { for (size_t i = 0; i < 2; ++i) { diff --git a/deps/v8/src/objects.h b/deps/v8/src/objects.h index 4a8a55764f9a89..e5d52e0c757ca4 100644 --- a/deps/v8/src/objects.h +++ b/deps/v8/src/objects.h @@ -3307,7 +3307,7 @@ class HashTable : public HashTableBase { PretenureFlag pretenure = NOT_TENURED); // Returns true if this table has sufficient capacity for adding n elements. - bool HasSufficientCapacity(int n); + bool HasSufficientCapacityToAdd(int number_of_additional_elements); // Sets the capacity of the hash table. void SetCapacity(int capacity) {