OLD | NEW |
1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/objects.h" | 5 #include "src/objects.h" |
6 | 6 |
7 #include <cmath> | 7 #include <cmath> |
8 #include <iomanip> | 8 #include <iomanip> |
9 #include <sstream> | 9 #include <sstream> |
10 | 10 |
(...skipping 6161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6172 Handle<JSReceiver> props; | 6172 Handle<JSReceiver> props; |
6173 if (!Object::ToObject(isolate, properties).ToHandle(&props)) { | 6173 if (!Object::ToObject(isolate, properties).ToHandle(&props)) { |
6174 THROW_NEW_ERROR(isolate, | 6174 THROW_NEW_ERROR(isolate, |
6175 NewTypeError(MessageTemplate::kUndefinedOrNullToObject), | 6175 NewTypeError(MessageTemplate::kUndefinedOrNullToObject), |
6176 Object); | 6176 Object); |
6177 } | 6177 } |
6178 // 4. Let keys be props.[[OwnPropertyKeys]](). | 6178 // 4. Let keys be props.[[OwnPropertyKeys]](). |
6179 // 5. ReturnIfAbrupt(keys). | 6179 // 5. ReturnIfAbrupt(keys). |
6180 Handle<FixedArray> keys; | 6180 Handle<FixedArray> keys; |
6181 ASSIGN_RETURN_ON_EXCEPTION( | 6181 ASSIGN_RETURN_ON_EXCEPTION( |
6182 isolate, keys, JSReceiver::GetKeys(props, OWN_ONLY, ALL_PROPERTIES), | 6182 isolate, keys, KeyAccumulator::GetKeys(props, OWN_ONLY, ALL_PROPERTIES), |
6183 Object); | 6183 Object); |
6184 // 6. Let descriptors be an empty List. | 6184 // 6. Let descriptors be an empty List. |
6185 int capacity = keys->length(); | 6185 int capacity = keys->length(); |
6186 std::vector<PropertyDescriptor> descriptors(capacity); | 6186 std::vector<PropertyDescriptor> descriptors(capacity); |
6187 size_t descriptors_index = 0; | 6187 size_t descriptors_index = 0; |
6188 // 7. Repeat for each element nextKey of keys in List order, | 6188 // 7. Repeat for each element nextKey of keys in List order, |
6189 for (int i = 0; i < keys->length(); ++i) { | 6189 for (int i = 0; i < keys->length(); ++i) { |
6190 Handle<Object> next_key(keys->get(i), isolate); | 6190 Handle<Object> next_key(keys->get(i), isolate); |
6191 // 7a. Let propDesc be props.[[GetOwnProperty]](nextKey). | 6191 // 7a. Let propDesc be props.[[GetOwnProperty]](nextKey). |
6192 // 7b. ReturnIfAbrupt(propDesc). | 6192 // 7b. ReturnIfAbrupt(propDesc). |
(...skipping 1658 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7851 } | 7851 } |
7852 } | 7852 } |
7853 } | 7853 } |
7854 } else { | 7854 } else { |
7855 // Only deep copy fields from the object literal expression. | 7855 // Only deep copy fields from the object literal expression. |
7856 // In particular, don't try to copy the length attribute of | 7856 // In particular, don't try to copy the length attribute of |
7857 // an array. | 7857 // an array. |
7858 PropertyFilter filter = static_cast<PropertyFilter>( | 7858 PropertyFilter filter = static_cast<PropertyFilter>( |
7859 ONLY_WRITABLE | ONLY_ENUMERABLE | ONLY_CONFIGURABLE); | 7859 ONLY_WRITABLE | ONLY_ENUMERABLE | ONLY_CONFIGURABLE); |
7860 KeyAccumulator accumulator(isolate, OWN_ONLY, filter); | 7860 KeyAccumulator accumulator(isolate, OWN_ONLY, filter); |
7861 accumulator.NextPrototype(); | 7861 accumulator.CollectOwnPropertyNames(copy, copy); |
7862 accumulator.CollectOwnPropertyNames(copy); | |
7863 Handle<FixedArray> names = accumulator.GetKeys(); | 7862 Handle<FixedArray> names = accumulator.GetKeys(); |
7864 for (int i = 0; i < names->length(); i++) { | 7863 for (int i = 0; i < names->length(); i++) { |
7865 DCHECK(names->get(i)->IsName()); | 7864 DCHECK(names->get(i)->IsName()); |
7866 Handle<Name> name(Name::cast(names->get(i))); | 7865 Handle<Name> name(Name::cast(names->get(i))); |
7867 Handle<Object> value = | 7866 Handle<Object> value = |
7868 JSObject::GetProperty(copy, name).ToHandleChecked(); | 7867 JSObject::GetProperty(copy, name).ToHandleChecked(); |
7869 if (value->IsJSObject()) { | 7868 if (value->IsJSObject()) { |
7870 Handle<JSObject> result; | 7869 Handle<JSObject> result; |
7871 ASSIGN_RETURN_ON_EXCEPTION( | 7870 ASSIGN_RETURN_ON_EXCEPTION( |
7872 isolate, result, | 7871 isolate, result, |
(...skipping 284 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8157 | 8156 |
8158 | 8157 |
8159 bool Map::OnlyHasSimpleProperties() { | 8158 bool Map::OnlyHasSimpleProperties() { |
8160 // Wrapped string elements aren't explicitly stored in the elements backing | 8159 // Wrapped string elements aren't explicitly stored in the elements backing |
8161 // store, but are loaded indirectly from the underlying string. | 8160 // store, but are loaded indirectly from the underlying string. |
8162 return !IsStringWrapperElementsKind(elements_kind()) && | 8161 return !IsStringWrapperElementsKind(elements_kind()) && |
8163 instance_type() > LAST_SPECIAL_RECEIVER_TYPE && | 8162 instance_type() > LAST_SPECIAL_RECEIVER_TYPE && |
8164 !has_hidden_prototype() && !is_dictionary_map(); | 8163 !has_hidden_prototype() && !is_dictionary_map(); |
8165 } | 8164 } |
8166 | 8165 |
8167 MaybeHandle<FixedArray> JSReceiver::GetKeys(Handle<JSReceiver> object, | |
8168 KeyCollectionType type, | |
8169 PropertyFilter filter, | |
8170 GetKeysConversion keys_conversion, | |
8171 bool filter_proxy_keys) { | |
8172 return KeyAccumulator::GetKeys(object, type, filter, keys_conversion, | |
8173 filter_proxy_keys); | |
8174 } | |
8175 | |
8176 MUST_USE_RESULT Maybe<bool> FastGetOwnValuesOrEntries( | 8166 MUST_USE_RESULT Maybe<bool> FastGetOwnValuesOrEntries( |
8177 Isolate* isolate, Handle<JSReceiver> receiver, bool get_entries, | 8167 Isolate* isolate, Handle<JSReceiver> receiver, bool get_entries, |
8178 Handle<FixedArray>* result) { | 8168 Handle<FixedArray>* result) { |
8179 Handle<Map> map(JSReceiver::cast(*receiver)->map(), isolate); | 8169 Handle<Map> map(JSReceiver::cast(*receiver)->map(), isolate); |
8180 | 8170 |
8181 if (!map->IsJSObjectMap()) return Just(false); | 8171 if (!map->IsJSObjectMap()) return Just(false); |
8182 if (!map->OnlyHasSimpleProperties()) return Just(false); | 8172 if (!map->OnlyHasSimpleProperties()) return Just(false); |
8183 | 8173 |
8184 Handle<JSObject> object(JSObject::cast(*receiver)); | 8174 Handle<JSObject> object(JSObject::cast(*receiver)); |
8185 | 8175 |
(...skipping 8996 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
17182 if (!AccessorInfo::cast(accessors)->all_can_read()) continue; | 17172 if (!AccessorInfo::cast(accessors)->all_can_read()) continue; |
17183 } | 17173 } |
17184 array->set(array_size++, Smi::FromInt(i)); | 17174 array->set(array_size++, Smi::FromInt(i)); |
17185 } | 17175 } |
17186 | 17176 |
17187 EnumIndexComparator<Derived> cmp(static_cast<Derived*>(raw_dict)); | 17177 EnumIndexComparator<Derived> cmp(static_cast<Derived*>(raw_dict)); |
17188 Smi** start = reinterpret_cast<Smi**>(array->GetFirstElementAddress()); | 17178 Smi** start = reinterpret_cast<Smi**>(array->GetFirstElementAddress()); |
17189 std::sort(start, start + array_size, cmp); | 17179 std::sort(start, start + array_size, cmp); |
17190 } | 17180 } |
17191 | 17181 |
| 17182 bool has_seen_symbol = false; |
17192 for (int i = 0; i < array_size; i++) { | 17183 for (int i = 0; i < array_size; i++) { |
17193 int index = Smi::cast(array->get(i))->value(); | 17184 int index = Smi::cast(array->get(i))->value(); |
17194 keys->AddKey(dictionary->KeyAt(index), DO_NOT_CONVERT); | 17185 Object* key = dictionary->KeyAt(index); |
| 17186 if (key->IsSymbol()) { |
| 17187 has_seen_symbol = true; |
| 17188 continue; |
| 17189 } |
| 17190 keys->AddKey(key, DO_NOT_CONVERT); |
| 17191 } |
| 17192 if (has_seen_symbol) { |
| 17193 for (int i = 0; i < array_size; i++) { |
| 17194 int index = Smi::cast(array->get(i))->value(); |
| 17195 Object* key = dictionary->KeyAt(index); |
| 17196 if (!key->IsSymbol()) continue; |
| 17197 keys->AddKey(key, DO_NOT_CONVERT); |
| 17198 } |
17195 } | 17199 } |
17196 } | 17200 } |
17197 | 17201 |
17198 | 17202 |
17199 // Backwards lookup (slow). | 17203 // Backwards lookup (slow). |
17200 template<typename Derived, typename Shape, typename Key> | 17204 template<typename Derived, typename Shape, typename Key> |
17201 Object* Dictionary<Derived, Shape, Key>::SlowReverseLookup(Object* value) { | 17205 Object* Dictionary<Derived, Shape, Key>::SlowReverseLookup(Object* value) { |
17202 int capacity = this->Capacity(); | 17206 int capacity = this->Capacity(); |
17203 for (int i = 0; i < capacity; i++) { | 17207 for (int i = 0; i < capacity; i++) { |
17204 Object* k = this->KeyAt(i); | 17208 Object* k = this->KeyAt(i); |
(...skipping 279 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
17484 int new_entry = nof + table->NumberOfDeletedElements(); | 17488 int new_entry = nof + table->NumberOfDeletedElements(); |
17485 int new_index = table->EntryToIndex(new_entry); | 17489 int new_index = table->EntryToIndex(new_entry); |
17486 table->set(new_index, *key); | 17490 table->set(new_index, *key); |
17487 table->set(new_index + kChainOffset, Smi::FromInt(previous_entry)); | 17491 table->set(new_index + kChainOffset, Smi::FromInt(previous_entry)); |
17488 // and point the bucket to the new entry. | 17492 // and point the bucket to the new entry. |
17489 table->set(kHashTableStartIndex + bucket, Smi::FromInt(new_entry)); | 17493 table->set(kHashTableStartIndex + bucket, Smi::FromInt(new_entry)); |
17490 table->SetNumberOfElements(nof + 1); | 17494 table->SetNumberOfElements(nof + 1); |
17491 return table; | 17495 return table; |
17492 } | 17496 } |
17493 | 17497 |
| 17498 Handle<FixedArray> OrderedHashSet::ConvertToKeysArray( |
| 17499 Handle<OrderedHashSet> table, GetKeysConversion convert) { |
| 17500 Isolate* isolate = table->GetIsolate(); |
| 17501 int length = table->NumberOfElements(); |
| 17502 int nof_buckets = table->NumberOfBuckets(); |
| 17503 // Convert the dictionary to a linear list. |
| 17504 Handle<FixedArray> result = Handle<FixedArray>::cast(table); |
| 17505 // From this point on table is no longer a valid OrderedHashSet. |
| 17506 result->set_map(isolate->heap()->fixed_array_map()); |
| 17507 for (int i = 0; i < length; i++) { |
| 17508 int index = kHashTableStartIndex + nof_buckets + (i * kEntrySize); |
| 17509 Object* key = table->get(index); |
| 17510 if (convert == CONVERT_TO_STRING && key->IsNumber()) { |
| 17511 key = *isolate->factory()->NumberToString(handle(key, isolate)); |
| 17512 } |
| 17513 result->set(i, key); |
| 17514 } |
| 17515 result->Shrink(length); |
| 17516 return result; |
| 17517 } |
17494 | 17518 |
17495 template<class Derived, class Iterator, int entrysize> | 17519 template<class Derived, class Iterator, int entrysize> |
17496 Handle<Derived> OrderedHashTable<Derived, Iterator, entrysize>::Rehash( | 17520 Handle<Derived> OrderedHashTable<Derived, Iterator, entrysize>::Rehash( |
17497 Handle<Derived> table, int new_capacity) { | 17521 Handle<Derived> table, int new_capacity) { |
17498 Isolate* isolate = table->GetIsolate(); | 17522 Isolate* isolate = table->GetIsolate(); |
17499 Heap* heap = isolate->heap(); | 17523 Heap* heap = isolate->heap(); |
17500 DCHECK(!table->IsObsolete()); | 17524 DCHECK(!table->IsObsolete()); |
17501 | 17525 |
17502 Handle<Derived> new_table = Allocate( | 17526 Handle<Derived> new_table = Allocate( |
17503 isolate, new_capacity, heap->InNewSpace(*table) ? NOT_TENURED : TENURED); | 17527 isolate, new_capacity, heap->InNewSpace(*table) ? NOT_TENURED : TENURED); |
(...skipping 937 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
18441 if (cell->value() != *new_value) { | 18465 if (cell->value() != *new_value) { |
18442 cell->set_value(*new_value); | 18466 cell->set_value(*new_value); |
18443 Isolate* isolate = cell->GetIsolate(); | 18467 Isolate* isolate = cell->GetIsolate(); |
18444 cell->dependent_code()->DeoptimizeDependentCodeGroup( | 18468 cell->dependent_code()->DeoptimizeDependentCodeGroup( |
18445 isolate, DependentCode::kPropertyCellChangedGroup); | 18469 isolate, DependentCode::kPropertyCellChangedGroup); |
18446 } | 18470 } |
18447 } | 18471 } |
18448 | 18472 |
18449 } // namespace internal | 18473 } // namespace internal |
18450 } // namespace v8 | 18474 } // namespace v8 |
OLD | NEW |