Index: src/objects.cc |
diff --git a/src/objects.cc b/src/objects.cc |
index eb27233ce57f99659556e4183361ae58ffda73d0..47f8e6b3794b60d9804b75623b739f45c9ff2c53 100644 |
--- a/src/objects.cc |
+++ b/src/objects.cc |
@@ -7797,20 +7797,18 @@ MaybeHandle<JSObject> JSObjectWalkVisitor<ContextObject>::StructureWalk( |
} |
} |
} else { |
- Handle<FixedArray> names = |
- isolate->factory()->NewFixedArray(copy->NumberOfOwnProperties()); |
- copy->GetOwnPropertyNames(*names, 0); |
+ // Only deep copy fields from the object literal expression. |
+ // In particular, don't try to copy the length attribute of |
+ // an array. |
+ PropertyFilter filter = static_cast<PropertyFilter>( |
+ ONLY_WRITABLE | ONLY_ENUMERABLE | ONLY_CONFIGURABLE); |
+ KeyAccumulator accumulator(isolate, filter); |
+ accumulator.NextPrototype(); |
+ copy->CollectOwnPropertyNames(&accumulator, filter); |
+ Handle<FixedArray> names = accumulator.GetKeys(); |
for (int i = 0; i < names->length(); i++) { |
DCHECK(names->get(i)->IsName()); |
Handle<Name> name(Name::cast(names->get(i))); |
- Maybe<PropertyAttributes> maybe = |
- JSReceiver::GetOwnPropertyAttributes(copy, name); |
- DCHECK(maybe.IsJust()); |
- PropertyAttributes attributes = maybe.FromJust(); |
- // Only deep copy fields from the object literal expression. |
- // In particular, don't try to copy the length attribute of |
- // an array. |
- if (attributes != NONE) continue; |
Handle<Object> value = |
Object::GetProperty(copy, name).ToHandleChecked(); |
if (value->IsJSObject()) { |
@@ -15841,25 +15839,6 @@ Maybe<bool> JSObject::HasRealNamedCallbackProperty(Handle<JSObject> object, |
} |
-// Private symbols are always filtered out. |
-int JSObject::NumberOfOwnProperties(PropertyFilter filter) { |
- if (HasFastProperties()) { |
- Map* map = this->map(); |
- if (filter == ENUMERABLE_STRINGS) { |
- // The cached enum length was computed with filter == ENUMERABLE_STRING, |
- // so that's the only filter for which it's valid to retrieve it. |
- int result = map->EnumLength(); |
- if (result != kInvalidEnumCacheSentinel) return result; |
- } |
- return map->NumberOfDescribedProperties(OWN_DESCRIPTORS, filter); |
- } else if (IsJSGlobalObject()) { |
- return global_dictionary()->NumberOfElementsFilterAttributes(filter); |
- } else { |
- return property_dictionary()->NumberOfElementsFilterAttributes(filter); |
- } |
-} |
- |
- |
void FixedArray::SwapPairs(FixedArray* numbers, int i, int j) { |
Object* temp = get(i); |
set(i, get(j)); |
@@ -15973,33 +15952,6 @@ void FixedArray::SortPairs(FixedArray* numbers, uint32_t len) { |
} |
-// Fill in the names of own properties into the supplied storage. The main |
-// purpose of this function is to provide reflection information for the object |
-// mirrors. |
-int JSObject::GetOwnPropertyNames(FixedArray* storage, int index, |
- PropertyFilter filter) { |
- DCHECK(storage->length() >= (NumberOfOwnProperties(filter) - index)); |
- if (HasFastProperties()) { |
- int start_index = index; |
- int real_size = map()->NumberOfOwnDescriptors(); |
- DescriptorArray* descs = map()->instance_descriptors(); |
- for (int i = 0; i < real_size; i++) { |
- if ((descs->GetDetails(i).attributes() & filter) == 0 && |
- !descs->GetKey(i)->FilterKey(filter)) { |
- storage->set(index++, descs->GetKey(i)); |
- } |
- } |
- return index - start_index; |
- } else if (IsJSGlobalObject()) { |
- return global_dictionary()->CopyKeysTo(storage, index, filter, |
- GlobalDictionary::UNSORTED); |
- } else { |
- return property_dictionary()->CopyKeysTo(storage, index, filter, |
- NameDictionary::UNSORTED); |
- } |
-} |
- |
- |
void JSObject::CollectOwnPropertyNames(KeyAccumulator* keys, |
PropertyFilter filter) { |
if (HasFastProperties()) { |