Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(338)

Unified Diff: src/objects.cc

Issue 1163673003: Introducing GlobalDictionary, a backing store for global objects. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Addressing comments Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/objects.h ('k') | src/objects-inl.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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()) {
« no previous file with comments | « src/objects.h ('k') | src/objects-inl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698