v8
V8 is Google’s open source high-performance JavaScript and WebAssembly engine, written in C++.
Loading...
Searching...
No Matches
elements-kind.cc
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
6
10#include "src/objects/objects.h"
11
12namespace v8 {
13namespace internal {
14
15namespace {
16constexpr size_t size_to_shift(size_t size) {
17 switch (size) {
18 case 1:
19 return 0;
20 case 2:
21 return 1;
22 case 4:
23 return 2;
24 case 8:
25 return 3;
26 default:
28 }
29}
30} // namespace
31
33#define SHIFT(Type, type, TYPE, ctype) size_to_shift(sizeof(ctype)),
35#undef SHIFT
36};
37
39#define SIZE(Type, type, TYPE, ctype) sizeof(ctype),
41#undef SIZE
42};
43
44#define VERIFY_SHIFT(Type, type, TYPE, ctype) \
45 static_assert( \
46 kTypedArrayAndRabGsabTypedArrayElementsKindShifts \
47 [ElementsKind::TYPE##_ELEMENTS - \
48 ElementsKind::FIRST_FIXED_TYPED_ARRAY_ELEMENTS_KIND] == \
49 ElementsKindToShiftSize(ElementsKind::TYPE##_ELEMENTS), \
50 "Shift of ElementsKind::" #TYPE \
51 "_ELEMENTS does not match in static table");
54#undef VERIFY_SHIFT
55
56#define VERIFY_SIZE(Type, type, TYPE, ctype) \
57 static_assert( \
58 kTypedArrayAndRabGsabTypedArrayElementsKindSizes \
59 [ElementsKind::TYPE##_ELEMENTS - \
60 ElementsKind::FIRST_FIXED_TYPED_ARRAY_ELEMENTS_KIND] == \
61 ElementsKindToByteSize(ElementsKind::TYPE##_ELEMENTS), \
62 "Size of ElementsKind::" #TYPE \
63 "_ELEMENTS does not match in static table");
66#undef VERIFY_SIZE
67
71
75
86
88 switch (kind) {
90 return "PACKED_SMI_ELEMENTS";
92 return "HOLEY_SMI_ELEMENTS";
93 case PACKED_ELEMENTS:
94 return "PACKED_ELEMENTS";
95 case HOLEY_ELEMENTS:
96 return "HOLEY_ELEMENTS";
98 return "PACKED_DOUBLE_ELEMENTS";
100 return "HOLEY_DOUBLE_ELEMENTS";
102 return "PACKED_NONEXTENSIBLE_ELEMENTS";
104 return "HOLEY_NONEXTENSIBLE_ELEMENTS";
106 return "PACKED_SEALED_ELEMENTS";
108 return "HOLEY_SEALED_ELEMENTS";
110 return "PACKED_FROZEN_ELEMENTS";
112 return "HOLEY_FROZEN_ELEMENTS";
114 return "DICTIONARY_ELEMENTS";
116 return "FAST_SLOPPY_ARGUMENTS_ELEMENTS";
118 return "SLOW_SLOPPY_ARGUMENTS_ELEMENTS";
120 return "FAST_STRING_WRAPPER_ELEMENTS";
122 return "SLOW_STRING_WRAPPER_ELEMENTS";
123
124#define PRINT_NAME(Type, type, TYPE, _) \
125 case TYPE##_ELEMENTS: \
126 return #TYPE "ELEMENTS";
127
130#undef PRINT_NAME
132 return "WASM_ARRAY_ELEMENTS";
134 return "SHARED_ARRAY_ELEMENTS";
135 case NO_ELEMENTS:
136 return "NO_ELEMENTS";
137 }
138 UNREACHABLE();
139}
140
150// Verify that kFastElementsKindPackedToHoley is correct.
157
159 DCHECK(sequence_number >= 0 && sequence_number < kFastElementsKindCount);
160 return kFastElementsKindSequence[sequence_number];
161}
162
164 for (int i = 0; i < kFastElementsKindCount; ++i) {
165 if (kFastElementsKindSequence[i] == elements_kind) {
166 return i;
167 }
168 }
169 UNREACHABLE();
170}
171
176
177static inline bool IsFastTransitionTarget(ElementsKind elements_kind) {
178 return IsFastElementsKind(elements_kind) ||
179 elements_kind == DICTIONARY_ELEMENTS;
180}
181
183 ElementsKind to_kind) {
184 if (!IsFastElementsKind(from_kind)) return false;
185 if (!IsFastTransitionTarget(to_kind)) return false;
188 switch (from_kind) {
190 return to_kind != PACKED_SMI_ELEMENTS;
192 return to_kind != PACKED_SMI_ELEMENTS && to_kind != HOLEY_SMI_ELEMENTS;
194 return to_kind != PACKED_SMI_ELEMENTS && to_kind != HOLEY_SMI_ELEMENTS &&
195 to_kind != PACKED_DOUBLE_ELEMENTS;
197 return to_kind == PACKED_ELEMENTS || to_kind == HOLEY_ELEMENTS;
198 case PACKED_ELEMENTS:
199 return to_kind == HOLEY_ELEMENTS;
200 case HOLEY_ELEMENTS:
201 return false;
202 default:
203 return false;
204 }
205}
206
208 // Assert that the union of two ElementKinds can be computed via std::max.
210 "ElementsKind union not computable via std::max.");
211 static_assert(HOLEY_SMI_ELEMENTS < PACKED_ELEMENTS,
212 "ElementsKind union not computable via std::max.");
213 static_assert(PACKED_ELEMENTS < HOLEY_ELEMENTS,
214 "ElementsKind union not computable via std::max.");
216 "ElementsKind union not computable via std::max.");
217 ElementsKind a = *a_out;
218 switch (a) {
220 switch (b) {
223 case PACKED_ELEMENTS:
224 case HOLEY_ELEMENTS:
225 *a_out = b;
226 return true;
227 default:
228 return false;
229 }
231 switch (b) {
234 *a_out = HOLEY_SMI_ELEMENTS;
235 return true;
236 case PACKED_ELEMENTS:
237 case HOLEY_ELEMENTS:
238 *a_out = HOLEY_ELEMENTS;
239 return true;
240 default:
241 return false;
242 }
243 case PACKED_ELEMENTS:
244 switch (b) {
246 case PACKED_ELEMENTS:
247 *a_out = PACKED_ELEMENTS;
248 return true;
250 case HOLEY_ELEMENTS:
251 *a_out = HOLEY_ELEMENTS;
252 return true;
253 default:
254 return false;
255 }
256 case HOLEY_ELEMENTS:
257 switch (b) {
260 case PACKED_ELEMENTS:
261 case HOLEY_ELEMENTS:
262 *a_out = HOLEY_ELEMENTS;
263 return true;
264 default:
265 return false;
266 }
268 switch (b) {
271 *a_out = b;
272 return true;
273 default:
274 return false;
275 }
277 switch (b) {
280 *a_out = HOLEY_DOUBLE_ELEMENTS;
281 return true;
282 default:
283 return false;
284 }
285 default:
286 break;
287 }
288 return false;
289}
290
291std::ostream& operator<<(std::ostream& os, ElementsKind kind) {
292 return os << ElementsKindToString(kind);
293}
294
295} // namespace internal
296} // namespace v8
Builtins::Kind kind
Definition builtins.cc:40
#define PRINT_NAME(Type, type, TYPE, _)
#define VERIFY_SHIFT(Type, type, TYPE, ctype)
#define SHIFT(Type, type, TYPE, ctype)
#define SIZE(Type, type, TYPE, ctype)
#define VERIFY_SIZE(Type, type, TYPE, ctype)
#define RAB_GSAB_TYPED_ARRAYS(V)
#define TYPED_ARRAYS(V)
constexpr int kFastElementsKindCount
ElementsKind GetFastElementsKindFromSequenceIndex(int sequence_number)
bool IsMoreGeneralElementsKindTransition(ElementsKind from_kind, ElementsKind to_kind)
constexpr uint8_t kTypedArrayAndRabGsabTypedArrayElementsKindSizes[]
const uint8_t * TypedArrayAndRabGsabTypedArrayElementsKindShifts()
constexpr int kFastElementsKindPackedToHoley
static bool IsFastTransitionTarget(ElementsKind elements_kind)
@ HOLEY_NONEXTENSIBLE_ELEMENTS
@ SLOW_STRING_WRAPPER_ELEMENTS
@ PACKED_NONEXTENSIBLE_ELEMENTS
@ SLOW_SLOPPY_ARGUMENTS_ELEMENTS
@ FAST_SLOPPY_ARGUMENTS_ELEMENTS
@ FAST_STRING_WRAPPER_ELEMENTS
const char * ElementsKindToString(ElementsKind kind)
std::ostream & operator<<(std::ostream &os, AtomicMemoryOrder order)
int GetSequenceIndexFromFastElementsKind(ElementsKind elements_kind)
int GetDefaultHeaderSizeForElementsKind(ElementsKind elements_kind)
const ElementsKind kFastElementsKindSequence[kFastElementsKindCount]
DONT_OVERRIDE DISABLE_ALLOCATION_SITES HOLEY_ELEMENTS
ElementsKind GetNextTransitionElementsKind(ElementsKind kind)
bool IsFastElementsKind(ElementsKind kind)
DONT_OVERRIDE DISABLE_ALLOCATION_SITES DISABLE_ALLOCATION_SITES HOLEY_DOUBLE_ELEMENTS
const int kHeapObjectTag
Definition v8-internal.h:72
bool UnionElementsKindUptoSize(ElementsKind *a_out, ElementsKind b)
const uint8_t * TypedArrayAndRabGsabTypedArrayElementsKindSizes()
bool IsTypedArrayOrRabGsabTypedArrayElementsKind(ElementsKind kind)
constexpr uint8_t kTypedArrayAndRabGsabTypedArrayElementsKindShifts[]
#define DCHECK(condition)
Definition logging.h:482
#define OFFSET_OF_DATA_START(Type)