blob: 3ebc9ad287ccc6a664d63f4877e2c37eb4da44e2 [file] [log] [blame]
Ben Murdochb8a8cc12014-11-26 15:28:44 +00001// 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
3// found in the LICENSE file.
4
5#ifndef V8_ELEMENTS_KIND_H_
6#define V8_ELEMENTS_KIND_H_
7
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00008#include "src/base/macros.h"
Ben Murdochb8a8cc12014-11-26 15:28:44 +00009#include "src/checks.h"
10
11namespace v8 {
12namespace internal {
13
14enum ElementsKind {
15 // The "fast" kind for elements that only contain SMI values. Must be first
16 // to make it possible to efficiently check maps for this kind.
17 FAST_SMI_ELEMENTS,
18 FAST_HOLEY_SMI_ELEMENTS,
19
20 // The "fast" kind for tagged values. Must be second to make it possible to
21 // efficiently check maps for this and the FAST_SMI_ONLY_ELEMENTS kind
22 // together at once.
23 FAST_ELEMENTS,
24 FAST_HOLEY_ELEMENTS,
25
26 // The "fast" kind for unwrapped, non-tagged double values.
27 FAST_DOUBLE_ELEMENTS,
28 FAST_HOLEY_DOUBLE_ELEMENTS,
29
30 // The "slow" kind.
31 DICTIONARY_ELEMENTS,
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000032
Ben Murdoch097c5b22016-05-18 11:27:45 +010033 // Elements kind of the "arguments" object (only in sloppy mode).
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000034 FAST_SLOPPY_ARGUMENTS_ELEMENTS,
35 SLOW_SLOPPY_ARGUMENTS_ELEMENTS,
Ben Murdochb8a8cc12014-11-26 15:28:44 +000036
Ben Murdoch097c5b22016-05-18 11:27:45 +010037 // For string wrapper objects ("new String('...')"), the string's characters
38 // are overlaid onto a regular elements backing store.
39 FAST_STRING_WRAPPER_ELEMENTS,
40 SLOW_STRING_WRAPPER_ELEMENTS,
41
42 // Fixed typed arrays.
Ben Murdochb8a8cc12014-11-26 15:28:44 +000043 UINT8_ELEMENTS,
44 INT8_ELEMENTS,
45 UINT16_ELEMENTS,
46 INT16_ELEMENTS,
47 UINT32_ELEMENTS,
48 INT32_ELEMENTS,
49 FLOAT32_ELEMENTS,
50 FLOAT64_ELEMENTS,
51 UINT8_CLAMPED_ELEMENTS,
52
Ben Murdoch097c5b22016-05-18 11:27:45 +010053 // Sentinel ElementsKind for objects with no elements.
54 NO_ELEMENTS,
55
56 // Derived constants from ElementsKind.
Ben Murdochb8a8cc12014-11-26 15:28:44 +000057 FIRST_ELEMENTS_KIND = FAST_SMI_ELEMENTS,
58 LAST_ELEMENTS_KIND = UINT8_CLAMPED_ELEMENTS,
59 FIRST_FAST_ELEMENTS_KIND = FAST_SMI_ELEMENTS,
60 LAST_FAST_ELEMENTS_KIND = FAST_HOLEY_DOUBLE_ELEMENTS,
Ben Murdochb8a8cc12014-11-26 15:28:44 +000061 FIRST_FIXED_TYPED_ARRAY_ELEMENTS_KIND = UINT8_ELEMENTS,
62 LAST_FIXED_TYPED_ARRAY_ELEMENTS_KIND = UINT8_CLAMPED_ELEMENTS,
63 TERMINAL_FAST_ELEMENTS_KIND = FAST_HOLEY_ELEMENTS
64};
65
66const int kElementsKindCount = LAST_ELEMENTS_KIND - FIRST_ELEMENTS_KIND + 1;
67const int kFastElementsKindCount = LAST_FAST_ELEMENTS_KIND -
68 FIRST_FAST_ELEMENTS_KIND + 1;
69
70// The number to add to a packed elements kind to reach a holey elements kind
71const int kFastElementsKindPackedToHoley =
72 FAST_HOLEY_SMI_ELEMENTS - FAST_SMI_ELEMENTS;
73
74int ElementsKindToShiftSize(ElementsKind elements_kind);
75int GetDefaultHeaderSizeForElementsKind(ElementsKind elements_kind);
76const char* ElementsKindToString(ElementsKind kind);
77
78inline ElementsKind GetInitialFastElementsKind() { return FAST_SMI_ELEMENTS; }
79
80ElementsKind GetFastElementsKindFromSequenceIndex(int sequence_number);
81int GetSequenceIndexFromFastElementsKind(ElementsKind elements_kind);
82
83ElementsKind GetNextTransitionElementsKind(ElementsKind elements_kind);
84
85inline bool IsDictionaryElementsKind(ElementsKind kind) {
86 return kind == DICTIONARY_ELEMENTS;
87}
88
89
90inline bool IsSloppyArgumentsElements(ElementsKind kind) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000091 return kind == FAST_SLOPPY_ARGUMENTS_ELEMENTS ||
92 kind == SLOW_SLOPPY_ARGUMENTS_ELEMENTS;
Ben Murdochb8a8cc12014-11-26 15:28:44 +000093}
94
Ben Murdoch097c5b22016-05-18 11:27:45 +010095inline bool IsStringWrapperElementsKind(ElementsKind kind) {
96 return kind == FAST_STRING_WRAPPER_ELEMENTS ||
97 kind == SLOW_STRING_WRAPPER_ELEMENTS;
98}
Ben Murdochb8a8cc12014-11-26 15:28:44 +000099
100inline bool IsFixedTypedArrayElementsKind(ElementsKind kind) {
101 return kind >= FIRST_FIXED_TYPED_ARRAY_ELEMENTS_KIND &&
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000102 kind <= LAST_FIXED_TYPED_ARRAY_ELEMENTS_KIND;
103}
104
105
106inline bool IsTerminalElementsKind(ElementsKind kind) {
107 return kind == TERMINAL_FAST_ELEMENTS_KIND ||
108 IsFixedTypedArrayElementsKind(kind);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000109}
110
111
112inline bool IsFastElementsKind(ElementsKind kind) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000113 STATIC_ASSERT(FIRST_FAST_ELEMENTS_KIND == 0);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000114 return kind <= FAST_HOLEY_DOUBLE_ELEMENTS;
115}
116
117
118inline bool IsTransitionElementsKind(ElementsKind kind) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000119 return IsFastElementsKind(kind) || IsFixedTypedArrayElementsKind(kind) ||
Ben Murdoch097c5b22016-05-18 11:27:45 +0100120 kind == FAST_SLOPPY_ARGUMENTS_ELEMENTS ||
121 kind == FAST_STRING_WRAPPER_ELEMENTS;
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000122}
123
124
125inline bool IsFastDoubleElementsKind(ElementsKind kind) {
126 return kind == FAST_DOUBLE_ELEMENTS ||
127 kind == FAST_HOLEY_DOUBLE_ELEMENTS;
128}
129
130
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000131inline bool IsFixedFloatElementsKind(ElementsKind kind) {
132 return kind == FLOAT32_ELEMENTS || kind == FLOAT64_ELEMENTS;
133}
134
135
136inline bool IsDoubleOrFloatElementsKind(ElementsKind kind) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000137 return IsFastDoubleElementsKind(kind) || IsFixedFloatElementsKind(kind);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000138}
139
140
141inline bool IsFastSmiOrObjectElementsKind(ElementsKind kind) {
142 return kind == FAST_SMI_ELEMENTS ||
143 kind == FAST_HOLEY_SMI_ELEMENTS ||
144 kind == FAST_ELEMENTS ||
145 kind == FAST_HOLEY_ELEMENTS;
146}
147
148
149inline bool IsFastSmiElementsKind(ElementsKind kind) {
150 return kind == FAST_SMI_ELEMENTS ||
151 kind == FAST_HOLEY_SMI_ELEMENTS;
152}
153
154
155inline bool IsFastObjectElementsKind(ElementsKind kind) {
156 return kind == FAST_ELEMENTS ||
157 kind == FAST_HOLEY_ELEMENTS;
158}
159
160
161inline bool IsFastHoleyElementsKind(ElementsKind kind) {
162 return kind == FAST_HOLEY_SMI_ELEMENTS ||
163 kind == FAST_HOLEY_DOUBLE_ELEMENTS ||
164 kind == FAST_HOLEY_ELEMENTS;
165}
166
167
168inline bool IsHoleyElementsKind(ElementsKind kind) {
169 return IsFastHoleyElementsKind(kind) ||
170 kind == DICTIONARY_ELEMENTS;
171}
172
173
174inline bool IsFastPackedElementsKind(ElementsKind kind) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000175 return kind == FAST_SMI_ELEMENTS || kind == FAST_DOUBLE_ELEMENTS ||
176 kind == FAST_ELEMENTS;
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000177}
178
179
180inline ElementsKind GetPackedElementsKind(ElementsKind holey_kind) {
181 if (holey_kind == FAST_HOLEY_SMI_ELEMENTS) {
182 return FAST_SMI_ELEMENTS;
183 }
184 if (holey_kind == FAST_HOLEY_DOUBLE_ELEMENTS) {
185 return FAST_DOUBLE_ELEMENTS;
186 }
187 if (holey_kind == FAST_HOLEY_ELEMENTS) {
188 return FAST_ELEMENTS;
189 }
190 return holey_kind;
191}
192
193
194inline ElementsKind GetHoleyElementsKind(ElementsKind packed_kind) {
195 if (packed_kind == FAST_SMI_ELEMENTS) {
196 return FAST_HOLEY_SMI_ELEMENTS;
197 }
198 if (packed_kind == FAST_DOUBLE_ELEMENTS) {
199 return FAST_HOLEY_DOUBLE_ELEMENTS;
200 }
201 if (packed_kind == FAST_ELEMENTS) {
202 return FAST_HOLEY_ELEMENTS;
203 }
204 return packed_kind;
205}
206
207
208inline ElementsKind FastSmiToObjectElementsKind(ElementsKind from_kind) {
209 DCHECK(IsFastSmiElementsKind(from_kind));
210 return (from_kind == FAST_SMI_ELEMENTS)
211 ? FAST_ELEMENTS
212 : FAST_HOLEY_ELEMENTS;
213}
214
215
216inline bool IsSimpleMapChangeTransition(ElementsKind from_kind,
217 ElementsKind to_kind) {
218 return (GetHoleyElementsKind(from_kind) == to_kind) ||
219 (IsFastSmiElementsKind(from_kind) &&
220 IsFastObjectElementsKind(to_kind));
221}
222
223
224bool IsMoreGeneralElementsKindTransition(ElementsKind from_kind,
225 ElementsKind to_kind);
226
227
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000228inline ElementsKind GetMoreGeneralElementsKind(ElementsKind from_kind,
229 ElementsKind to_kind) {
230 if (IsMoreGeneralElementsKindTransition(from_kind, to_kind)) {
231 return to_kind;
232 }
233 return from_kind;
234}
235
236
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000237inline bool IsTransitionableFastElementsKind(ElementsKind from_kind) {
238 return IsFastElementsKind(from_kind) &&
239 from_kind != TERMINAL_FAST_ELEMENTS_KIND;
240}
241
242
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000243} // namespace internal
244} // namespace v8
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000245
246#endif // V8_ELEMENTS_KIND_H_