Index: src/objects.cc |
diff --git a/src/objects.cc b/src/objects.cc |
index 2f8aec5631e6c21f4814dda2e5b0503670738c80..679a3cb6956d3f7933c8ed680f0d96c859c43412 100644 |
--- a/src/objects.cc |
+++ b/src/objects.cc |
@@ -13976,10 +13976,10 @@ bool JSObject::ShouldConvertToFastDoubleElements( |
#ifdef OBJECT_PRINT |
template <typename Derived, typename Shape, typename Key> |
void Dictionary<Derived, Shape, Key>::Print(std::ostream& os) { // NOLINT |
- int capacity = DerivedHashTable::Capacity(); |
+ int capacity = this->Capacity(); |
for (int i = 0; i < capacity; i++) { |
- Object* k = DerivedHashTable::KeyAt(i); |
- if (DerivedHashTable::IsKey(k)) { |
+ Object* k = this->KeyAt(i); |
+ if (this->IsKey(k)) { |
os << " "; |
if (k->IsString()) { |
String::cast(k)->StringPrint(os); |
@@ -13996,12 +13996,12 @@ void Dictionary<Derived, Shape, Key>::Print(std::ostream& os) { // NOLINT |
template<typename Derived, typename Shape, typename Key> |
void Dictionary<Derived, Shape, Key>::CopyValuesTo(FixedArray* elements) { |
int pos = 0; |
- int capacity = DerivedHashTable::Capacity(); |
+ int capacity = this->Capacity(); |
DisallowHeapAllocation no_gc; |
WriteBarrierMode mode = elements->GetWriteBarrierMode(no_gc); |
for (int i = 0; i < capacity; i++) { |
- Object* k = Dictionary::KeyAt(i); |
- if (Dictionary::IsKey(k)) { |
+ Object* k = this->KeyAt(i); |
+ if (this->IsKey(k)) { |
elements->set(pos++, ValueAt(i), mode); |
} |
} |
@@ -14735,9 +14735,10 @@ Handle<Derived> HashTable<Derived, Shape, Key>::New( |
// Find entry for key otherwise return kNotFound. |
-int NameDictionary::FindEntry(Handle<Name> key) { |
+template <typename Derived, typename Shape> |
+int NameDictionaryBase<Derived, Shape>::FindEntry(Handle<Name> key) { |
if (!key->IsUniqueName()) { |
- return DerivedHashTable::FindEntry(key); |
+ return DerivedDictionary::FindEntry(key); |
} |
// Optimized for unique names. Knowledge of the key type allows: |
@@ -14750,13 +14751,13 @@ int NameDictionary::FindEntry(Handle<Name> key) { |
// boost a certain style of code). |
// EnsureCapacity will guarantee the hash table is never full. |
- uint32_t capacity = Capacity(); |
- uint32_t entry = FirstProbe(key->Hash(), capacity); |
+ uint32_t capacity = this->Capacity(); |
+ uint32_t entry = Derived::FirstProbe(key->Hash(), capacity); |
uint32_t count = 1; |
while (true) { |
- int index = EntryToIndex(entry); |
- Object* element = get(index); |
+ int index = Derived::EntryToIndex(entry); |
+ Object* element = this->get(index); |
if (element->IsUndefined()) break; // Empty entry. |
if (*key == element) return entry; |
if (!element->IsUniqueName() && |
@@ -14764,13 +14765,13 @@ int NameDictionary::FindEntry(Handle<Name> key) { |
Name::cast(element)->Equals(*key)) { |
// Replace a key that is a non-internalized string by the equivalent |
// internalized string for faster further lookups. |
- set(index, *key); |
+ this->set(index, *key); |
return entry; |
} |
DCHECK(element->IsTheHole() || !Name::cast(element)->Equals(*key)); |
- entry = NextProbe(entry, count++, capacity); |
+ entry = Derived::NextProbe(entry, count++, capacity); |
} |
- return kNotFound; |
+ return Derived::kNotFound; |
} |
@@ -14791,12 +14792,12 @@ void HashTable<Derived, Shape, Key>::Rehash( |
} |
// Rehash the elements. |
- int capacity = Capacity(); |
+ int capacity = this->Capacity(); |
for (int i = 0; i < capacity; i++) { |
uint32_t from_index = EntryToIndex(i); |
- Object* k = get(from_index); |
+ Object* k = this->get(from_index); |
if (IsKey(k)) { |
- uint32_t hash = HashTable::HashForObject(key, k); |
+ uint32_t hash = this->HashForObject(key, k); |
uint32_t insertion_index = |
EntryToIndex(new_table->FindInsertionEntry(hash)); |
for (int j = 0; j < Shape::kEntrySize; j++) { |
@@ -14815,8 +14816,8 @@ uint32_t HashTable<Derived, Shape, Key>::EntryForProbe( |
Object* k, |
int probe, |
uint32_t expected) { |
- uint32_t hash = HashTable::HashForObject(key, k); |
- uint32_t capacity = Capacity(); |
+ uint32_t hash = this->HashForObject(key, k); |
+ uint32_t capacity = this->Capacity(); |
uint32_t entry = FirstProbe(hash, capacity); |
for (int i = 1; i < probe; i++) { |
if (entry == expected) return expected; |
@@ -15080,6 +15081,9 @@ Dictionary<SeededNumberDictionary, SeededNumberDictionaryShape, |
template int HashTable<SeededNumberDictionary, SeededNumberDictionaryShape, |
uint32_t>::FindEntry(uint32_t); |
+template int NameDictionaryBase<NameDictionary, NameDictionaryShape>::FindEntry( |
+ Handle<Name>); |
+ |
Handle<Object> JSObject::PrepareSlowElementsForSort( |
Handle<JSObject> object, uint32_t limit) { |
@@ -16170,11 +16174,11 @@ template <typename Derived, typename Shape, typename Key> |
template <DictionaryEntryType type> |
int Dictionary<Derived, Shape, Key>::NumberOfElementsFilterAttributes( |
PropertyAttributes filter) { |
- int capacity = DerivedHashTable::Capacity(); |
+ int capacity = this->Capacity(); |
int result = 0; |
for (int i = 0; i < capacity; i++) { |
- Object* k = DerivedHashTable::KeyAt(i); |
- if (DerivedHashTable::IsKey(k) && !FilterKey(k, filter)) { |
+ Object* k = this->KeyAt(i); |
+ if (this->IsKey(k) && !FilterKey(k, filter)) { |
if (IsDeleted<type>(this, i)) continue; |
PropertyDetails details = DetailsAt(i); |
PropertyAttributes attr = details.attributes(); |
@@ -16188,10 +16192,10 @@ int Dictionary<Derived, Shape, Key>::NumberOfElementsFilterAttributes( |
template <typename Derived, typename Shape, typename Key> |
template <DictionaryEntryType type> |
bool Dictionary<Derived, Shape, Key>::HasComplexElements() { |
- int capacity = DerivedHashTable::Capacity(); |
+ int capacity = this->Capacity(); |
for (int i = 0; i < capacity; i++) { |
- Object* k = DerivedHashTable::KeyAt(i); |
- if (DerivedHashTable::IsKey(k) && !FilterKey(k, NONE)) { |
+ Object* k = this->KeyAt(i); |
+ if (this->IsKey(k) && !FilterKey(k, NONE)) { |
if (IsDeleted<type>(this, i)) continue; |
PropertyDetails details = DetailsAt(i); |
if (details.type() == ACCESSOR_CONSTANT) return true; |
@@ -16209,16 +16213,16 @@ void Dictionary<Derived, Shape, Key>::CopyKeysTo( |
FixedArray* storage, PropertyAttributes filter, |
typename Dictionary<Derived, Shape, Key>::SortMode sort_mode) { |
DCHECK(storage->length() >= NumberOfElementsFilterAttributes<type>(filter)); |
- int capacity = DerivedHashTable::Capacity(); |
+ int capacity = this->Capacity(); |
int index = 0; |
for (int i = 0; i < capacity; i++) { |
- Object* k = DerivedHashTable::KeyAt(i); |
- if (DerivedHashTable::IsKey(k) && !FilterKey(k, filter)) { |
- if (IsDeleted<type>(this, i)) continue; |
- PropertyDetails details = DetailsAt(i); |
- PropertyAttributes attr = details.attributes(); |
- if ((attr & filter) == 0) storage->set(index++, k); |
- } |
+ Object* k = this->KeyAt(i); |
+ if (this->IsKey(k) && !FilterKey(k, filter)) { |
+ if (IsDeleted<type>(this, i)) continue; |
+ PropertyDetails details = DetailsAt(i); |
+ PropertyAttributes attr = details.attributes(); |
+ if ((attr & filter) == 0) storage->set(index++, k); |
+ } |
} |
if (sort_mode == Dictionary::SORTED) { |
storage->SortPairs(storage, index); |
@@ -16227,25 +16231,27 @@ void Dictionary<Derived, Shape, Key>::CopyKeysTo( |
} |
+template <typename Dictionary> |
struct EnumIndexComparator { |
- explicit EnumIndexComparator(NameDictionary* dict) : dict(dict) { } |
+ explicit EnumIndexComparator(Dictionary* dict) : dict(dict) {} |
bool operator() (Smi* a, Smi* b) { |
PropertyDetails da(dict->DetailsAt(a->value())); |
PropertyDetails db(dict->DetailsAt(b->value())); |
return da.dictionary_index() < db.dictionary_index(); |
} |
- NameDictionary* dict; |
+ Dictionary* dict; |
}; |
+template <typename Derived, typename Shape, typename Key> |
template <DictionaryEntryType type> |
-void NameDictionary::CopyEnumKeysTo(FixedArray* storage) { |
+void Dictionary<Derived, Shape, Key>::CopyEnumKeysTo(FixedArray* storage) { |
int length = storage->length(); |
- int capacity = Capacity(); |
+ int capacity = this->Capacity(); |
int properties = 0; |
for (int i = 0; i < capacity; i++) { |
- Object* k = KeyAt(i); |
- if (IsKey(k) && !k->IsSymbol()) { |
+ Object* k = this->KeyAt(i); |
+ if (this->IsKey(k) && !k->IsSymbol()) { |
PropertyDetails details = DetailsAt(i); |
if (details.IsDontEnum() || IsDeleted<type>(this, i)) continue; |
storage->set(properties, Smi::FromInt(i)); |
@@ -16254,12 +16260,12 @@ void NameDictionary::CopyEnumKeysTo(FixedArray* storage) { |
} |
} |
CHECK_EQ(length, properties); |
- EnumIndexComparator cmp(this); |
+ EnumIndexComparator<Derived> cmp(static_cast<Derived*>(this)); |
Smi** start = reinterpret_cast<Smi**>(storage->GetFirstElementAddress()); |
std::sort(start, start + length, cmp); |
for (int i = 0; i < length; i++) { |
int index = Smi::cast(storage->get(i))->value(); |
- storage->set(i, KeyAt(index)); |
+ storage->set(i, this->KeyAt(index)); |
} |
} |
@@ -16270,10 +16276,10 @@ void Dictionary<Derived, Shape, Key>::CopyKeysTo( |
FixedArray* storage, int index, PropertyAttributes filter, |
typename Dictionary<Derived, Shape, Key>::SortMode sort_mode) { |
DCHECK(storage->length() >= NumberOfElementsFilterAttributes<type>(filter)); |
- int capacity = DerivedHashTable::Capacity(); |
+ int capacity = this->Capacity(); |
for (int i = 0; i < capacity; i++) { |
- Object* k = DerivedHashTable::KeyAt(i); |
- if (DerivedHashTable::IsKey(k) && !FilterKey(k, filter)) { |
+ Object* k = this->KeyAt(i); |
+ if (this->IsKey(k) && !FilterKey(k, filter)) { |
if (IsDeleted<type>(this, i)) continue; |
PropertyDetails details = DetailsAt(i); |
PropertyAttributes attr = details.attributes(); |
@@ -16290,10 +16296,10 @@ void Dictionary<Derived, Shape, Key>::CopyKeysTo( |
// Backwards lookup (slow). |
template<typename Derived, typename Shape, typename Key> |
Object* Dictionary<Derived, Shape, Key>::SlowReverseLookup(Object* value) { |
- int capacity = DerivedHashTable::Capacity(); |
+ int capacity = this->Capacity(); |
for (int i = 0; i < capacity; i++) { |
- Object* k = DerivedHashTable::KeyAt(i); |
- if (Dictionary::IsKey(k)) { |
+ Object* k = this->KeyAt(i); |
+ if (this->IsKey(k)) { |
Object* e = ValueAt(i); |
// TODO(dcarney): this should be templatized. |
if (e->IsPropertyCell()) { |