| Index: src/objects.cc
|
| diff --git a/src/objects.cc b/src/objects.cc
|
| index f3fad4d0c5267bfa81740173b34002cc3a40c7ee..891aaac9959c647d67a46971ade4a47d7169db03 100644
|
| --- a/src/objects.cc
|
| +++ b/src/objects.cc
|
| @@ -807,17 +807,19 @@ Map* Object::GetRootMap(Isolate* isolate) {
|
|
|
|
|
| Object* Object::GetHash() {
|
| - // The object is either a number, a name, an odd-ball,
|
| + // The object is either a Smi, a HeapNumber, a name, an odd-ball,
|
| // a real JS object, or a Harmony proxy.
|
| if (IsSmi()) {
|
| - int num = Smi::cast(this)->value();
|
| - uint32_t hash = ComputeLongHash(double_to_uint64(static_cast<double>(num)));
|
| + uint32_t hash = ComputeIntegerHash(Smi::cast(this)->value(), kZeroHashSeed);
|
| return Smi::FromInt(hash & Smi::kMaxValue);
|
| }
|
| if (IsHeapNumber()) {
|
| double num = HeapNumber::cast(this)->value();
|
| if (std::isnan(num)) return Smi::FromInt(Smi::kMaxValue);
|
| if (i::IsMinusZero(num)) num = 0;
|
| + if (IsSmiDouble(num)) {
|
| + return Smi::FromInt(FastD2I(num))->GetHash();
|
| + }
|
| uint32_t hash = ComputeLongHash(double_to_uint64(num));
|
| return Smi::FromInt(hash & Smi::kMaxValue);
|
| }
|
| @@ -16258,20 +16260,6 @@ Handle<Derived> OrderedHashTable<Derived, Iterator, entrysize>::Clear(
|
|
|
|
|
| template<class Derived, class Iterator, int entrysize>
|
| -Handle<Derived> OrderedHashTable<Derived, Iterator, entrysize>::Remove(
|
| - Handle<Derived> table, Handle<Object> key, bool* was_present) {
|
| - int entry = table->FindEntry(key);
|
| - if (entry == kNotFound) {
|
| - *was_present = false;
|
| - return table;
|
| - }
|
| - *was_present = true;
|
| - table->RemoveEntry(entry);
|
| - return Shrink(table);
|
| -}
|
| -
|
| -
|
| -template<class Derived, class Iterator, int entrysize>
|
| Handle<Derived> OrderedHashTable<Derived, Iterator, entrysize>::Rehash(
|
| Handle<Derived> table, int new_capacity) {
|
| DCHECK(!table->IsObsolete());
|
| @@ -16316,61 +16304,6 @@ Handle<Derived> OrderedHashTable<Derived, Iterator, entrysize>::Rehash(
|
| }
|
|
|
|
|
| -template <class Derived, class Iterator, int entrysize>
|
| -int OrderedHashTable<Derived, Iterator, entrysize>::FindEntry(
|
| - Handle<Object> key, int hash) {
|
| - DCHECK(!IsObsolete());
|
| -
|
| - DisallowHeapAllocation no_gc;
|
| - DCHECK(!key->IsTheHole());
|
| - for (int entry = HashToEntry(hash); entry != kNotFound;
|
| - entry = ChainAt(entry)) {
|
| - Object* candidate = KeyAt(entry);
|
| - if (candidate->SameValueZero(*key))
|
| - return entry;
|
| - }
|
| - return kNotFound;
|
| -}
|
| -
|
| -
|
| -template <class Derived, class Iterator, int entrysize>
|
| -int OrderedHashTable<Derived, Iterator, entrysize>::FindEntry(
|
| - Handle<Object> key) {
|
| - DisallowHeapAllocation no_gc;
|
| - Object* hash = key->GetHash();
|
| - if (!hash->IsSmi()) return kNotFound;
|
| - return FindEntry(key, Smi::cast(hash)->value());
|
| -}
|
| -
|
| -
|
| -template <class Derived, class Iterator, int entrysize>
|
| -int OrderedHashTable<Derived, Iterator, entrysize>::AddEntry(int hash) {
|
| - DCHECK(!IsObsolete());
|
| -
|
| - int entry = UsedCapacity();
|
| - int bucket = HashToBucket(hash);
|
| - int index = EntryToIndex(entry);
|
| - Object* chain_entry = get(kHashTableStartIndex + bucket);
|
| - set(kHashTableStartIndex + bucket, Smi::FromInt(entry));
|
| - set(index + kChainOffset, chain_entry);
|
| - SetNumberOfElements(NumberOfElements() + 1);
|
| - return index;
|
| -}
|
| -
|
| -
|
| -template<class Derived, class Iterator, int entrysize>
|
| -void OrderedHashTable<Derived, Iterator, entrysize>::RemoveEntry(int entry) {
|
| - DCHECK(!IsObsolete());
|
| -
|
| - int index = EntryToIndex(entry);
|
| - for (int i = 0; i < entrysize; ++i) {
|
| - set_the_hole(index + i);
|
| - }
|
| - SetNumberOfElements(NumberOfElements() - 1);
|
| - SetNumberOfDeletedElements(NumberOfDeletedElements() + 1);
|
| -}
|
| -
|
| -
|
| template Handle<OrderedHashSet>
|
| OrderedHashTable<OrderedHashSet, JSSetIterator, 1>::Allocate(
|
| Isolate* isolate, int capacity, PretenureFlag pretenure);
|
| @@ -16387,21 +16320,6 @@ template Handle<OrderedHashSet>
|
| OrderedHashTable<OrderedHashSet, JSSetIterator, 1>::Clear(
|
| Handle<OrderedHashSet> table);
|
|
|
| -template Handle<OrderedHashSet>
|
| -OrderedHashTable<OrderedHashSet, JSSetIterator, 1>::Remove(
|
| - Handle<OrderedHashSet> table, Handle<Object> key, bool* was_present);
|
| -
|
| -template int OrderedHashTable<OrderedHashSet, JSSetIterator, 1>::FindEntry(
|
| - Handle<Object> key, int hash);
|
| -template int OrderedHashTable<OrderedHashSet, JSSetIterator, 1>::FindEntry(
|
| - Handle<Object> key);
|
| -
|
| -template int
|
| -OrderedHashTable<OrderedHashSet, JSSetIterator, 1>::AddEntry(int hash);
|
| -
|
| -template void
|
| -OrderedHashTable<OrderedHashSet, JSSetIterator, 1>::RemoveEntry(int entry);
|
| -
|
|
|
| template Handle<OrderedHashMap>
|
| OrderedHashTable<OrderedHashMap, JSMapIterator, 2>::Allocate(
|
| @@ -16419,69 +16337,6 @@ template Handle<OrderedHashMap>
|
| OrderedHashTable<OrderedHashMap, JSMapIterator, 2>::Clear(
|
| Handle<OrderedHashMap> table);
|
|
|
| -template Handle<OrderedHashMap>
|
| -OrderedHashTable<OrderedHashMap, JSMapIterator, 2>::Remove(
|
| - Handle<OrderedHashMap> table, Handle<Object> key, bool* was_present);
|
| -
|
| -template int OrderedHashTable<OrderedHashMap, JSMapIterator, 2>::FindEntry(
|
| - Handle<Object> key, int hash);
|
| -template int OrderedHashTable<OrderedHashMap, JSMapIterator, 2>::FindEntry(
|
| - Handle<Object> key);
|
| -
|
| -template int
|
| -OrderedHashTable<OrderedHashMap, JSMapIterator, 2>::AddEntry(int hash);
|
| -
|
| -template void
|
| -OrderedHashTable<OrderedHashMap, JSMapIterator, 2>::RemoveEntry(int entry);
|
| -
|
| -
|
| -bool OrderedHashSet::Contains(Handle<Object> key) {
|
| - return FindEntry(key) != kNotFound;
|
| -}
|
| -
|
| -
|
| -Handle<OrderedHashSet> OrderedHashSet::Add(Handle<OrderedHashSet> table,
|
| - Handle<Object> key) {
|
| - int hash = GetOrCreateHash(table->GetIsolate(), key)->value();
|
| - if (table->FindEntry(key, hash) != kNotFound) return table;
|
| -
|
| - table = EnsureGrowable(table);
|
| -
|
| - int index = table->AddEntry(hash);
|
| - table->set(index, *key);
|
| - return table;
|
| -}
|
| -
|
| -
|
| -Object* OrderedHashMap::Lookup(Handle<Object> key) {
|
| - DisallowHeapAllocation no_gc;
|
| - int entry = FindEntry(key);
|
| - if (entry == kNotFound) return GetHeap()->the_hole_value();
|
| - return ValueAt(entry);
|
| -}
|
| -
|
| -
|
| -Handle<OrderedHashMap> OrderedHashMap::Put(Handle<OrderedHashMap> table,
|
| - Handle<Object> key,
|
| - Handle<Object> value) {
|
| - DCHECK(!key->IsTheHole());
|
| -
|
| - int hash = GetOrCreateHash(table->GetIsolate(), key)->value();
|
| - int entry = table->FindEntry(key, hash);
|
| -
|
| - if (entry != kNotFound) {
|
| - table->set(table->EntryToIndex(entry) + kValueOffset, *value);
|
| - return table;
|
| - }
|
| -
|
| - table = EnsureGrowable(table);
|
| -
|
| - int index = table->AddEntry(hash);
|
| - table->set(index, *key);
|
| - table->set(index + kValueOffset, *value);
|
| - return table;
|
| -}
|
| -
|
|
|
| template<class Derived, class TableType>
|
| void OrderedHashTableIterator<Derived, TableType>::Transition() {
|
|
|