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

Unified Diff: src/bootstrapper.cc

Issue 2533223002: Copy dictionary keys and values in enumeration in TransferNamedProperties (Closed)
Patch Set: rip out sorting code Created 4 years 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/api.cc ('k') | src/objects.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/bootstrapper.cc
diff --git a/src/bootstrapper.cc b/src/bootstrapper.cc
index fefa4a7f2c8d535bbc1330332d5236a3288ec50d..f5c6d6ca29c023439190c6b1addea6f1f43b684d 100644
--- a/src/bootstrapper.cc
+++ b/src/bootstrapper.cc
@@ -4236,50 +4236,55 @@ void Genesis::TransferNamedProperties(Handle<JSObject> from,
}
}
} else if (from->IsJSGlobalObject()) {
+ // Copy all keys and values in enumeration order.
Handle<GlobalDictionary> properties =
Handle<GlobalDictionary>(from->global_dictionary());
- int capacity = properties->Capacity();
- for (int i = 0; i < capacity; i++) {
- Object* raw_key(properties->KeyAt(i));
- if (properties->IsKey(isolate(), raw_key)) {
- DCHECK(raw_key->IsName());
- // If the property is already there we skip it.
- Handle<Name> key(Name::cast(raw_key));
- LookupIterator it(to, key, LookupIterator::OWN_SKIP_INTERCEPTOR);
- CHECK_NE(LookupIterator::ACCESS_CHECK, it.state());
- if (it.IsFound()) continue;
- // Set the property.
- DCHECK(properties->ValueAt(i)->IsPropertyCell());
- Handle<PropertyCell> cell(PropertyCell::cast(properties->ValueAt(i)));
- Handle<Object> value(cell->value(), isolate());
- if (value->IsTheHole(isolate())) continue;
- PropertyDetails details = cell->property_details();
- DCHECK_EQ(kData, details.kind());
- JSObject::AddProperty(to, key, value, details.attributes());
- }
+ Handle<FixedArray> key_indices =
+ GlobalDictionary::IterationIndices(properties);
+ for (int i = 0; i < key_indices->length(); i++) {
+ int key_index = Smi::cast(key_indices->get(i))->value();
+ Object* raw_key = properties->KeyAt(key_index);
+ DCHECK(properties->IsKey(isolate(), raw_key));
+ DCHECK(raw_key->IsName());
+ // If the property is already there we skip it.
+ Handle<Name> key(Name::cast(raw_key), isolate());
+ LookupIterator it(to, key, LookupIterator::OWN_SKIP_INTERCEPTOR);
+ CHECK_NE(LookupIterator::ACCESS_CHECK, it.state());
+ if (it.IsFound()) continue;
+ // Set the property.
+ DCHECK(properties->ValueAt(key_index)->IsPropertyCell());
+ Handle<PropertyCell> cell(
+ PropertyCell::cast(properties->ValueAt(key_index)), isolate());
+ Handle<Object> value(cell->value(), isolate());
+ if (value->IsTheHole(isolate())) continue;
+ PropertyDetails details = cell->property_details();
+ DCHECK_EQ(kData, details.kind());
+ JSObject::AddProperty(to, key, value, details.attributes());
}
} else {
+ // Copy all keys and values in enumeration order.
Handle<NameDictionary> properties =
Handle<NameDictionary>(from->property_dictionary());
- int capacity = properties->Capacity();
- for (int i = 0; i < capacity; i++) {
- Object* raw_key(properties->KeyAt(i));
- if (properties->IsKey(isolate(), raw_key)) {
- DCHECK(raw_key->IsName());
- // If the property is already there we skip it.
- Handle<Name> key(Name::cast(raw_key));
- LookupIterator it(to, key, LookupIterator::OWN_SKIP_INTERCEPTOR);
- CHECK_NE(LookupIterator::ACCESS_CHECK, it.state());
- if (it.IsFound()) continue;
- // Set the property.
- Handle<Object> value = Handle<Object>(properties->ValueAt(i),
- isolate());
- DCHECK(!value->IsCell());
- DCHECK(!value->IsTheHole(isolate()));
- PropertyDetails details = properties->DetailsAt(i);
- DCHECK_EQ(kData, details.kind());
- JSObject::AddProperty(to, key, value, details.attributes());
- }
+ Handle<FixedArray> key_indices =
+ NameDictionary::IterationIndices(properties);
+ for (int i = 0; i < key_indices->length(); i++) {
+ int key_index = Smi::cast(key_indices->get(i))->value();
+ Object* raw_key = properties->KeyAt(key_index);
+ DCHECK(properties->IsKey(isolate(), raw_key));
+ DCHECK(raw_key->IsName());
+ // If the property is already there we skip it.
+ Handle<Name> key(Name::cast(raw_key), isolate());
+ LookupIterator it(to, key, LookupIterator::OWN_SKIP_INTERCEPTOR);
+ CHECK_NE(LookupIterator::ACCESS_CHECK, it.state());
+ if (it.IsFound()) continue;
+ // Set the property.
+ Handle<Object> value =
+ Handle<Object>(properties->ValueAt(key_index), isolate());
+ DCHECK(!value->IsCell());
+ DCHECK(!value->IsTheHole(isolate()));
+ PropertyDetails details = properties->DetailsAt(key_index);
+ DCHECK_EQ(kData, details.kind());
+ JSObject::AddProperty(to, key, value, details.attributes());
}
}
}
« no previous file with comments | « src/api.cc ('k') | src/objects.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698