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, KeyAccumulator::GetKeys(props, OWN_ONLY, ALL_PROPERTIES), | 6182 isolate, keys, JSReceiver::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.CollectOwnPropertyNames(copy, copy); | 7861 accumulator.NextPrototype(); |
| 7862 accumulator.CollectOwnPropertyNames(copy); |
7862 Handle<FixedArray> names = accumulator.GetKeys(); | 7863 Handle<FixedArray> names = accumulator.GetKeys(); |
7863 for (int i = 0; i < names->length(); i++) { | 7864 for (int i = 0; i < names->length(); i++) { |
7864 DCHECK(names->get(i)->IsName()); | 7865 DCHECK(names->get(i)->IsName()); |
7865 Handle<Name> name(Name::cast(names->get(i))); | 7866 Handle<Name> name(Name::cast(names->get(i))); |
7866 Handle<Object> value = | 7867 Handle<Object> value = |
7867 JSObject::GetProperty(copy, name).ToHandleChecked(); | 7868 JSObject::GetProperty(copy, name).ToHandleChecked(); |
7868 if (value->IsJSObject()) { | 7869 if (value->IsJSObject()) { |
7869 Handle<JSObject> result; | 7870 Handle<JSObject> result; |
7870 ASSIGN_RETURN_ON_EXCEPTION( | 7871 ASSIGN_RETURN_ON_EXCEPTION( |
7871 isolate, result, | 7872 isolate, result, |
(...skipping 284 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8156 | 8157 |
8157 | 8158 |
8158 bool Map::OnlyHasSimpleProperties() { | 8159 bool Map::OnlyHasSimpleProperties() { |
8159 // Wrapped string elements aren't explicitly stored in the elements backing | 8160 // Wrapped string elements aren't explicitly stored in the elements backing |
8160 // store, but are loaded indirectly from the underlying string. | 8161 // store, but are loaded indirectly from the underlying string. |
8161 return !IsStringWrapperElementsKind(elements_kind()) && | 8162 return !IsStringWrapperElementsKind(elements_kind()) && |
8162 instance_type() > LAST_SPECIAL_RECEIVER_TYPE && | 8163 instance_type() > LAST_SPECIAL_RECEIVER_TYPE && |
8163 !has_hidden_prototype() && !is_dictionary_map(); | 8164 !has_hidden_prototype() && !is_dictionary_map(); |
8164 } | 8165 } |
8165 | 8166 |
| 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 |
8166 MUST_USE_RESULT Maybe<bool> FastGetOwnValuesOrEntries( | 8176 MUST_USE_RESULT Maybe<bool> FastGetOwnValuesOrEntries( |
8167 Isolate* isolate, Handle<JSReceiver> receiver, bool get_entries, | 8177 Isolate* isolate, Handle<JSReceiver> receiver, bool get_entries, |
8168 Handle<FixedArray>* result) { | 8178 Handle<FixedArray>* result) { |
8169 Handle<Map> map(JSReceiver::cast(*receiver)->map(), isolate); | 8179 Handle<Map> map(JSReceiver::cast(*receiver)->map(), isolate); |
8170 | 8180 |
8171 if (!map->IsJSObjectMap()) return Just(false); | 8181 if (!map->IsJSObjectMap()) return Just(false); |
8172 if (!map->OnlyHasSimpleProperties()) return Just(false); | 8182 if (!map->OnlyHasSimpleProperties()) return Just(false); |
8173 | 8183 |
8174 Handle<JSObject> object(JSObject::cast(*receiver)); | 8184 Handle<JSObject> object(JSObject::cast(*receiver)); |
8175 | 8185 |
(...skipping 8996 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
17172 if (!AccessorInfo::cast(accessors)->all_can_read()) continue; | 17182 if (!AccessorInfo::cast(accessors)->all_can_read()) continue; |
17173 } | 17183 } |
17174 array->set(array_size++, Smi::FromInt(i)); | 17184 array->set(array_size++, Smi::FromInt(i)); |
17175 } | 17185 } |
17176 | 17186 |
17177 EnumIndexComparator<Derived> cmp(static_cast<Derived*>(raw_dict)); | 17187 EnumIndexComparator<Derived> cmp(static_cast<Derived*>(raw_dict)); |
17178 Smi** start = reinterpret_cast<Smi**>(array->GetFirstElementAddress()); | 17188 Smi** start = reinterpret_cast<Smi**>(array->GetFirstElementAddress()); |
17179 std::sort(start, start + array_size, cmp); | 17189 std::sort(start, start + array_size, cmp); |
17180 } | 17190 } |
17181 | 17191 |
17182 bool has_seen_symbol = false; | |
17183 for (int i = 0; i < array_size; i++) { | 17192 for (int i = 0; i < array_size; i++) { |
17184 int index = Smi::cast(array->get(i))->value(); | 17193 int index = Smi::cast(array->get(i))->value(); |
17185 Object* key = dictionary->KeyAt(index); | 17194 keys->AddKey(dictionary->KeyAt(index), DO_NOT_CONVERT); |
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 } | |
17199 } | 17195 } |
17200 } | 17196 } |
17201 | 17197 |
17202 | 17198 |
17203 // Backwards lookup (slow). | 17199 // Backwards lookup (slow). |
17204 template<typename Derived, typename Shape, typename Key> | 17200 template<typename Derived, typename Shape, typename Key> |
17205 Object* Dictionary<Derived, Shape, Key>::SlowReverseLookup(Object* value) { | 17201 Object* Dictionary<Derived, Shape, Key>::SlowReverseLookup(Object* value) { |
17206 int capacity = this->Capacity(); | 17202 int capacity = this->Capacity(); |
17207 for (int i = 0; i < capacity; i++) { | 17203 for (int i = 0; i < capacity; i++) { |
17208 Object* k = this->KeyAt(i); | 17204 Object* k = this->KeyAt(i); |
(...skipping 279 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
17488 int new_entry = nof + table->NumberOfDeletedElements(); | 17484 int new_entry = nof + table->NumberOfDeletedElements(); |
17489 int new_index = table->EntryToIndex(new_entry); | 17485 int new_index = table->EntryToIndex(new_entry); |
17490 table->set(new_index, *key); | 17486 table->set(new_index, *key); |
17491 table->set(new_index + kChainOffset, Smi::FromInt(previous_entry)); | 17487 table->set(new_index + kChainOffset, Smi::FromInt(previous_entry)); |
17492 // and point the bucket to the new entry. | 17488 // and point the bucket to the new entry. |
17493 table->set(kHashTableStartIndex + bucket, Smi::FromInt(new_entry)); | 17489 table->set(kHashTableStartIndex + bucket, Smi::FromInt(new_entry)); |
17494 table->SetNumberOfElements(nof + 1); | 17490 table->SetNumberOfElements(nof + 1); |
17495 return table; | 17491 return table; |
17496 } | 17492 } |
17497 | 17493 |
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_no_write_barrier(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 } | |
17518 | 17494 |
17519 template<class Derived, class Iterator, int entrysize> | 17495 template<class Derived, class Iterator, int entrysize> |
17520 Handle<Derived> OrderedHashTable<Derived, Iterator, entrysize>::Rehash( | 17496 Handle<Derived> OrderedHashTable<Derived, Iterator, entrysize>::Rehash( |
17521 Handle<Derived> table, int new_capacity) { | 17497 Handle<Derived> table, int new_capacity) { |
17522 Isolate* isolate = table->GetIsolate(); | 17498 Isolate* isolate = table->GetIsolate(); |
17523 Heap* heap = isolate->heap(); | 17499 Heap* heap = isolate->heap(); |
17524 DCHECK(!table->IsObsolete()); | 17500 DCHECK(!table->IsObsolete()); |
17525 | 17501 |
17526 Handle<Derived> new_table = Allocate( | 17502 Handle<Derived> new_table = Allocate( |
17527 isolate, new_capacity, heap->InNewSpace(*table) ? NOT_TENURED : TENURED); | 17503 isolate, new_capacity, heap->InNewSpace(*table) ? NOT_TENURED : TENURED); |
(...skipping 937 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
18465 if (cell->value() != *new_value) { | 18441 if (cell->value() != *new_value) { |
18466 cell->set_value(*new_value); | 18442 cell->set_value(*new_value); |
18467 Isolate* isolate = cell->GetIsolate(); | 18443 Isolate* isolate = cell->GetIsolate(); |
18468 cell->dependent_code()->DeoptimizeDependentCodeGroup( | 18444 cell->dependent_code()->DeoptimizeDependentCodeGroup( |
18469 isolate, DependentCode::kPropertyCellChangedGroup); | 18445 isolate, DependentCode::kPropertyCellChangedGroup); |
18470 } | 18446 } |
18471 } | 18447 } |
18472 | 18448 |
18473 } // namespace internal | 18449 } // namespace internal |
18474 } // namespace v8 | 18450 } // namespace v8 |
OLD | NEW |