Commit a76d133f authored by jochen's avatar jochen Committed by Commit bot

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}
parent 99d1e5dc
...@@ -16277,7 +16277,7 @@ Handle<Derived> HashTable<Derived, Shape, Key>::EnsureCapacity( ...@@ -16277,7 +16277,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 ||
...@@ -16293,16 +16293,16 @@ Handle<Derived> HashTable<Derived, Shape, Key>::EnsureCapacity( ...@@ -16293,16 +16293,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;
} }
...@@ -17274,7 +17274,7 @@ void Dictionary<Derived, Shape, Key>::SetRequiresCopyOnCapacityChange() { ...@@ -17274,7 +17274,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));
} }
...@@ -17694,8 +17694,8 @@ Handle<ObjectHashTable> ObjectHashTable::Put(Handle<ObjectHashTable> table, ...@@ -17694,8 +17694,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) {
......
...@@ -3293,7 +3293,7 @@ class HashTable : public HashTableBase { ...@@ -3293,7 +3293,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) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment