OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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/elements.h" | 5 #include "src/elements.h" |
6 | 6 |
7 #include "src/arguments.h" | 7 #include "src/arguments.h" |
8 #include "src/conversions.h" | 8 #include "src/conversions.h" |
9 #include "src/factory.h" | 9 #include "src/factory.h" |
10 #include "src/messages.h" | 10 #include "src/messages.h" |
(...skipping 817 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
828 // intentionally to avoid ArrayConcat() builtin performance degradation. | 828 // intentionally to avoid ArrayConcat() builtin performance degradation. |
829 // | 829 // |
830 // Details: The idea is that allocations actually happen only in case of | 830 // Details: The idea is that allocations actually happen only in case of |
831 // copying from object with fast double elements to object with object | 831 // copying from object with fast double elements to object with object |
832 // elements. In all the other cases there are no allocations performed and | 832 // elements. In all the other cases there are no allocations performed and |
833 // handle creation causes noticeable performance degradation of the builtin. | 833 // handle creation causes noticeable performance degradation of the builtin. |
834 ElementsAccessorSubclass::CopyElementsImpl( | 834 ElementsAccessorSubclass::CopyElementsImpl( |
835 from, from_start, *to, from_kind, to_start, packed_size, copy_size); | 835 from, from_start, *to, from_kind, to_start, packed_size, copy_size); |
836 } | 836 } |
837 | 837 |
| 838 Handle<SeededNumberDictionary> Normalize(Handle<JSObject> object) final { |
| 839 return ElementsAccessorSubclass::NormalizeImpl(object, |
| 840 handle(object->elements())); |
| 841 } |
| 842 |
| 843 static Handle<SeededNumberDictionary> NormalizeImpl( |
| 844 Handle<JSObject> object, Handle<FixedArrayBase> elements) { |
| 845 UNREACHABLE(); |
| 846 return Handle<SeededNumberDictionary>(); |
| 847 } |
| 848 |
838 void CollectElementIndices(Handle<JSObject> object, | 849 void CollectElementIndices(Handle<JSObject> object, |
839 Handle<FixedArrayBase> backing_store, | 850 Handle<FixedArrayBase> backing_store, |
840 KeyAccumulator* keys, uint32_t range, | 851 KeyAccumulator* keys, uint32_t range, |
841 PropertyFilter filter, uint32_t offset) final { | 852 PropertyFilter filter, uint32_t offset) final { |
842 if (filter & ONLY_ALL_CAN_READ) return; | 853 if (filter & ONLY_ALL_CAN_READ) return; |
843 ElementsAccessorSubclass::CollectElementIndicesImpl( | 854 ElementsAccessorSubclass::CollectElementIndicesImpl( |
844 object, backing_store, keys, range, filter, offset); | 855 object, backing_store, keys, range, filter, offset); |
845 } | 856 } |
846 | 857 |
847 static void CollectElementIndicesImpl(Handle<JSObject> object, | 858 static void CollectElementIndicesImpl(Handle<JSObject> object, |
(...skipping 413 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1261 typename KindTraits> | 1272 typename KindTraits> |
1262 class FastElementsAccessor | 1273 class FastElementsAccessor |
1263 : public ElementsAccessorBase<FastElementsAccessorSubclass, KindTraits> { | 1274 : public ElementsAccessorBase<FastElementsAccessorSubclass, KindTraits> { |
1264 public: | 1275 public: |
1265 explicit FastElementsAccessor(const char* name) | 1276 explicit FastElementsAccessor(const char* name) |
1266 : ElementsAccessorBase<FastElementsAccessorSubclass, | 1277 : ElementsAccessorBase<FastElementsAccessorSubclass, |
1267 KindTraits>(name) {} | 1278 KindTraits>(name) {} |
1268 | 1279 |
1269 typedef typename KindTraits::BackingStore BackingStore; | 1280 typedef typename KindTraits::BackingStore BackingStore; |
1270 | 1281 |
| 1282 static Handle<SeededNumberDictionary> NormalizeImpl( |
| 1283 Handle<JSObject> object, Handle<FixedArrayBase> store) { |
| 1284 Isolate* isolate = store->GetIsolate(); |
| 1285 ElementsKind kind = FastElementsAccessorSubclass::kind(); |
| 1286 |
| 1287 // Ensure that notifications fire if the array or object prototypes are |
| 1288 // normalizing. |
| 1289 if (IsFastSmiOrObjectElementsKind(kind)) { |
| 1290 isolate->UpdateArrayProtectorOnNormalizeElements(object); |
| 1291 } |
| 1292 |
| 1293 int capacity = object->GetFastElementsUsage(); |
| 1294 Handle<SeededNumberDictionary> dictionary = |
| 1295 SeededNumberDictionary::New(isolate, capacity); |
| 1296 |
| 1297 PropertyDetails details = PropertyDetails::Empty(); |
| 1298 bool used_as_prototype = object->map()->is_prototype_map(); |
| 1299 int j = 0; |
| 1300 for (int i = 0; j < capacity; i++) { |
| 1301 if (IsHoleyElementsKind(kind)) { |
| 1302 if (BackingStore::cast(*store)->is_the_hole(i)) continue; |
| 1303 } |
| 1304 Handle<Object> value = FastElementsAccessorSubclass::GetImpl(*store, i); |
| 1305 dictionary = SeededNumberDictionary::AddNumberEntry( |
| 1306 dictionary, i, value, details, used_as_prototype); |
| 1307 j++; |
| 1308 } |
| 1309 return dictionary; |
| 1310 } |
| 1311 |
1271 static void DeleteAtEnd(Handle<JSObject> obj, | 1312 static void DeleteAtEnd(Handle<JSObject> obj, |
1272 Handle<BackingStore> backing_store, uint32_t entry) { | 1313 Handle<BackingStore> backing_store, uint32_t entry) { |
1273 uint32_t length = static_cast<uint32_t>(backing_store->length()); | 1314 uint32_t length = static_cast<uint32_t>(backing_store->length()); |
1274 Heap* heap = obj->GetHeap(); | 1315 Heap* heap = obj->GetHeap(); |
1275 for (; entry > 0; entry--) { | 1316 for (; entry > 0; entry--) { |
1276 if (!backing_store->is_the_hole(entry - 1)) break; | 1317 if (!backing_store->is_the_hole(entry - 1)) break; |
1277 } | 1318 } |
1278 if (entry == 0) { | 1319 if (entry == 0) { |
1279 FixedArray* empty = heap->empty_fixed_array(); | 1320 FixedArray* empty = heap->empty_fixed_array(); |
1280 if (obj->HasFastArgumentsElements()) { | 1321 if (obj->HasFastArgumentsElements()) { |
(...skipping 1078 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2359 : public SloppyArgumentsElementsAccessor< | 2400 : public SloppyArgumentsElementsAccessor< |
2360 FastSloppyArgumentsElementsAccessor, FastHoleyObjectElementsAccessor, | 2401 FastSloppyArgumentsElementsAccessor, FastHoleyObjectElementsAccessor, |
2361 ElementsKindTraits<FAST_SLOPPY_ARGUMENTS_ELEMENTS> > { | 2402 ElementsKindTraits<FAST_SLOPPY_ARGUMENTS_ELEMENTS> > { |
2362 public: | 2403 public: |
2363 explicit FastSloppyArgumentsElementsAccessor(const char* name) | 2404 explicit FastSloppyArgumentsElementsAccessor(const char* name) |
2364 : SloppyArgumentsElementsAccessor< | 2405 : SloppyArgumentsElementsAccessor< |
2365 FastSloppyArgumentsElementsAccessor, | 2406 FastSloppyArgumentsElementsAccessor, |
2366 FastHoleyObjectElementsAccessor, | 2407 FastHoleyObjectElementsAccessor, |
2367 ElementsKindTraits<FAST_SLOPPY_ARGUMENTS_ELEMENTS> >(name) {} | 2408 ElementsKindTraits<FAST_SLOPPY_ARGUMENTS_ELEMENTS> >(name) {} |
2368 | 2409 |
| 2410 static Handle<SeededNumberDictionary> NormalizeImpl( |
| 2411 Handle<JSObject> object, Handle<FixedArrayBase> elements) { |
| 2412 FixedArray* parameter_map = FixedArray::cast(*elements); |
| 2413 Handle<FixedArray> arguments(FixedArray::cast(parameter_map->get(1))); |
| 2414 return FastHoleyObjectElementsAccessor::NormalizeImpl(object, arguments); |
| 2415 } |
| 2416 |
2369 static void DeleteFromArguments(Handle<JSObject> obj, uint32_t entry) { | 2417 static void DeleteFromArguments(Handle<JSObject> obj, uint32_t entry) { |
2370 FixedArray* parameter_map = FixedArray::cast(obj->elements()); | 2418 FixedArray* parameter_map = FixedArray::cast(obj->elements()); |
2371 Handle<FixedArray> arguments(FixedArray::cast(parameter_map->get(1))); | 2419 Handle<FixedArray> arguments(FixedArray::cast(parameter_map->get(1))); |
2372 FastHoleyObjectElementsAccessor::DeleteCommon(obj, entry, arguments); | 2420 FastHoleyObjectElementsAccessor::DeleteCommon(obj, entry, arguments); |
2373 } | 2421 } |
2374 | 2422 |
2375 static void AddImpl(Handle<JSObject> object, uint32_t index, | 2423 static void AddImpl(Handle<JSObject> object, uint32_t index, |
2376 Handle<Object> value, PropertyAttributes attributes, | 2424 Handle<Object> value, PropertyAttributes attributes, |
2377 uint32_t new_capacity) { | 2425 uint32_t new_capacity) { |
2378 DCHECK_EQ(NONE, attributes); | 2426 DCHECK_EQ(NONE, attributes); |
(...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2581 | 2629 |
2582 class FastStringWrapperElementsAccessor | 2630 class FastStringWrapperElementsAccessor |
2583 : public StringWrapperElementsAccessor< | 2631 : public StringWrapperElementsAccessor< |
2584 FastStringWrapperElementsAccessor, FastHoleyObjectElementsAccessor, | 2632 FastStringWrapperElementsAccessor, FastHoleyObjectElementsAccessor, |
2585 ElementsKindTraits<FAST_STRING_WRAPPER_ELEMENTS>> { | 2633 ElementsKindTraits<FAST_STRING_WRAPPER_ELEMENTS>> { |
2586 public: | 2634 public: |
2587 explicit FastStringWrapperElementsAccessor(const char* name) | 2635 explicit FastStringWrapperElementsAccessor(const char* name) |
2588 : StringWrapperElementsAccessor< | 2636 : StringWrapperElementsAccessor< |
2589 FastStringWrapperElementsAccessor, FastHoleyObjectElementsAccessor, | 2637 FastStringWrapperElementsAccessor, FastHoleyObjectElementsAccessor, |
2590 ElementsKindTraits<FAST_STRING_WRAPPER_ELEMENTS>>(name) {} | 2638 ElementsKindTraits<FAST_STRING_WRAPPER_ELEMENTS>>(name) {} |
| 2639 |
| 2640 static Handle<SeededNumberDictionary> NormalizeImpl( |
| 2641 Handle<JSObject> object, Handle<FixedArrayBase> elements) { |
| 2642 return FastHoleyObjectElementsAccessor::NormalizeImpl(object, elements); |
| 2643 } |
2591 }; | 2644 }; |
2592 | 2645 |
2593 class SlowStringWrapperElementsAccessor | 2646 class SlowStringWrapperElementsAccessor |
2594 : public StringWrapperElementsAccessor< | 2647 : public StringWrapperElementsAccessor< |
2595 SlowStringWrapperElementsAccessor, DictionaryElementsAccessor, | 2648 SlowStringWrapperElementsAccessor, DictionaryElementsAccessor, |
2596 ElementsKindTraits<SLOW_STRING_WRAPPER_ELEMENTS>> { | 2649 ElementsKindTraits<SLOW_STRING_WRAPPER_ELEMENTS>> { |
2597 public: | 2650 public: |
2598 explicit SlowStringWrapperElementsAccessor(const char* name) | 2651 explicit SlowStringWrapperElementsAccessor(const char* name) |
2599 : StringWrapperElementsAccessor< | 2652 : StringWrapperElementsAccessor< |
2600 SlowStringWrapperElementsAccessor, DictionaryElementsAccessor, | 2653 SlowStringWrapperElementsAccessor, DictionaryElementsAccessor, |
(...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2814 } | 2867 } |
2815 } | 2868 } |
2816 | 2869 |
2817 DCHECK(j == result_len); | 2870 DCHECK(j == result_len); |
2818 return result_array; | 2871 return result_array; |
2819 } | 2872 } |
2820 | 2873 |
2821 ElementsAccessor** ElementsAccessor::elements_accessors_ = NULL; | 2874 ElementsAccessor** ElementsAccessor::elements_accessors_ = NULL; |
2822 } // namespace internal | 2875 } // namespace internal |
2823 } // namespace v8 | 2876 } // namespace v8 |
OLD | NEW |