Skip to content

Commit

Permalink
deps: cherry-pick a76d133 from v8 upstream
Browse files Browse the repository at this point in the history
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: #6180
PR-URL: #7689
Reviewed-By: Matt Loring <mattloring@google.com>
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
  • Loading branch information
Matt Loring committed Jul 26, 2016
1 parent a3d62bd commit e22ffef
Show file tree
Hide file tree
Showing 2 changed files with 10 additions and 10 deletions.
18 changes: 9 additions & 9 deletions deps/v8/src/objects.cc
Expand Up @@ -17389,7 +17389,7 @@ Handle<Derived> HashTable<Derived, Shape, Key>::EnsureCapacity(
int capacity = table->Capacity(); int capacity = table->Capacity();
int nof = table->NumberOfElements() + n; int nof = table->NumberOfElements() + n;


if (table->HasSufficientCapacity(n)) return table; if (table->HasSufficientCapacityToAdd(n)) return table;


const int kMinCapacityForPretenure = 256; const int kMinCapacityForPretenure = 256;
bool should_pretenure = pretenure == TENURED || bool should_pretenure = pretenure == TENURED ||
Expand All @@ -17405,16 +17405,16 @@ Handle<Derived> HashTable<Derived, Shape, Key>::EnsureCapacity(
return new_table; return new_table;
} }



template <typename Derived, typename Shape, typename Key> template <typename Derived, typename Shape, typename Key>
bool HashTable<Derived, Shape, Key>::HasSufficientCapacity(int n) { bool HashTable<Derived, Shape, Key>::HasSufficientCapacityToAdd(
int number_of_additional_elements) {
int capacity = Capacity(); int capacity = Capacity();
int nof = NumberOfElements() + n; int nof = NumberOfElements() + number_of_additional_elements;
int nod = NumberOfDeletedElements(); int nod = NumberOfDeletedElements();
// Return true if: // 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. // 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; int needed_free = nof >> 1;
if (nof + needed_free <= capacity) return true; if (nof + needed_free <= capacity) return true;
} }
Expand Down Expand Up @@ -18332,7 +18332,7 @@ void Dictionary<Derived, Shape, Key>::SetRequiresCopyOnCapacityChange() {
DCHECK_EQ(0, DerivedHashTable::NumberOfDeletedElements()); DCHECK_EQ(0, DerivedHashTable::NumberOfDeletedElements());
// Make sure that HashTable::EnsureCapacity will create a copy. // Make sure that HashTable::EnsureCapacity will create a copy.
DerivedHashTable::SetNumberOfDeletedElements(DerivedHashTable::Capacity()); DerivedHashTable::SetNumberOfDeletedElements(DerivedHashTable::Capacity());
DCHECK(!DerivedHashTable::HasSufficientCapacity(1)); DCHECK(!DerivedHashTable::HasSufficientCapacityToAdd(1));
} }




Expand Down Expand Up @@ -18742,8 +18742,8 @@ Handle<ObjectHashTable> ObjectHashTable::Put(Handle<ObjectHashTable> table,
} }
// If we're out of luck, we didn't get a GC recently, and so rehashing // If we're out of luck, we didn't get a GC recently, and so rehashing
// isn't enough to avoid a crash. // isn't enough to avoid a crash.
int nof = table->NumberOfElements() + 1; if (!table->HasSufficientCapacityToAdd(1)) {
if (!table->HasSufficientCapacity(nof)) { int nof = table->NumberOfElements() + 1;
int capacity = ObjectHashTable::ComputeCapacity(nof * 2); int capacity = ObjectHashTable::ComputeCapacity(nof * 2);
if (capacity > ObjectHashTable::kMaxCapacity) { if (capacity > ObjectHashTable::kMaxCapacity) {
for (size_t i = 0; i < 2; ++i) { for (size_t i = 0; i < 2; ++i) {
Expand Down
2 changes: 1 addition & 1 deletion deps/v8/src/objects.h
Expand Up @@ -3331,7 +3331,7 @@ class HashTable : public HashTableBase {
PretenureFlag pretenure = NOT_TENURED); PretenureFlag pretenure = NOT_TENURED);


// Returns true if this table has sufficient capacity for adding n elements. // 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. // Sets the capacity of the hash table.
void SetCapacity(int capacity) { void SetCapacity(int capacity) {
Expand Down

0 comments on commit e22ffef

Please sign in to comment.