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

Unified Diff: src/objects.cc

Issue 2081733002: [keys] support shadowing keys in the KeyAccumulator (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: rebasing Created 4 years, 6 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 ddf62b153cb6e98dbb8291b9184a1ebe35c975e8..646552810095c77a0fc430d8e82486dafaeaa1a8 100644
--- a/src/objects.cc
+++ b/src/objects.cc
@@ -16515,6 +16515,11 @@ template Handle<NameDictionary>
HashTable<NameDictionary, NameDictionaryShape, Handle<Name> >::
New(Isolate*, int, MinimumCapacity, PretenureFlag);
+template Handle<ObjectHashSet> HashTable<ObjectHashSet, ObjectHashSetShape,
+ Handle<Object>>::New(Isolate*, int n,
+ MinimumCapacity,
+ PretenureFlag);
+
template Handle<NameDictionary>
HashTable<NameDictionary, NameDictionaryShape, Handle<Name> >::
Shrink(Handle<NameDictionary>, Handle<Name>);
@@ -16585,24 +16590,33 @@ template int Dictionary<GlobalDictionary, GlobalDictionaryShape, Handle<Name>>::
template int Dictionary<NameDictionary, NameDictionaryShape, Handle<Name>>::
NumberOfElementsFilterAttributes(PropertyFilter filter);
-template void Dictionary<GlobalDictionary, GlobalDictionaryShape,
- Handle<Name>>::CopyEnumKeysTo(FixedArray* storage);
+template void
+Dictionary<GlobalDictionary, GlobalDictionaryShape, Handle<Name>>::
+ CopyEnumKeysTo(Handle<Dictionary<GlobalDictionary, GlobalDictionaryShape,
+ Handle<Name>>>
+ dictionary,
+ Handle<FixedArray> storage, KeyCollectionMode mode,
+ KeyAccumulator* accumulator);
-template void Dictionary<NameDictionary, NameDictionaryShape,
- Handle<Name>>::CopyEnumKeysTo(FixedArray* storage);
+template void
+Dictionary<NameDictionary, NameDictionaryShape, Handle<Name>>::CopyEnumKeysTo(
+ Handle<Dictionary<NameDictionary, NameDictionaryShape, Handle<Name>>>
+ dictionary,
+ Handle<FixedArray> storage, KeyCollectionMode mode,
+ KeyAccumulator* accumulator);
template void
Dictionary<GlobalDictionary, GlobalDictionaryShape, Handle<Name>>::
CollectKeysTo(Handle<Dictionary<GlobalDictionary, GlobalDictionaryShape,
Handle<Name>>>
dictionary,
- KeyAccumulator* keys, PropertyFilter filter);
+ KeyAccumulator* keys);
template void
Dictionary<NameDictionary, NameDictionaryShape, Handle<Name>>::CollectKeysTo(
Handle<Dictionary<NameDictionary, NameDictionaryShape, Handle<Name>>>
dictionary,
- KeyAccumulator* keys, PropertyFilter filter);
+ KeyAccumulator* keys);
Handle<Object> JSObject::PrepareSlowElementsForSort(
Handle<JSObject> object, uint32_t limit) {
@@ -17099,6 +17113,20 @@ bool StringSet::Has(Handle<String> name) {
return FindEntry(*name) != kNotFound;
}
+Handle<ObjectHashSet> ObjectHashSet::Add(Handle<ObjectHashSet> set,
+ Handle<Object> key) {
+ Isolate* isolate = set->GetIsolate();
+ int32_t hash = Object::GetOrCreateHash(isolate, key)->value();
+
+ if (!set->Has(isolate, key, hash)) {
+ set = EnsureCapacity(set, 1, key);
+ int entry = set->FindInsertionEntry(hash);
+ set->set(EntryToIndex(entry), *key);
+ set->ElementAdded();
+ }
+ return set;
+}
+
Handle<Object> CompilationCacheTable::Lookup(Handle<String> src,
Handle<Context> context,
LanguageMode language_mode) {
@@ -17554,43 +17582,61 @@ struct EnumIndexComparator {
Dictionary* dict;
};
-
template <typename Derived, typename Shape, typename Key>
-void Dictionary<Derived, Shape, Key>::CopyEnumKeysTo(FixedArray* storage) {
- Isolate* isolate = this->GetIsolate();
+void Dictionary<Derived, Shape, Key>::CopyEnumKeysTo(
+ Handle<Dictionary<Derived, Shape, Key>> dictionary,
+ Handle<FixedArray> storage, KeyCollectionMode mode,
+ KeyAccumulator* accumulator) {
+ Isolate* isolate = dictionary->GetIsolate();
int length = storage->length();
- int capacity = this->Capacity();
+ int capacity = dictionary->Capacity();
int properties = 0;
for (int i = 0; i < capacity; i++) {
- Object* k = this->KeyAt(i);
- if (this->IsKey(isolate, k) && !k->IsSymbol()) {
- PropertyDetails details = this->DetailsAt(i);
- if (details.IsDontEnum() || this->IsDeleted(i)) continue;
+ Object* key = dictionary->KeyAt(i);
+ bool is_shadowing_key = false;
+ if (!dictionary->IsKey(isolate, key)) continue;
+ if (key->IsSymbol()) continue;
+ PropertyDetails details = dictionary->DetailsAt(i);
+ if (details.IsDontEnum()) {
+ if (mode == KeyCollectionMode::kIncludePrototypes) {
+ is_shadowing_key = true;
+ } else {
+ continue;
+ }
+ }
+ if (dictionary->IsDeleted(i)) continue;
+ if (is_shadowing_key) {
+ accumulator->AddShadowKey(key);
+ continue;
+ } else {
storage->set(properties, Smi::FromInt(i));
- properties++;
- if (properties == length) break;
}
+ properties++;
+ if (properties == length) break;
}
+
CHECK_EQ(length, properties);
- EnumIndexComparator<Derived> cmp(static_cast<Derived*>(this));
+ DisallowHeapAllocation no_gc;
+ Dictionary<Derived, Shape, Key>* raw_dictionary = *dictionary;
+ FixedArray* raw_storage = *storage;
+ EnumIndexComparator<Derived> cmp(static_cast<Derived*>(*dictionary));
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, this->KeyAt(index));
+ int index = Smi::cast(raw_storage->get(i))->value();
+ raw_storage->set(i, raw_dictionary->KeyAt(index));
}
}
template <typename Derived, typename Shape, typename Key>
void Dictionary<Derived, Shape, Key>::CollectKeysTo(
- Handle<Dictionary<Derived, Shape, Key> > dictionary, KeyAccumulator* keys,
- PropertyFilter filter) {
+ Handle<Dictionary<Derived, Shape, Key>> dictionary, KeyAccumulator* keys) {
Isolate* isolate = keys->isolate();
int capacity = dictionary->Capacity();
Handle<FixedArray> array =
isolate->factory()->NewFixedArray(dictionary->NumberOfElements());
int array_size = 0;
-
+ PropertyFilter filter = keys->filter();
{
DisallowHeapAllocation no_gc;
Dictionary<Derived, Shape, Key>* raw_dict = *dictionary;
@@ -17599,7 +17645,10 @@ void Dictionary<Derived, Shape, Key>::CollectKeysTo(
if (!raw_dict->IsKey(isolate, k) || k->FilterKey(filter)) continue;
if (raw_dict->IsDeleted(i)) continue;
PropertyDetails details = raw_dict->DetailsAt(i);
- if ((details.attributes() & filter) != 0) continue;
+ if ((details.attributes() & filter) != 0) {
+ keys->AddShadowKey(k);
+ continue;
+ }
if (filter & ONLY_ALL_CAN_READ) {
if (details.kind() != kAccessor) continue;
Object* accessors = raw_dict->ValueAt(i);
« 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