V8 Project
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 
5 #include "src/elements-kind.h"
6 
7 #include "src/api.h"
9 #include "src/elements.h"
10 #include "src/objects.h"
11 
12 namespace v8 {
13 namespace internal {
14 
15 
17  switch (elements_kind) {
21  case UINT8_ELEMENTS:
22  case INT8_ELEMENTS:
24  return 0;
27  case UINT16_ELEMENTS:
28  case INT16_ELEMENTS:
29  return 1;
33  case UINT32_ELEMENTS:
34  case INT32_ELEMENTS:
35  case FLOAT32_ELEMENTS:
36  return 2;
40  case FLOAT64_ELEMENTS:
41  return 3;
42  case FAST_SMI_ELEMENTS:
43  case FAST_ELEMENTS:
48  return kPointerSizeLog2;
49  }
50  UNREACHABLE();
51  return 0;
52 }
53 
54 
57  return IsExternalArrayElementsKind(elements_kind)
59 }
60 
61 
64  return accessor->name();
65 }
66 
67 
69  static void Construct(
70  ElementsKind** fast_elements_kind_sequence_ptr) {
73  *fast_elements_kind_sequence_ptr = fast_elements_kind_sequence;
81 
82  // Verify that kFastElementsKindPackedToHoley is correct.
89  }
90 };
91 
92 
94  InitializeFastElementsKindSequence>::type
96 
97 
99  DCHECK(sequence_number >= 0 &&
100  sequence_number < kFastElementsKindCount);
101  return fast_elements_kind_sequence.Get()[sequence_number];
102 }
103 
104 
106  for (int i = 0; i < kFastElementsKindCount; ++i) {
107  if (fast_elements_kind_sequence.Get()[i] == elements_kind) {
108  return i;
109  }
110  }
111  UNREACHABLE();
112  return 0;
113 }
114 
115 
117  switch (kind) {
118 #define FIXED_TYPED_ARRAY_CASE(Type, type, TYPE, ctype, size) \
119  case TYPE##_ELEMENTS: return EXTERNAL_##TYPE##_ELEMENTS;
120 
122 #undef FIXED_TYPED_ARRAY_CASE
123  default: {
124  int index = GetSequenceIndexFromFastElementsKind(kind);
125  return GetFastElementsKindFromSequenceIndex(index + 1);
126  }
127  }
128 }
129 
130 
132  bool allow_only_packed) {
133  DCHECK(IsFastElementsKind(elements_kind));
134  DCHECK(elements_kind != TERMINAL_FAST_ELEMENTS_KIND);
135  while (true) {
136  elements_kind = GetNextTransitionElementsKind(elements_kind);
137  if (!IsFastHoleyElementsKind(elements_kind) || !allow_only_packed) {
138  return elements_kind;
139  }
140  }
141  UNREACHABLE();
143 }
144 
145 
146 static bool IsTypedArrayElementsKind(ElementsKind elements_kind) {
147  return IsFixedTypedArrayElementsKind(elements_kind) ||
148  IsExternalArrayElementsKind(elements_kind);
149 }
150 
151 
152 static inline bool IsFastTransitionTarget(ElementsKind elements_kind) {
153  return IsFastElementsKind(elements_kind) ||
154  elements_kind == DICTIONARY_ELEMENTS;
155 }
156 
158  ElementsKind to_kind) {
159  if (IsTypedArrayElementsKind(from_kind) ||
160  IsTypedArrayElementsKind(to_kind)) {
161  switch (from_kind) {
162 #define FIXED_TYPED_ARRAY_CASE(Type, type, TYPE, ctype, size) \
163  case TYPE##_ELEMENTS: \
164  return to_kind == EXTERNAL_##TYPE##_ELEMENTS;
165 
167 #undef FIXED_TYPED_ARRAY_CASE
168  default:
169  return false;
170  }
171  }
172  if (IsFastElementsKind(from_kind) && IsFastTransitionTarget(to_kind)) {
173  switch (from_kind) {
174  case FAST_SMI_ELEMENTS:
175  return to_kind != FAST_SMI_ELEMENTS;
177  return to_kind != FAST_SMI_ELEMENTS &&
178  to_kind != FAST_HOLEY_SMI_ELEMENTS;
180  return to_kind != FAST_SMI_ELEMENTS &&
181  to_kind != FAST_HOLEY_SMI_ELEMENTS &&
182  to_kind != FAST_DOUBLE_ELEMENTS;
184  return to_kind == FAST_ELEMENTS ||
185  to_kind == FAST_HOLEY_ELEMENTS;
186  case FAST_ELEMENTS:
187  return to_kind == FAST_HOLEY_ELEMENTS;
188  case FAST_HOLEY_ELEMENTS:
189  return false;
190  default:
191  return false;
192  }
193  }
194  return false;
195 }
196 
197 
198 } } // namespace v8::internal
const char * name() const
Definition: elements.h:24
static ElementsAccessor * ForKind(ElementsKind elements_kind)
Definition: elements.h:184
static const int kHeaderSize
Definition: objects.h:2393
#define FIXED_TYPED_ARRAY_CASE(Type, type, TYPE, ctype, size)
#define LAZY_INSTANCE_INITIALIZER
Definition: lazy-instance.h:81
#define UNREACHABLE()
Definition: logging.h:30
#define DCHECK(condition)
Definition: logging.h:205
static bool IsTypedArrayElementsKind(ElementsKind elements_kind)
bool IsFastHoleyElementsKind(ElementsKind kind)
ElementsKind GetFastElementsKindFromSequenceIndex(int sequence_number)
bool IsExternalArrayElementsKind(ElementsKind kind)
Definition: elements-kind.h:95
bool IsMoreGeneralElementsKindTransition(ElementsKind from_kind, ElementsKind to_kind)
const int kFastElementsKindPackedToHoley
Definition: elements-kind.h:71
ElementsKind GetNextMoreGeneralFastElementsKind(ElementsKind elements_kind, bool allow_only_packed)
static bool IsFastTransitionTarget(ElementsKind elements_kind)
const int kPointerSizeLog2
Definition: globals.h:147
@ EXTERNAL_UINT16_ELEMENTS
Definition: elements-kind.h:36
@ UINT8_CLAMPED_ELEMENTS
Definition: elements-kind.h:52
@ EXTERNAL_INT16_ELEMENTS
Definition: elements-kind.h:35
@ EXTERNAL_UINT8_ELEMENTS
Definition: elements-kind.h:34
@ 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
const char * ElementsKindToString(ElementsKind kind)
int ElementsKindToShiftSize(ElementsKind elements_kind)
int GetSequenceIndexFromFastElementsKind(ElementsKind elements_kind)
int GetDefaultHeaderSizeForElementsKind(ElementsKind elements_kind)
const int kFastElementsKindCount
Definition: elements-kind.h:67
ElementsKind GetNextTransitionElementsKind(ElementsKind kind)
bool IsFastElementsKind(ElementsKind kind)
const int kHeapObjectTag
Definition: v8.h:5737
static base::LazyInstance< ElementsKind *, InitializeFastElementsKindSequence >::type fast_elements_kind_sequence
STATIC_ASSERT(sizeof(CPURegister)==sizeof(Register))
bool IsFixedTypedArrayElementsKind(ElementsKind kind)
Debugger support for the V8 JavaScript engine.
Definition: accessors.cc:20
#define TYPED_ARRAYS(V)
Definition: objects.h:4433
static void Construct(ElementsKind **fast_elements_kind_sequence_ptr)