5 #include "src/elements-kind.h" 7 #include "src/base/lazy-instance.h" 8 #include "src/elements.h" 9 #include "src/objects-inl.h" 10 #include "src/objects.h" 16 int ElementsKindToShiftSize(ElementsKind elements_kind) {
17 switch (elements_kind) {
20 case UINT8_CLAMPED_ELEMENTS:
27 case FLOAT32_ELEMENTS:
29 case PACKED_DOUBLE_ELEMENTS:
30 case HOLEY_DOUBLE_ELEMENTS:
31 case FLOAT64_ELEMENTS:
32 case BIGINT64_ELEMENTS:
33 case BIGUINT64_ELEMENTS:
35 case PACKED_SMI_ELEMENTS:
37 case HOLEY_SMI_ELEMENTS:
39 case DICTIONARY_ELEMENTS:
40 case FAST_SLOPPY_ARGUMENTS_ELEMENTS:
41 case SLOW_SLOPPY_ARGUMENTS_ELEMENTS:
42 case FAST_STRING_WRAPPER_ELEMENTS:
43 case SLOW_STRING_WRAPPER_ELEMENTS:
44 return kPointerSizeLog2;
51 int ElementsKindToByteSize(ElementsKind elements_kind) {
52 return 1 << ElementsKindToShiftSize(elements_kind);
55 int GetDefaultHeaderSizeForElementsKind(ElementsKind elements_kind) {
56 STATIC_ASSERT(FixedArray::kHeaderSize == FixedDoubleArray::kHeaderSize);
58 if (IsFixedTypedArrayElementsKind(elements_kind)) {
61 return FixedArray::kHeaderSize - kHeapObjectTag;
66 const char* ElementsKindToString(ElementsKind kind) {
67 ElementsAccessor* accessor = ElementsAccessor::ForKind(kind);
68 return accessor->name();
73 static void Construct(
void* fast_elements_kind_sequence_ptr_arg) {
74 auto fast_elements_kind_sequence_ptr =
75 reinterpret_cast<ElementsKind**
>(fast_elements_kind_sequence_ptr_arg);
76 ElementsKind* fast_elements_kind_sequence =
77 new ElementsKind[kFastElementsKindCount];
78 *fast_elements_kind_sequence_ptr = fast_elements_kind_sequence;
79 STATIC_ASSERT(PACKED_SMI_ELEMENTS == FIRST_FAST_ELEMENTS_KIND);
80 fast_elements_kind_sequence[0] = PACKED_SMI_ELEMENTS;
81 fast_elements_kind_sequence[1] = HOLEY_SMI_ELEMENTS;
82 fast_elements_kind_sequence[2] = PACKED_DOUBLE_ELEMENTS;
83 fast_elements_kind_sequence[3] = HOLEY_DOUBLE_ELEMENTS;
84 fast_elements_kind_sequence[4] = PACKED_ELEMENTS;
85 fast_elements_kind_sequence[5] = HOLEY_ELEMENTS;
88 STATIC_ASSERT(PACKED_SMI_ELEMENTS + kFastElementsKindPackedToHoley ==
90 STATIC_ASSERT(PACKED_DOUBLE_ELEMENTS + kFastElementsKindPackedToHoley ==
91 HOLEY_DOUBLE_ELEMENTS);
92 STATIC_ASSERT(PACKED_ELEMENTS + kFastElementsKindPackedToHoley ==
100 fast_elements_kind_sequence = LAZY_INSTANCE_INITIALIZER;
103 ElementsKind GetFastElementsKindFromSequenceIndex(
int sequence_number) {
104 DCHECK(sequence_number >= 0 &&
105 sequence_number < kFastElementsKindCount);
106 return fast_elements_kind_sequence.Get()[sequence_number];
110 int GetSequenceIndexFromFastElementsKind(ElementsKind elements_kind) {
111 for (
int i = 0;
i < kFastElementsKindCount; ++
i) {
112 if (fast_elements_kind_sequence.Get()[
i] == elements_kind) {
120 ElementsKind GetNextTransitionElementsKind(ElementsKind kind) {
121 int index = GetSequenceIndexFromFastElementsKind(kind);
122 return GetFastElementsKindFromSequenceIndex(index + 1);
126 static inline bool IsFastTransitionTarget(ElementsKind elements_kind) {
127 return IsFastElementsKind(elements_kind) ||
128 elements_kind == DICTIONARY_ELEMENTS;
131 bool IsMoreGeneralElementsKindTransition(ElementsKind from_kind,
132 ElementsKind to_kind) {
133 if (!IsFastElementsKind(from_kind))
return false;
134 if (!IsFastTransitionTarget(to_kind))
return false;
135 DCHECK(!IsFixedTypedArrayElementsKind(from_kind));
136 DCHECK(!IsFixedTypedArrayElementsKind(to_kind));
138 case PACKED_SMI_ELEMENTS:
139 return to_kind != PACKED_SMI_ELEMENTS;
140 case HOLEY_SMI_ELEMENTS:
141 return to_kind != PACKED_SMI_ELEMENTS && to_kind != HOLEY_SMI_ELEMENTS;
142 case PACKED_DOUBLE_ELEMENTS:
143 return to_kind != PACKED_SMI_ELEMENTS && to_kind != HOLEY_SMI_ELEMENTS &&
144 to_kind != PACKED_DOUBLE_ELEMENTS;
145 case HOLEY_DOUBLE_ELEMENTS:
146 return to_kind == PACKED_ELEMENTS || to_kind == HOLEY_ELEMENTS;
147 case PACKED_ELEMENTS:
148 return to_kind == HOLEY_ELEMENTS;
156 bool UnionElementsKindUptoSize(ElementsKind* a_out, ElementsKind b) {
158 static_assert(PACKED_SMI_ELEMENTS < HOLEY_SMI_ELEMENTS,
159 "ElementsKind union not computable via std::max.");
160 static_assert(HOLEY_SMI_ELEMENTS < PACKED_ELEMENTS,
161 "ElementsKind union not computable via std::max.");
162 static_assert(PACKED_ELEMENTS < HOLEY_ELEMENTS,
163 "ElementsKind union not computable via std::max.");
164 static_assert(PACKED_DOUBLE_ELEMENTS < HOLEY_DOUBLE_ELEMENTS,
165 "ElementsKind union not computable via std::max.");
166 ElementsKind a = *a_out;
168 case PACKED_SMI_ELEMENTS:
170 case PACKED_SMI_ELEMENTS:
171 case HOLEY_SMI_ELEMENTS:
172 case PACKED_ELEMENTS:
179 case HOLEY_SMI_ELEMENTS:
181 case PACKED_SMI_ELEMENTS:
182 case HOLEY_SMI_ELEMENTS:
183 *a_out = HOLEY_SMI_ELEMENTS;
185 case PACKED_ELEMENTS:
187 *a_out = HOLEY_ELEMENTS;
192 case PACKED_ELEMENTS:
194 case PACKED_SMI_ELEMENTS:
195 case PACKED_ELEMENTS:
196 *a_out = PACKED_ELEMENTS;
198 case HOLEY_SMI_ELEMENTS:
200 *a_out = HOLEY_ELEMENTS;
207 case PACKED_SMI_ELEMENTS:
208 case HOLEY_SMI_ELEMENTS:
209 case PACKED_ELEMENTS:
211 *a_out = HOLEY_ELEMENTS;
217 case PACKED_DOUBLE_ELEMENTS:
219 case PACKED_DOUBLE_ELEMENTS:
220 case HOLEY_DOUBLE_ELEMENTS:
226 case HOLEY_DOUBLE_ELEMENTS:
228 case PACKED_DOUBLE_ELEMENTS:
229 case HOLEY_DOUBLE_ELEMENTS:
230 *a_out = HOLEY_DOUBLE_ELEMENTS;