V8 Project
elements-kind.h
Go to the documentation of this file.
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
3 // found in the LICENSE file.
4 
5 #ifndef V8_ELEMENTS_KIND_H_
6 #define V8_ELEMENTS_KIND_H_
7 
8 #include "src/checks.h"
9 
10 namespace v8 {
11 namespace internal {
12 
14  // The "fast" kind for elements that only contain SMI values. Must be first
15  // to make it possible to efficiently check maps for this kind.
18 
19  // The "fast" kind for tagged values. Must be second to make it possible to
20  // efficiently check maps for this and the FAST_SMI_ONLY_ELEMENTS kind
21  // together at once.
24 
25  // The "fast" kind for unwrapped, non-tagged double values.
28 
29  // The "slow" kind.
32  // The "fast" kind for external arrays
42 
43  // Fixed typed arrays
53 
54  // Derived constants from ElementsKind
64 };
65 
69 
70 // The number to add to a packed elements kind to reach a holey elements kind
73 
74 int ElementsKindToShiftSize(ElementsKind elements_kind);
76 const char* ElementsKindToString(ElementsKind kind);
77 
79 
82 
84 
86  return kind == DICTIONARY_ELEMENTS;
87 }
88 
89 
91  return kind == SLOPPY_ARGUMENTS_ELEMENTS;
92 }
93 
94 
96  return kind >= FIRST_EXTERNAL_ARRAY_ELEMENTS_KIND &&
98 }
99 
100 
102  return kind == TERMINAL_FAST_ELEMENTS_KIND ||
104 }
105 
106 
108  return kind >= FIRST_FIXED_TYPED_ARRAY_ELEMENTS_KIND &&
110 }
111 
112 
113 inline bool IsFastElementsKind(ElementsKind kind) {
115  return kind <= FAST_HOLEY_DOUBLE_ELEMENTS;
116 }
117 
118 
121 }
122 
123 
125  return kind == FAST_DOUBLE_ELEMENTS ||
127 }
128 
129 
131  return kind == EXTERNAL_FLOAT64_ELEMENTS ||
133 }
134 
135 
137  return kind == FLOAT32_ELEMENTS || kind == FLOAT64_ELEMENTS;
138 }
139 
140 
142  return IsFastDoubleElementsKind(kind) ||
145 }
146 
147 
149  return kind == FAST_SMI_ELEMENTS ||
150  kind == FAST_HOLEY_SMI_ELEMENTS ||
151  kind == FAST_ELEMENTS ||
152  kind == FAST_HOLEY_ELEMENTS;
153 }
154 
155 
157  return kind == FAST_SMI_ELEMENTS ||
158  kind == FAST_HOLEY_SMI_ELEMENTS;
159 }
160 
161 
163  return kind == FAST_ELEMENTS ||
164  kind == FAST_HOLEY_ELEMENTS;
165 }
166 
167 
169  return kind == FAST_HOLEY_SMI_ELEMENTS ||
170  kind == FAST_HOLEY_DOUBLE_ELEMENTS ||
171  kind == FAST_HOLEY_ELEMENTS;
172 }
173 
174 
176  return IsFastHoleyElementsKind(kind) ||
177  kind == DICTIONARY_ELEMENTS;
178 }
179 
180 
182  return kind == FAST_SMI_ELEMENTS ||
183  kind == FAST_DOUBLE_ELEMENTS ||
184  kind == FAST_ELEMENTS;
185 }
186 
187 
189  if (holey_kind == FAST_HOLEY_SMI_ELEMENTS) {
190  return FAST_SMI_ELEMENTS;
191  }
192  if (holey_kind == FAST_HOLEY_DOUBLE_ELEMENTS) {
193  return FAST_DOUBLE_ELEMENTS;
194  }
195  if (holey_kind == FAST_HOLEY_ELEMENTS) {
196  return FAST_ELEMENTS;
197  }
198  return holey_kind;
199 }
200 
201 
203  if (packed_kind == FAST_SMI_ELEMENTS) {
205  }
206  if (packed_kind == FAST_DOUBLE_ELEMENTS) {
208  }
209  if (packed_kind == FAST_ELEMENTS) {
210  return FAST_HOLEY_ELEMENTS;
211  }
212  return packed_kind;
213 }
214 
215 
217  DCHECK(IsFastSmiElementsKind(from_kind));
218  return (from_kind == FAST_SMI_ELEMENTS)
219  ? FAST_ELEMENTS
221 }
222 
223 
225  ElementsKind to_kind) {
226  return (GetHoleyElementsKind(from_kind) == to_kind) ||
227  (IsFastSmiElementsKind(from_kind) &&
228  IsFastObjectElementsKind(to_kind));
229 }
230 
231 
233  ElementsKind to_kind);
234 
235 
237  return IsFastElementsKind(from_kind) &&
238  from_kind != TERMINAL_FAST_ELEMENTS_KIND;
239 }
240 
241 
243  bool allow_only_packed);
244 
245 
247  ElementsKind elements_kind,
248  bool allow_only_packed) {
249  return IsFastElementsKind(elements_kind) &&
250  (elements_kind != TERMINAL_FAST_ELEMENTS_KIND &&
251  (!allow_only_packed || elements_kind != FAST_ELEMENTS));
252 }
253 
254 
255 } } // namespace v8::internal
256 
257 #endif // V8_ELEMENTS_KIND_H_
#define DCHECK(condition)
Definition: logging.h:205
bool IsDoubleOrFloatElementsKind(ElementsKind kind)
bool IsFastHoleyElementsKind(ElementsKind kind)
bool IsSloppyArgumentsElements(ElementsKind kind)
Definition: elements-kind.h:90
ElementsKind GetFastElementsKindFromSequenceIndex(int sequence_number)
bool IsExternalArrayElementsKind(ElementsKind kind)
Definition: elements-kind.h:95
bool CanTransitionToMoreGeneralFastElementsKind(ElementsKind elements_kind, bool allow_only_packed)
bool IsFastSmiOrObjectElementsKind(ElementsKind kind)
bool IsMoreGeneralElementsKindTransition(ElementsKind from_kind, ElementsKind to_kind)
bool IsTransitionElementsKind(ElementsKind kind)
const int kFastElementsKindPackedToHoley
Definition: elements-kind.h:71
bool IsFixedFloatElementsKind(ElementsKind kind)
ElementsKind GetNextMoreGeneralFastElementsKind(ElementsKind elements_kind, bool allow_only_packed)
ElementsKind GetPackedElementsKind(ElementsKind holey_kind)
bool IsHoleyElementsKind(ElementsKind kind)
const int kElementsKindCount
Definition: elements-kind.h:66
@ EXTERNAL_UINT16_ELEMENTS
Definition: elements-kind.h:36
@ UINT8_CLAMPED_ELEMENTS
Definition: elements-kind.h:52
@ LAST_FAST_ELEMENTS_KIND
Definition: elements-kind.h:58
@ LAST_EXTERNAL_ARRAY_ELEMENTS_KIND
Definition: elements-kind.h:60
@ FIRST_FIXED_TYPED_ARRAY_ELEMENTS_KIND
Definition: elements-kind.h:61
@ EXTERNAL_INT16_ELEMENTS
Definition: elements-kind.h:35
@ EXTERNAL_UINT8_ELEMENTS
Definition: elements-kind.h:34
@ LAST_FIXED_TYPED_ARRAY_ELEMENTS_KIND
Definition: elements-kind.h:62
@ EXTERNAL_INT32_ELEMENTS
Definition: elements-kind.h:37
@ FIRST_FAST_ELEMENTS_KIND
Definition: elements-kind.h:57
@ FAST_HOLEY_DOUBLE_ELEMENTS
Definition: elements-kind.h:27
@ SLOPPY_ARGUMENTS_ELEMENTS
Definition: elements-kind.h:31
@ EXTERNAL_INT8_ELEMENTS
Definition: elements-kind.h:33
@ EXTERNAL_FLOAT32_ELEMENTS
Definition: elements-kind.h:39
@ EXTERNAL_FLOAT64_ELEMENTS
Definition: elements-kind.h:40
@ TERMINAL_FAST_ELEMENTS_KIND
Definition: elements-kind.h:63
@ FAST_HOLEY_SMI_ELEMENTS
Definition: elements-kind.h:17
@ EXTERNAL_UINT32_ELEMENTS
Definition: elements-kind.h:38
@ EXTERNAL_UINT8_CLAMPED_ELEMENTS
Definition: elements-kind.h:41
@ FIRST_EXTERNAL_ARRAY_ELEMENTS_KIND
Definition: elements-kind.h:59
bool IsSimpleMapChangeTransition(ElementsKind from_kind, ElementsKind to_kind)
const char * ElementsKindToString(ElementsKind kind)
bool IsFastDoubleElementsKind(ElementsKind kind)
int ElementsKindToShiftSize(ElementsKind elements_kind)
int GetSequenceIndexFromFastElementsKind(ElementsKind elements_kind)
int GetDefaultHeaderSizeForElementsKind(ElementsKind elements_kind)
bool IsFastPackedElementsKind(ElementsKind kind)
ElementsKind GetHoleyElementsKind(ElementsKind packed_kind)
const int kFastElementsKindCount
Definition: elements-kind.h:67
ElementsKind GetNextTransitionElementsKind(ElementsKind kind)
bool IsTerminalElementsKind(ElementsKind kind)
bool IsFastElementsKind(ElementsKind kind)
bool IsDictionaryElementsKind(ElementsKind kind)
Definition: elements-kind.h:85
bool IsFixedTypedArrayElementsKind(ElementsKind kind)
bool IsFastSmiElementsKind(ElementsKind kind)
bool IsExternalFloatOrDoubleElementsKind(ElementsKind kind)
bool IsTransitionableFastElementsKind(ElementsKind from_kind)
ElementsKind GetInitialFastElementsKind()
Definition: elements-kind.h:78
bool IsFastObjectElementsKind(ElementsKind kind)
ElementsKind FastSmiToObjectElementsKind(ElementsKind from_kind)
Debugger support for the V8 JavaScript engine.
Definition: accessors.cc:20