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/v8.h" | 5 #include "src/v8.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/elements.h" | 9 #include "src/elements.h" |
10 #include "src/messages.h" | 10 #include "src/messages.h" |
(...skipping 626 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
637 } | 637 } |
638 | 638 |
639 virtual void SetLength(Handle<JSArray> array, uint32_t length) final { | 639 virtual void SetLength(Handle<JSArray> array, uint32_t length) final { |
640 ElementsAccessorSubclass::SetLengthImpl(array, length, | 640 ElementsAccessorSubclass::SetLengthImpl(array, length, |
641 handle(array->elements())); | 641 handle(array->elements())); |
642 } | 642 } |
643 | 643 |
644 static void SetLengthImpl(Handle<JSArray> array, uint32_t length, | 644 static void SetLengthImpl(Handle<JSArray> array, uint32_t length, |
645 Handle<FixedArrayBase> backing_store); | 645 Handle<FixedArrayBase> backing_store); |
646 | 646 |
647 virtual void SetCapacityAndLength(Handle<JSArray> array, int capacity, | 647 static void GrowCapacityAndConvert(Handle<JSObject> obj, int capacity) { |
648 int length) final { | |
649 ElementsAccessorSubclass:: | |
650 SetFastElementsCapacityAndLength(array, capacity, length); | |
651 } | |
652 | |
653 static void SetFastElementsCapacityAndLength( | |
654 Handle<JSObject> obj, | |
655 int capacity, | |
656 int length) { | |
657 UNIMPLEMENTED(); | 648 UNIMPLEMENTED(); |
658 } | 649 } |
659 | 650 |
660 virtual void Delete(Handle<JSObject> obj, uint32_t key, | 651 virtual void Delete(Handle<JSObject> obj, uint32_t key, |
661 LanguageMode language_mode) override = 0; | 652 LanguageMode language_mode) override = 0; |
662 | 653 |
663 static void CopyElementsImpl(FixedArrayBase* from, uint32_t from_start, | 654 static void CopyElementsImpl(FixedArrayBase* from, uint32_t from_start, |
664 FixedArrayBase* to, ElementsKind from_kind, | 655 FixedArrayBase* to, ElementsKind from_kind, |
665 uint32_t to_start, int packed_size, | 656 uint32_t to_start, int packed_size, |
666 int copy_size) { | 657 int copy_size) { |
(...skipping 347 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1014 CopyDoubleToObjectElements( | 1005 CopyDoubleToObjectElements( |
1015 from, from_start, to, to_kind, to_start, copy_size); | 1006 from, from_start, to, to_kind, to_start, copy_size); |
1016 break; | 1007 break; |
1017 } | 1008 } |
1018 case DICTIONARY_ELEMENTS: | 1009 case DICTIONARY_ELEMENTS: |
1019 CopyDictionaryToObjectElements(from, from_start, to, to_kind, to_start, | 1010 CopyDictionaryToObjectElements(from, from_start, to, to_kind, to_start, |
1020 copy_size); | 1011 copy_size); |
1021 break; | 1012 break; |
1022 case SLOPPY_ARGUMENTS_ELEMENTS: { | 1013 case SLOPPY_ARGUMENTS_ELEMENTS: { |
1023 // TODO(verwaest): This is a temporary hack to support extending | 1014 // TODO(verwaest): This is a temporary hack to support extending |
1024 // SLOPPY_ARGUMENTS_ELEMENTS in SetFastElementsCapacityAndLength. | 1015 // SLOPPY_ARGUMENTS_ELEMENTS in GrowCapacityAndConvert. |
1025 // This case should be UNREACHABLE(). | 1016 // This case should be UNREACHABLE(). |
1026 FixedArray* parameter_map = FixedArray::cast(from); | 1017 FixedArray* parameter_map = FixedArray::cast(from); |
1027 FixedArrayBase* arguments = FixedArrayBase::cast(parameter_map->get(1)); | 1018 FixedArrayBase* arguments = FixedArrayBase::cast(parameter_map->get(1)); |
1028 ElementsKind from_kind = ElementsKindForArray(arguments); | 1019 ElementsKind from_kind = ElementsKindForArray(arguments); |
1029 CopyElementsImpl(arguments, from_start, to, from_kind, | 1020 CopyElementsImpl(arguments, from_start, to, from_kind, |
1030 to_start, packed_size, copy_size); | 1021 to_start, packed_size, copy_size); |
1031 break; | 1022 break; |
1032 } | 1023 } |
1033 #define TYPED_ARRAY_CASE(Type, type, TYPE, ctype, size) \ | 1024 #define TYPED_ARRAY_CASE(Type, type, TYPE, ctype, size) \ |
1034 case EXTERNAL_##TYPE##_ELEMENTS: \ | 1025 case EXTERNAL_##TYPE##_ELEMENTS: \ |
1035 case TYPE##_ELEMENTS: \ | 1026 case TYPE##_ELEMENTS: \ |
1036 UNREACHABLE(); | 1027 UNREACHABLE(); |
1037 TYPED_ARRAYS(TYPED_ARRAY_CASE) | 1028 TYPED_ARRAYS(TYPED_ARRAY_CASE) |
1038 #undef TYPED_ARRAY_CASE | 1029 #undef TYPED_ARRAY_CASE |
1039 } | 1030 } |
1040 } | 1031 } |
1041 | 1032 |
1042 | 1033 |
1043 static void SetFastElementsCapacityAndLength( | 1034 static void GrowCapacityAndConvert(Handle<JSObject> obj, uint32_t capacity) { |
1044 Handle<JSObject> obj, | |
1045 uint32_t capacity, | |
1046 uint32_t length) { | |
1047 JSObject::SetFastElementsCapacitySmiMode set_capacity_mode = | 1035 JSObject::SetFastElementsCapacitySmiMode set_capacity_mode = |
1048 obj->HasFastSmiElements() | 1036 obj->HasFastSmiElements() |
1049 ? JSObject::kAllowSmiElements | 1037 ? JSObject::kAllowSmiElements |
1050 : JSObject::kDontAllowSmiElements; | 1038 : JSObject::kDontAllowSmiElements; |
1051 JSObject::SetFastElementsCapacityAndLength( | 1039 JSObject::SetFastElementsCapacity(obj, capacity, set_capacity_mode); |
1052 obj, capacity, length, set_capacity_mode); | |
1053 } | 1040 } |
1054 }; | 1041 }; |
1055 | 1042 |
1056 | 1043 |
1057 class FastPackedSmiElementsAccessor | 1044 class FastPackedSmiElementsAccessor |
1058 : public FastSmiOrObjectElementsAccessor< | 1045 : public FastSmiOrObjectElementsAccessor< |
1059 FastPackedSmiElementsAccessor, | 1046 FastPackedSmiElementsAccessor, |
1060 ElementsKindTraits<FAST_SMI_ELEMENTS> > { | 1047 ElementsKindTraits<FAST_SMI_ELEMENTS> > { |
1061 public: | 1048 public: |
1062 explicit FastPackedSmiElementsAccessor(const char* name) | 1049 explicit FastPackedSmiElementsAccessor(const char* name) |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1104 | 1091 |
1105 template<typename FastElementsAccessorSubclass, | 1092 template<typename FastElementsAccessorSubclass, |
1106 typename KindTraits> | 1093 typename KindTraits> |
1107 class FastDoubleElementsAccessor | 1094 class FastDoubleElementsAccessor |
1108 : public FastElementsAccessor<FastElementsAccessorSubclass, KindTraits> { | 1095 : public FastElementsAccessor<FastElementsAccessorSubclass, KindTraits> { |
1109 public: | 1096 public: |
1110 explicit FastDoubleElementsAccessor(const char* name) | 1097 explicit FastDoubleElementsAccessor(const char* name) |
1111 : FastElementsAccessor<FastElementsAccessorSubclass, | 1098 : FastElementsAccessor<FastElementsAccessorSubclass, |
1112 KindTraits>(name) {} | 1099 KindTraits>(name) {} |
1113 | 1100 |
1114 static void SetFastElementsCapacityAndLength(Handle<JSObject> obj, | 1101 static void GrowCapacityAndConvert(Handle<JSObject> obj, uint32_t capacity) { |
1115 uint32_t capacity, | 1102 JSObject::SetFastDoubleElementsCapacity(obj, capacity); |
1116 uint32_t length) { | |
1117 JSObject::SetFastDoubleElementsCapacityAndLength(obj, capacity, length); | |
1118 } | 1103 } |
1119 | 1104 |
1120 protected: | 1105 protected: |
1121 static void CopyElementsImpl(FixedArrayBase* from, uint32_t from_start, | 1106 static void CopyElementsImpl(FixedArrayBase* from, uint32_t from_start, |
1122 FixedArrayBase* to, ElementsKind from_kind, | 1107 FixedArrayBase* to, ElementsKind from_kind, |
1123 uint32_t to_start, int packed_size, | 1108 uint32_t to_start, int packed_size, |
1124 int copy_size) { | 1109 int copy_size) { |
1125 DisallowHeapAllocation no_allocation; | 1110 DisallowHeapAllocation no_allocation; |
1126 switch (from_kind) { | 1111 switch (from_kind) { |
1127 case FAST_SMI_ELEMENTS: | 1112 case FAST_SMI_ELEMENTS: |
(...skipping 544 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1672 *backing_store, capacity - length); | 1657 *backing_store, capacity - length); |
1673 } else { | 1658 } else { |
1674 // Otherwise, fill the unused tail with holes. | 1659 // Otherwise, fill the unused tail with holes. |
1675 for (uint32_t i = length; i < old_length; i++) { | 1660 for (uint32_t i = length; i < old_length; i++) { |
1676 BackingStore::cast(*backing_store)->set_the_hole(i); | 1661 BackingStore::cast(*backing_store)->set_the_hole(i); |
1677 } | 1662 } |
1678 } | 1663 } |
1679 } else { | 1664 } else { |
1680 // Check whether the backing store should be expanded. | 1665 // Check whether the backing store should be expanded. |
1681 capacity = Max(length, JSObject::NewElementsCapacity(capacity)); | 1666 capacity = Max(length, JSObject::NewElementsCapacity(capacity)); |
1682 ElementsAccessorSubclass::SetFastElementsCapacityAndLength(array, capacity, | 1667 ElementsAccessorSubclass::GrowCapacityAndConvert(array, capacity); |
1683 length); | |
1684 } | 1668 } |
1685 | 1669 |
1686 array->set_length(Smi::FromInt(length)); | 1670 array->set_length(Smi::FromInt(length)); |
1687 JSObject::ValidateElements(array); | 1671 JSObject::ValidateElements(array); |
1688 } | 1672 } |
1689 | 1673 |
1690 | 1674 |
1691 MaybeHandle<Object> ArrayConstructInitializeElements(Handle<JSArray> array, | 1675 MaybeHandle<Object> ArrayConstructInitializeElements(Handle<JSArray> array, |
1692 Arguments* args) { | 1676 Arguments* args) { |
1693 if (args->length() == 0) { | 1677 if (args->length() == 0) { |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1773 break; | 1757 break; |
1774 } | 1758 } |
1775 | 1759 |
1776 array->set_elements(*elms); | 1760 array->set_elements(*elms); |
1777 array->set_length(Smi::FromInt(number_of_elements)); | 1761 array->set_length(Smi::FromInt(number_of_elements)); |
1778 return array; | 1762 return array; |
1779 } | 1763 } |
1780 | 1764 |
1781 } // namespace internal | 1765 } // namespace internal |
1782 } // namespace v8 | 1766 } // namespace v8 |
OLD | NEW |