OLD | NEW |
1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 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/v8.h" | 5 #include "src/v8.h" |
6 | 6 |
7 #include "src/accessors.h" | 7 #include "src/accessors.h" |
8 #include "src/allocation-site-scopes.h" | 8 #include "src/allocation-site-scopes.h" |
9 #include "src/api.h" | 9 #include "src/api.h" |
10 #include "src/arguments.h" | 10 #include "src/arguments.h" |
(...skipping 13328 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
13339 } else { | 13339 } else { |
13340 HeapSortPairs(this, numbers, len); | 13340 HeapSortPairs(this, numbers, len); |
13341 return; | 13341 return; |
13342 } | 13342 } |
13343 } | 13343 } |
13344 | 13344 |
13345 | 13345 |
13346 // Fill in the names of own properties into the supplied storage. The main | 13346 // Fill in the names of own properties into the supplied storage. The main |
13347 // purpose of this function is to provide reflection information for the object | 13347 // purpose of this function is to provide reflection information for the object |
13348 // mirrors. | 13348 // mirrors. |
13349 int JSObject::GetOwnPropertyNames(FixedArray* storage, int index, | 13349 void JSObject::GetOwnPropertyNames( |
13350 PropertyAttributes filter) { | 13350 FixedArray* storage, int index, PropertyAttributes filter) { |
13351 DCHECK(storage->length() >= (NumberOfOwnProperties(filter) - index)); | 13351 DCHECK(storage->length() >= (NumberOfOwnProperties(filter) - index)); |
13352 if (HasFastProperties()) { | 13352 if (HasFastProperties()) { |
13353 int offset = 0; | |
13354 int real_size = map()->NumberOfOwnDescriptors(); | 13353 int real_size = map()->NumberOfOwnDescriptors(); |
13355 DescriptorArray* descs = map()->instance_descriptors(); | 13354 DescriptorArray* descs = map()->instance_descriptors(); |
13356 for (int i = 0; i < real_size; i++) { | 13355 for (int i = 0; i < real_size; i++) { |
13357 if ((descs->GetDetails(i).attributes() & filter) == 0 && | 13356 if ((descs->GetDetails(i).attributes() & filter) == 0 && |
13358 !FilterKey(descs->GetKey(i), filter)) { | 13357 !FilterKey(descs->GetKey(i), filter)) { |
13359 storage->set(index + offset, descs->GetKey(i)); | 13358 storage->set(index++, descs->GetKey(i)); |
13360 offset++; | |
13361 } | 13359 } |
13362 } | 13360 } |
13363 return offset; | |
13364 } else { | 13361 } else { |
13365 return property_dictionary()->CopyKeysTo(storage, index, filter, | 13362 property_dictionary()->CopyKeysTo(storage, |
13366 NameDictionary::UNSORTED); | 13363 index, |
| 13364 filter, |
| 13365 NameDictionary::UNSORTED); |
13367 } | 13366 } |
13368 } | 13367 } |
13369 | 13368 |
13370 | 13369 |
13371 int JSObject::NumberOfOwnElements(PropertyAttributes filter) { | 13370 int JSObject::NumberOfOwnElements(PropertyAttributes filter) { |
13372 return GetOwnElementKeys(NULL, filter); | 13371 return GetOwnElementKeys(NULL, filter); |
13373 } | 13372 } |
13374 | 13373 |
13375 | 13374 |
13376 int JSObject::NumberOfEnumElements() { | 13375 int JSObject::NumberOfEnumElements() { |
(...skipping 672 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
14049 New(Isolate*, int, MinimumCapacity, PretenureFlag); | 14048 New(Isolate*, int, MinimumCapacity, PretenureFlag); |
14050 | 14049 |
14051 template Handle<NameDictionary> | 14050 template Handle<NameDictionary> |
14052 HashTable<NameDictionary, NameDictionaryShape, Handle<Name> >:: | 14051 HashTable<NameDictionary, NameDictionaryShape, Handle<Name> >:: |
14053 Shrink(Handle<NameDictionary>, Handle<Name>); | 14052 Shrink(Handle<NameDictionary>, Handle<Name>); |
14054 | 14053 |
14055 template Handle<SeededNumberDictionary> | 14054 template Handle<SeededNumberDictionary> |
14056 HashTable<SeededNumberDictionary, SeededNumberDictionaryShape, uint32_t>:: | 14055 HashTable<SeededNumberDictionary, SeededNumberDictionaryShape, uint32_t>:: |
14057 Shrink(Handle<SeededNumberDictionary>, uint32_t); | 14056 Shrink(Handle<SeededNumberDictionary>, uint32_t); |
14058 | 14057 |
14059 template int | 14058 template void Dictionary<NameDictionary, NameDictionaryShape, Handle<Name> >:: |
14060 Dictionary<NameDictionary, NameDictionaryShape, Handle<Name> >::CopyKeysTo( | 14059 CopyKeysTo( |
14061 FixedArray*, int, PropertyAttributes, | 14060 FixedArray*, |
14062 Dictionary<NameDictionary, NameDictionaryShape, | 14061 int, |
14063 Handle<Name> >::SortMode); | 14062 PropertyAttributes, |
| 14063 Dictionary< |
| 14064 NameDictionary, NameDictionaryShape, Handle<Name> >::SortMode); |
14064 | 14065 |
14065 template int | 14066 template int |
14066 Dictionary<NameDictionary, NameDictionaryShape, Handle<Name> >:: | 14067 Dictionary<NameDictionary, NameDictionaryShape, Handle<Name> >:: |
14067 NumberOfElementsFilterAttributes(PropertyAttributes); | 14068 NumberOfElementsFilterAttributes(PropertyAttributes); |
14068 | 14069 |
14069 template Handle<NameDictionary> | 14070 template Handle<NameDictionary> |
14070 Dictionary<NameDictionary, NameDictionaryShape, Handle<Name> >::Add( | 14071 Dictionary<NameDictionary, NameDictionaryShape, Handle<Name> >::Add( |
14071 Handle<NameDictionary>, Handle<Name>, Handle<Object>, PropertyDetails); | 14072 Handle<NameDictionary>, Handle<Name>, Handle<Object>, PropertyDetails); |
14072 | 14073 |
14073 template void | 14074 template void |
(...skipping 1126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
15200 EnumIndexComparator cmp(this); | 15201 EnumIndexComparator cmp(this); |
15201 Smi** start = reinterpret_cast<Smi**>(storage->GetFirstElementAddress()); | 15202 Smi** start = reinterpret_cast<Smi**>(storage->GetFirstElementAddress()); |
15202 std::sort(start, start + length, cmp); | 15203 std::sort(start, start + length, cmp); |
15203 for (int i = 0; i < length; i++) { | 15204 for (int i = 0; i < length; i++) { |
15204 int index = Smi::cast(storage->get(i))->value(); | 15205 int index = Smi::cast(storage->get(i))->value(); |
15205 storage->set(i, KeyAt(index)); | 15206 storage->set(i, KeyAt(index)); |
15206 } | 15207 } |
15207 } | 15208 } |
15208 | 15209 |
15209 | 15210 |
15210 template <typename Derived, typename Shape, typename Key> | 15211 template<typename Derived, typename Shape, typename Key> |
15211 int Dictionary<Derived, Shape, Key>::CopyKeysTo( | 15212 void Dictionary<Derived, Shape, Key>::CopyKeysTo( |
15212 FixedArray* storage, int index, PropertyAttributes filter, | 15213 FixedArray* storage, |
| 15214 int index, |
| 15215 PropertyAttributes filter, |
15213 typename Dictionary<Derived, Shape, Key>::SortMode sort_mode) { | 15216 typename Dictionary<Derived, Shape, Key>::SortMode sort_mode) { |
15214 DCHECK(storage->length() >= NumberOfElementsFilterAttributes(filter)); | 15217 DCHECK(storage->length() >= NumberOfElementsFilterAttributes(filter)); |
15215 int capacity = DerivedHashTable::Capacity(); | 15218 int capacity = DerivedHashTable::Capacity(); |
15216 int offset = 0; | |
15217 for (int i = 0; i < capacity; i++) { | 15219 for (int i = 0; i < capacity; i++) { |
15218 Object* k = DerivedHashTable::KeyAt(i); | 15220 Object* k = DerivedHashTable::KeyAt(i); |
15219 if (DerivedHashTable::IsKey(k) && !FilterKey(k, filter)) { | 15221 if (DerivedHashTable::IsKey(k) && !FilterKey(k, filter)) { |
15220 PropertyDetails details = DetailsAt(i); | 15222 PropertyDetails details = DetailsAt(i); |
15221 if (details.IsDeleted()) continue; | 15223 if (details.IsDeleted()) continue; |
15222 PropertyAttributes attr = details.attributes(); | 15224 PropertyAttributes attr = details.attributes(); |
15223 if ((attr & filter) == 0) storage->set(index + offset, k); | 15225 if ((attr & filter) == 0) storage->set(index++, k); |
15224 offset++; | |
15225 } | 15226 } |
15226 } | 15227 } |
15227 if (sort_mode == Dictionary::SORTED) { | 15228 if (sort_mode == Dictionary::SORTED) { |
15228 storage->SortPairs(storage, index + offset); | 15229 storage->SortPairs(storage, index); |
15229 } | 15230 } |
15230 DCHECK(storage->length() >= index + offset); | 15231 DCHECK(storage->length() >= index); |
15231 return offset; | |
15232 } | 15232 } |
15233 | 15233 |
15234 | 15234 |
15235 // Backwards lookup (slow). | 15235 // Backwards lookup (slow). |
15236 template<typename Derived, typename Shape, typename Key> | 15236 template<typename Derived, typename Shape, typename Key> |
15237 Object* Dictionary<Derived, Shape, Key>::SlowReverseLookup(Object* value) { | 15237 Object* Dictionary<Derived, Shape, Key>::SlowReverseLookup(Object* value) { |
15238 int capacity = DerivedHashTable::Capacity(); | 15238 int capacity = DerivedHashTable::Capacity(); |
15239 for (int i = 0; i < capacity; i++) { | 15239 for (int i = 0; i < capacity; i++) { |
15240 Object* k = DerivedHashTable::KeyAt(i); | 15240 Object* k = DerivedHashTable::KeyAt(i); |
15241 if (Dictionary::IsKey(k)) { | 15241 if (Dictionary::IsKey(k)) { |
(...skipping 1117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
16359 #define ERROR_MESSAGES_TEXTS(C, T) T, | 16359 #define ERROR_MESSAGES_TEXTS(C, T) T, |
16360 static const char* error_messages_[] = { | 16360 static const char* error_messages_[] = { |
16361 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS) | 16361 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS) |
16362 }; | 16362 }; |
16363 #undef ERROR_MESSAGES_TEXTS | 16363 #undef ERROR_MESSAGES_TEXTS |
16364 return error_messages_[reason]; | 16364 return error_messages_[reason]; |
16365 } | 16365 } |
16366 | 16366 |
16367 | 16367 |
16368 } } // namespace v8::internal | 16368 } } // namespace v8::internal |
OLD | NEW |