| Index: src/objects.cc | 
| diff --git a/src/objects.cc b/src/objects.cc | 
| index 5bf38b462484ff077c0860f47082afc5fea5534d..3f028c62824a35653bdc4ef03b265f6eedd4413e 100644 | 
| --- a/src/objects.cc | 
| +++ b/src/objects.cc | 
| @@ -6118,10 +6118,11 @@ Object* JSReceiver::DefineProperties(Isolate* isolate, Handle<Object> object, | 
| Handle<FixedArray> keys; | 
| ASSIGN_RETURN_FAILURE_ON_EXCEPTION( | 
| isolate, keys, | 
| -      JSReceiver::GetKeys(props, JSReceiver::OWN_ONLY, INCLUDE_SYMBOLS)); | 
| +      JSReceiver::GetKeys(props, JSReceiver::OWN_ONLY, ALL_PROPERTIES)); | 
| // 6. Let descriptors be an empty List. | 
| int capacity = keys->length(); | 
| std::vector<PropertyDescriptor> descriptors(capacity); | 
| +  size_t descriptors_index = 0; | 
| // 7. Repeat for each element nextKey of keys in List order, | 
| for (int i = 0; i < keys->length(); ++i) { | 
| Handle<Object> next_key(keys->get(i), isolate); | 
| @@ -6136,24 +6137,24 @@ Object* JSReceiver::DefineProperties(Isolate* isolate, Handle<Object> object, | 
| PropertyAttributes attrs = maybe.FromJust(); | 
| // 7c. If propDesc is not undefined and propDesc.[[Enumerable]] is true: | 
| if (attrs == ABSENT) continue; | 
| -    // GetKeys() only returns enumerable keys. | 
| -    DCHECK((attrs & DONT_ENUM) == 0); | 
| +    if (attrs & DONT_ENUM) continue; | 
| // 7c i. Let descObj be Get(props, nextKey). | 
| // 7c ii. ReturnIfAbrupt(descObj). | 
| Handle<Object> desc_obj; | 
| ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, desc_obj, | 
| Object::GetProperty(&it)); | 
| // 7c iii. Let desc be ToPropertyDescriptor(descObj). | 
| -    success = PropertyDescriptor::ToPropertyDescriptor(isolate, desc_obj, | 
| -                                                       &descriptors[i]); | 
| +    success = PropertyDescriptor::ToPropertyDescriptor( | 
| +        isolate, desc_obj, &descriptors[descriptors_index]); | 
| // 7c iv. ReturnIfAbrupt(desc). | 
| if (!success) return isolate->heap()->exception(); | 
| // 7c v. Append the pair (a two element List) consisting of nextKey and | 
| //       desc to the end of descriptors. | 
| -    descriptors[i].set_name(next_key); | 
| +    descriptors[descriptors_index].set_name(next_key); | 
| +    descriptors_index++; | 
| } | 
| // 8. For each pair from descriptors in list order, | 
| -  for (size_t i = 0; i < descriptors.size(); ++i) { | 
| +  for (size_t i = 0; i < descriptors_index; ++i) { | 
| PropertyDescriptor* desc = &descriptors[i]; | 
| // 8a. Let P be the first element of pair. | 
| // 8b. Let desc be the second element of pair. | 
| @@ -7717,10 +7718,10 @@ MaybeHandle<JSObject> JSObjectWalkVisitor<ContextObject>::StructureWalk( | 
| isolate->factory()->NewFixedArray(copy->NumberOfOwnProperties()); | 
| copy->GetOwnPropertyNames(*names, 0); | 
| for (int i = 0; i < names->length(); i++) { | 
| -        DCHECK(names->get(i)->IsString()); | 
| -        Handle<String> key_string(String::cast(names->get(i))); | 
| +        DCHECK(names->get(i)->IsName()); | 
| +        Handle<Name> name(Name::cast(names->get(i))); | 
| Maybe<PropertyAttributes> maybe = | 
| -            JSReceiver::GetOwnPropertyAttributes(copy, key_string); | 
| +            JSReceiver::GetOwnPropertyAttributes(copy, name); | 
| DCHECK(maybe.IsJust()); | 
| PropertyAttributes attributes = maybe.FromJust(); | 
| // Only deep copy fields from the object literal expression. | 
| @@ -7728,7 +7729,7 @@ MaybeHandle<JSObject> JSObjectWalkVisitor<ContextObject>::StructureWalk( | 
| // an array. | 
| if (attributes != NONE) continue; | 
| Handle<Object> value = | 
| -            Object::GetProperty(copy, key_string).ToHandleChecked(); | 
| +            Object::GetProperty(copy, name).ToHandleChecked(); | 
| if (value->IsJSObject()) { | 
| Handle<JSObject> result; | 
| ASSIGN_RETURN_ON_EXCEPTION( | 
| @@ -7737,7 +7738,7 @@ MaybeHandle<JSObject> JSObjectWalkVisitor<ContextObject>::StructureWalk( | 
| JSObject); | 
| if (copying) { | 
| // Creating object copy for literals. No strict mode needed. | 
| -            JSObject::SetProperty(copy, key_string, result, SLOPPY).Assert(); | 
| +            JSObject::SetProperty(copy, name, result, SLOPPY).Assert(); | 
| } | 
| } | 
| } | 
| @@ -7941,7 +7942,7 @@ bool JSReceiver::IsSimpleEnum() { | 
|  | 
|  | 
| int Map::NumberOfDescribedProperties(DescriptorFlag which, | 
| -                                     PropertyAttributes filter) { | 
| +                                     PropertyFilter filter) { | 
| int result = 0; | 
| DescriptorArray* descs = instance_descriptors(); | 
| int limit = which == ALL_DESCRIPTORS | 
| @@ -8006,14 +8007,14 @@ Handle<FixedArray> GetFastEnumPropertyKeys(Isolate* isolate, | 
| // If the enum length of the given map is set to kInvalidEnumCache, this | 
| // means that the map itself has never used the present enum cache. The | 
| // first step to using the cache is to set the enum length of the map by | 
| -  // counting the number of own descriptors that are not DONT_ENUM or | 
| -  // SYMBOLIC. | 
| +  // counting the number of own descriptors that are ENUMERABLE_STRINGS. | 
| if (own_property_count == kInvalidEnumCacheSentinel) { | 
| own_property_count = | 
| -        map->NumberOfDescribedProperties(OWN_DESCRIPTORS, DONT_SHOW); | 
| +        map->NumberOfDescribedProperties(OWN_DESCRIPTORS, ENUMERABLE_STRINGS); | 
| } else { | 
| -    DCHECK(own_property_count == | 
| -           map->NumberOfDescribedProperties(OWN_DESCRIPTORS, DONT_SHOW)); | 
| +    DCHECK( | 
| +        own_property_count == | 
| +        map->NumberOfDescribedProperties(OWN_DESCRIPTORS, ENUMERABLE_STRINGS)); | 
| } | 
|  | 
| if (descs->HasEnumCache()) { | 
| @@ -8101,8 +8102,7 @@ Handle<FixedArray> JSObject::GetEnumPropertyKeys(Handle<JSObject> object, | 
|  | 
|  | 
| static bool GetKeysFromJSObject(Isolate* isolate, Handle<JSReceiver> receiver, | 
| -                                Handle<JSObject> object, KeyFilter filter, | 
| -                                Enumerability enum_policy, | 
| +                                Handle<JSObject> object, PropertyFilter filter, | 
| KeyAccumulator* accumulator) { | 
| accumulator->NextPrototype(); | 
| // Check access rights if required. | 
| @@ -8114,11 +8114,7 @@ static bool GetKeysFromJSObject(Isolate* isolate, Handle<JSReceiver> receiver, | 
| return false; | 
| } | 
|  | 
| -  PropertyAttributes attr_filter = static_cast<PropertyAttributes>( | 
| -      (enum_policy == RESPECT_ENUMERABILITY ? DONT_ENUM : NONE) | | 
| -      PRIVATE_SYMBOL); | 
| - | 
| -  JSObject::CollectOwnElementKeys(object, accumulator, attr_filter); | 
| +  JSObject::CollectOwnElementKeys(object, accumulator, filter); | 
|  | 
| // Add the element keys from the interceptor. | 
| if (object->HasIndexedInterceptor()) { | 
| @@ -8130,9 +8126,7 @@ static bool GetKeysFromJSObject(Isolate* isolate, Handle<JSReceiver> receiver, | 
| RETURN_VALUE_IF_SCHEDULED_EXCEPTION(isolate, false); | 
| } | 
|  | 
| -  if (filter == SKIP_SYMBOLS) { | 
| -    if (enum_policy == IGNORE_ENUMERABILITY) UNIMPLEMENTED(); | 
| - | 
| +  if (filter == ENUMERABLE_STRINGS) { | 
| // We can cache the computed property keys if access checks are | 
| // not needed and no interceptors are involved. | 
| // | 
| @@ -8154,8 +8148,7 @@ static bool GetKeysFromJSObject(Isolate* isolate, Handle<JSReceiver> receiver, | 
| JSObject::GetEnumPropertyKeys(object, cache_enum_length); | 
| accumulator->AddKeys(enum_keys); | 
| } else { | 
| -    DCHECK(filter == INCLUDE_SYMBOLS); | 
| -    object->CollectOwnPropertyNames(accumulator, attr_filter); | 
| +    object->CollectOwnPropertyNames(accumulator, filter); | 
| } | 
|  | 
| // Add the property keys from the interceptor. | 
| @@ -8176,7 +8169,7 @@ static bool GetKeysFromJSObject(Isolate* isolate, Handle<JSReceiver> receiver, | 
| static bool GetKeys_Internal(Isolate* isolate, Handle<JSReceiver> receiver, | 
| Handle<JSReceiver> object, | 
| JSReceiver::KeyCollectionType type, | 
| -                             KeyFilter filter, Enumerability enum_policy, | 
| +                             PropertyFilter filter, | 
| KeyAccumulator* accumulator) { | 
| PrototypeIterator::WhereToEnd end = type == JSReceiver::OWN_ONLY | 
| ? PrototypeIterator::END_AT_NON_HIDDEN | 
| @@ -8191,7 +8184,7 @@ static bool GetKeys_Internal(Isolate* isolate, Handle<JSReceiver> receiver, | 
| if (type == JSReceiver::OWN_ONLY) { | 
| result = JSProxy::OwnPropertyKeys(isolate, receiver, | 
| Handle<JSProxy>::cast(current), | 
| -                                          filter, enum_policy, accumulator); | 
| +                                          filter, accumulator); | 
| } else { | 
| DCHECK(type == JSReceiver::INCLUDE_PROTOS); | 
| result = JSProxy::Enumerate( | 
| @@ -8201,7 +8194,7 @@ static bool GetKeys_Internal(Isolate* isolate, Handle<JSReceiver> receiver, | 
| DCHECK(current->IsJSObject()); | 
| result = GetKeysFromJSObject(isolate, receiver, | 
| Handle<JSObject>::cast(current), filter, | 
| -                                   enum_policy, accumulator); | 
| +                                   accumulator); | 
| } | 
| if (!result) { | 
| if (isolate->has_pending_exception()) { | 
| @@ -8243,7 +8236,7 @@ bool JSProxy::Enumerate(Isolate* isolate, Handle<JSReceiver> receiver, | 
| if (trap->IsUndefined()) { | 
| // 6a. Return target.[[Enumerate]](). | 
| return GetKeys_Internal(isolate, receiver, target, INCLUDE_PROTOS, | 
| -                            SKIP_SYMBOLS, RESPECT_ENUMERABILITY, accumulator); | 
| +                            ENUMERABLE_STRINGS, accumulator); | 
| } | 
| // The "proxy_enumerate" helper calls the trap (steps 7 - 9), which returns | 
| // a generator; it then iterates over that generator until it's exhausted | 
| @@ -8324,8 +8317,7 @@ static MaybeHandle<FixedArray> CreateListFromArrayLike_StringSymbol( | 
| // Returns "false" in case of exception. | 
| // static | 
| bool JSProxy::OwnPropertyKeys(Isolate* isolate, Handle<JSReceiver> receiver, | 
| -                              Handle<JSProxy> proxy, KeyFilter filter, | 
| -                              Enumerability enum_policy, | 
| +                              Handle<JSProxy> proxy, PropertyFilter filter, | 
| KeyAccumulator* accumulator) { | 
| // 1. Let handler be the value of the [[ProxyHandler]] internal slot of O. | 
| Handle<Object> handler(proxy->handler(), isolate); | 
| @@ -8349,7 +8341,7 @@ bool JSProxy::OwnPropertyKeys(Isolate* isolate, Handle<JSReceiver> receiver, | 
| if (trap->IsUndefined()) { | 
| // 6a. Return target.[[OwnPropertyKeys]](). | 
| return GetKeys_Internal(isolate, receiver, target, OWN_ONLY, filter, | 
| -                            enum_policy, accumulator); | 
| +                            accumulator); | 
| } | 
| // 7. Let trapResultArray be Call(trap, handler, «target»). | 
| Handle<Object> trap_result_array; | 
| @@ -8371,8 +8363,8 @@ bool JSProxy::OwnPropertyKeys(Isolate* isolate, Handle<JSReceiver> receiver, | 
| Handle<FixedArray> target_keys; | 
| ASSIGN_RETURN_ON_EXCEPTION_VALUE( | 
| isolate, target_keys, | 
| -      JSReceiver::GetKeys(target, JSReceiver::OWN_ONLY, INCLUDE_SYMBOLS, | 
| -                          CONVERT_TO_STRING, IGNORE_ENUMERABILITY), | 
| +      JSReceiver::GetKeys(target, JSReceiver::OWN_ONLY, ALL_PROPERTIES, | 
| +                          CONVERT_TO_STRING), | 
| false); | 
| // 11. (Assert) | 
| // 12. Let targetConfigurableKeys be an empty List. | 
| @@ -8408,8 +8400,7 @@ bool JSProxy::OwnPropertyKeys(Isolate* isolate, Handle<JSReceiver> receiver, | 
| //     then: | 
| if (extensible_target && nonconfigurable_keys_length == 0) { | 
| // 15a. Return trapResult. | 
| -    return accumulator->AddKeysFromProxy(proxy, trap_result, filter, | 
| -                                         enum_policy); | 
| +    return accumulator->AddKeysFromProxy(proxy, trap_result); | 
| } | 
| // 16. Let uncheckedResultKeys be a new List which is a copy of trapResult. | 
| Zone set_zone; | 
| @@ -8438,8 +8429,7 @@ bool JSProxy::OwnPropertyKeys(Isolate* isolate, Handle<JSReceiver> receiver, | 
| } | 
| // 18. If extensibleTarget is true, return trapResult. | 
| if (extensible_target) { | 
| -    return accumulator->AddKeysFromProxy(proxy, trap_result, filter, | 
| -                                         enum_policy); | 
| +    return accumulator->AddKeysFromProxy(proxy, trap_result); | 
| } | 
| // 19. Repeat, for each key that is an element of targetConfigurableKeys: | 
| for (int i = 0; i < target_configurable_keys->length(); ++i) { | 
| @@ -8465,20 +8455,18 @@ bool JSProxy::OwnPropertyKeys(Isolate* isolate, Handle<JSReceiver> receiver, | 
| return false; | 
| } | 
| // 21. Return trapResult. | 
| -  return accumulator->AddKeysFromProxy(proxy, trap_result, filter, enum_policy); | 
| +  return accumulator->AddKeysFromProxy(proxy, trap_result); | 
| } | 
|  | 
|  | 
| MaybeHandle<FixedArray> JSReceiver::GetKeys(Handle<JSReceiver> object, | 
| KeyCollectionType type, | 
| -                                            KeyFilter filter, | 
| -                                            GetKeysConversion keys_conversion, | 
| -                                            Enumerability enum_policy) { | 
| +                                            PropertyFilter filter, | 
| +                                            GetKeysConversion keys_conversion) { | 
| USE(ContainsOnlyValidKeys); | 
| Isolate* isolate = object->GetIsolate(); | 
| KeyAccumulator accumulator(isolate, filter); | 
| -  if (!GetKeys_Internal(isolate, object, object, type, filter, enum_policy, | 
| -                        &accumulator)) { | 
| +  if (!GetKeys_Internal(isolate, object, object, type, filter, &accumulator)) { | 
| DCHECK(isolate->has_pending_exception()); | 
| return MaybeHandle<FixedArray>(); | 
| } | 
| @@ -14446,8 +14434,7 @@ MaybeHandle<Object> JSArray::ObservableSetLength(Handle<JSArray> array, | 
| uint32_t old_length = 0; | 
| CHECK(old_length_handle->ToArrayLength(&old_length)); | 
|  | 
| -  static const PropertyAttributes kNoAttrFilter = NONE; | 
| -  int num_elements = array->NumberOfOwnElements(kNoAttrFilter); | 
| +  int num_elements = array->NumberOfOwnElements(ALL_PROPERTIES); | 
| if (num_elements > 0) { | 
| if (old_length == static_cast<uint32_t>(num_elements)) { | 
| // Simple case for arrays without holes. | 
| @@ -14459,7 +14446,7 @@ MaybeHandle<Object> JSArray::ObservableSetLength(Handle<JSArray> array, | 
| // TODO(rafaelw): For fast, sparse arrays, we can avoid iterating over | 
| // the to-be-removed indices twice. | 
| Handle<FixedArray> keys = isolate->factory()->NewFixedArray(num_elements); | 
| -      array->GetOwnElementKeys(*keys, kNoAttrFilter); | 
| +      array->GetOwnElementKeys(*keys, ALL_PROPERTIES); | 
| while (num_elements-- > 0) { | 
| uint32_t index = NumberToUint32(keys->get(num_elements)); | 
| if (index < new_length) break; | 
| @@ -15685,13 +15672,13 @@ Maybe<bool> JSObject::HasRealNamedCallbackProperty(Handle<JSObject> object, | 
| } | 
|  | 
|  | 
| -int JSObject::NumberOfOwnProperties(PropertyAttributes filter) { | 
| +// Private symbols are always filtered out. | 
| +int JSObject::NumberOfOwnProperties(PropertyFilter filter) { | 
| if (HasFastProperties()) { | 
| Map* map = this->map(); | 
| -    if (filter == NONE) return map->NumberOfOwnDescriptors(); | 
| -    if (filter == DONT_SHOW) { | 
| -      // The cached enum length was computed with filter == DONT_SHOW, so | 
| -      // that's the only filter for which it's valid to retrieve it. | 
| +    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; | 
| } | 
| @@ -15821,7 +15808,7 @@ void FixedArray::SortPairs(FixedArray* numbers, uint32_t len) { | 
| // purpose of this function is to provide reflection information for the object | 
| // mirrors. | 
| int JSObject::GetOwnPropertyNames(FixedArray* storage, int index, | 
| -                                  PropertyAttributes filter) { | 
| +                                  PropertyFilter filter) { | 
| DCHECK(storage->length() >= (NumberOfOwnProperties(filter) - index)); | 
| if (HasFastProperties()) { | 
| int start_index = index; | 
| @@ -15845,7 +15832,7 @@ int JSObject::GetOwnPropertyNames(FixedArray* storage, int index, | 
|  | 
|  | 
| void JSObject::CollectOwnPropertyNames(KeyAccumulator* keys, | 
| -                                       PropertyAttributes filter) { | 
| +                                       PropertyFilter filter) { | 
| if (HasFastProperties()) { | 
| int real_size = map()->NumberOfOwnDescriptors(); | 
| Handle<DescriptorArray> descs(map()->instance_descriptors()); | 
| @@ -15863,7 +15850,7 @@ void JSObject::CollectOwnPropertyNames(KeyAccumulator* keys, | 
| } | 
|  | 
|  | 
| -int JSObject::NumberOfOwnElements(PropertyAttributes filter) { | 
| +int JSObject::NumberOfOwnElements(PropertyFilter filter) { | 
| // Fast case for objects with no elements. | 
| if (!IsJSValue() && HasFastElements()) { | 
| uint32_t length = | 
| @@ -15879,13 +15866,13 @@ int JSObject::NumberOfOwnElements(PropertyAttributes filter) { | 
|  | 
|  | 
| int JSObject::NumberOfEnumElements() { | 
| -  return NumberOfOwnElements(static_cast<PropertyAttributes>(DONT_ENUM)); | 
| +  return NumberOfOwnElements(ONLY_ENUMERABLE); | 
| } | 
|  | 
|  | 
| void JSObject::CollectOwnElementKeys(Handle<JSObject> object, | 
| KeyAccumulator* keys, | 
| -                                     PropertyAttributes filter) { | 
| +                                     PropertyFilter filter) { | 
| uint32_t string_keys = 0; | 
|  | 
| // If this is a String wrapper, add the string indices first, | 
| @@ -15906,8 +15893,7 @@ void JSObject::CollectOwnElementKeys(Handle<JSObject> object, | 
| } | 
|  | 
|  | 
| -int JSObject::GetOwnElementKeys(FixedArray* storage, | 
| -                                PropertyAttributes filter) { | 
| +int JSObject::GetOwnElementKeys(FixedArray* storage, PropertyFilter filter) { | 
| int counter = 0; | 
|  | 
| // If this is a String wrapper, add the string indices first, | 
| @@ -17738,7 +17724,7 @@ Handle<UnseededNumberDictionary> UnseededNumberDictionary::Set( | 
|  | 
| template <typename Derived, typename Shape, typename Key> | 
| int Dictionary<Derived, Shape, Key>::NumberOfElementsFilterAttributes( | 
| -    PropertyAttributes filter) { | 
| +    PropertyFilter filter) { | 
| int capacity = this->Capacity(); | 
| int result = 0; | 
| for (int i = 0; i < capacity; i++) { | 
| @@ -17759,12 +17745,12 @@ bool Dictionary<Derived, Shape, Key>::HasComplexElements() { | 
| int capacity = this->Capacity(); | 
| for (int i = 0; i < capacity; i++) { | 
| Object* k = this->KeyAt(i); | 
| -    if (this->IsKey(k) && !k->FilterKey(NONE)) { | 
| +    if (this->IsKey(k) && !k->FilterKey(ALL_PROPERTIES)) { | 
| if (this->IsDeleted(i)) continue; | 
| PropertyDetails details = this->DetailsAt(i); | 
| if (details.type() == ACCESSOR_CONSTANT) return true; | 
| PropertyAttributes attr = details.attributes(); | 
| -      if (attr & (READ_ONLY | DONT_DELETE | DONT_ENUM)) return true; | 
| +      if (attr & ALL_ATTRIBUTES_MASK) return true; | 
| } | 
| } | 
| return false; | 
| @@ -17811,7 +17797,7 @@ void Dictionary<Derived, Shape, Key>::CopyEnumKeysTo(FixedArray* storage) { | 
|  | 
| template <typename Derived, typename Shape, typename Key> | 
| int Dictionary<Derived, Shape, Key>::CopyKeysTo( | 
| -    FixedArray* storage, int index, PropertyAttributes filter, | 
| +    FixedArray* storage, int index, PropertyFilter filter, | 
| typename Dictionary<Derived, Shape, Key>::SortMode sort_mode) { | 
| DCHECK(storage->length() >= NumberOfElementsFilterAttributes(filter)); | 
| int start_index = index; | 
| @@ -17836,7 +17822,7 @@ int Dictionary<Derived, Shape, Key>::CopyKeysTo( | 
| template <typename Derived, typename Shape, typename Key> | 
| void Dictionary<Derived, Shape, Key>::CollectKeysTo( | 
| Handle<Dictionary<Derived, Shape, Key> > dictionary, KeyAccumulator* keys, | 
| -    PropertyAttributes filter) { | 
| +    PropertyFilter filter) { | 
| int capacity = dictionary->Capacity(); | 
| Handle<FixedArray> array = | 
| keys->isolate()->factory()->NewFixedArray(dictionary->NumberOfElements()); | 
|  |