Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
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
[email protected]

Review-Url: https://codereview.chromium.org/2162333002
Cr-Commit-Position: refs/heads/master@{#37901}

Fixes: #6180
PR-URL: #7689
Reviewed-By: Matt Loring <[email protected]>
Reviewed-By: Ben Noordhuis <[email protected]>
  • Loading branch information
Matt Loring authored and ofrobots committed Aug 25, 2016
commit 4a208697141c0c7d6f230656cdc30495d4ffaff5
18 changes: 9 additions & 9 deletions deps/v8/src/objects.cc
Original file line number Diff line number Diff line change
Expand Up @@ -17389,7 +17389,7 @@ Handle<Derived> HashTable<Derived, Shape, Key>::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 ||
Expand All @@ -17405,16 +17405,16 @@ Handle<Derived> HashTable<Derived, Shape, Key>::EnsureCapacity(
return new_table;
}


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 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;
}
Expand Down Expand Up @@ -18332,7 +18332,7 @@ void Dictionary<Derived, Shape, Key>::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));
}


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
// 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) {
Expand Down
2 changes: 1 addition & 1 deletion deps/v8/src/objects.h
Original file line number Diff line number Diff line change
Expand Up @@ -3331,7 +3331,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) {
Expand Down