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()); |