OLD | NEW |
---|---|
(Empty) | |
1 // Copyright 2012 the V8 project authors. All rights reserved. | |
2 // Redistribution and use in source and binary forms, with or without | |
3 // modification, are permitted provided that the following conditions are | |
4 // met: | |
5 // | |
6 // * Redistributions of source code must retain the above copyright | |
7 // notice, this list of conditions and the following disclaimer. | |
8 // * Redistributions in binary form must reproduce the above | |
9 // copyright notice, this list of conditions and the following | |
10 // disclaimer in the documentation and/or other materials provided | |
11 // with the distribution. | |
12 // * Neither the name of Google Inc. nor the names of its | |
13 // contributors may be used to endorse or promote products derived | |
14 // from this software without specific prior written permission. | |
15 // | |
16 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | |
17 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | |
18 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | |
19 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | |
20 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |
21 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |
22 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | |
23 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | |
24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | |
25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | |
26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
27 | |
28 #ifndef V8_ELEMENTS_KIND_H_ | |
29 #define V8_ELEMENTS_KIND_H_ | |
30 | |
31 #include "v8checks.h" | |
32 | |
33 namespace v8 { | |
34 namespace internal { | |
35 | |
36 enum ElementsKind { | |
37 // The "fast" kind for elements that only contain SMI values. Must be first | |
38 // to make it possible to efficiently check maps for this kind. | |
39 FAST_SMI_ELEMENTS, | |
40 FAST_HOLEY_SMI_ELEMENTS, | |
41 | |
42 // The "fast" kind for tagged values. Must be second to make it possible to | |
43 // efficiently check maps for this and the FAST_SMI_ONLY_ELEMENTS kind | |
44 // together at once. | |
45 FAST_ELEMENTS, | |
46 FAST_HOLEY_ELEMENTS, | |
47 | |
48 // The "fast" kind for unwrapped, non-tagged double values. | |
49 FAST_DOUBLE_ELEMENTS, | |
50 FAST_HOLEY_DOUBLE_ELEMENTS, | |
51 | |
52 // The "slow" kind. | |
53 DICTIONARY_ELEMENTS, | |
54 NON_STRICT_ARGUMENTS_ELEMENTS, | |
55 // The "fast" kind for external arrays | |
56 EXTERNAL_BYTE_ELEMENTS, | |
57 EXTERNAL_UNSIGNED_BYTE_ELEMENTS, | |
58 EXTERNAL_SHORT_ELEMENTS, | |
59 EXTERNAL_UNSIGNED_SHORT_ELEMENTS, | |
60 EXTERNAL_INT_ELEMENTS, | |
61 EXTERNAL_UNSIGNED_INT_ELEMENTS, | |
62 EXTERNAL_FLOAT_ELEMENTS, | |
63 EXTERNAL_DOUBLE_ELEMENTS, | |
64 EXTERNAL_PIXEL_ELEMENTS, | |
65 | |
66 // Derived constants from ElementsKind | |
67 FIRST_ELEMENTS_KIND = FAST_SMI_ELEMENTS, | |
68 LAST_ELEMENTS_KIND = EXTERNAL_PIXEL_ELEMENTS, | |
69 FIRST_FAST_ELEMENTS_KIND = FAST_SMI_ELEMENTS, | |
70 LAST_FAST_ELEMENTS_KIND = FAST_HOLEY_DOUBLE_ELEMENTS, | |
71 FIRST_EXTERNAL_ARRAY_ELEMENTS_KIND = EXTERNAL_BYTE_ELEMENTS, | |
72 LAST_EXTERNAL_ARRAY_ELEMENTS_KIND = EXTERNAL_PIXEL_ELEMENTS, | |
73 TERMINAL_FAST_ELEMENTS_KIND = FAST_HOLEY_ELEMENTS | |
74 }; | |
75 | |
76 const int kElementsKindCount = LAST_ELEMENTS_KIND - FIRST_ELEMENTS_KIND + 1; | |
77 const int kFastElementsKindCount = LAST_FAST_ELEMENTS_KIND - | |
78 FIRST_FAST_ELEMENTS_KIND + 1; | |
79 | |
80 void PrintElementsKind(FILE* out, ElementsKind kind); | |
81 | |
82 ElementsKind GetInitialFastElementsKind(); | |
83 | |
84 ElementsKind GetFastElementsKindFromSequenceIndex(int sequence_index); | |
85 | |
86 int GetSequenceIndexFromFastElementsKind(ElementsKind elements_kind); | |
87 | |
88 | |
89 inline bool IsFastElementsKind(ElementsKind kind) { | |
90 ASSERT(FIRST_FAST_ELEMENTS_KIND == 0); | |
91 return kind <= FAST_HOLEY_DOUBLE_ELEMENTS; | |
92 } | |
93 | |
94 | |
95 inline bool IsFastDoubleElementsKind(ElementsKind kind) { | |
96 return kind == FAST_DOUBLE_ELEMENTS || | |
97 kind == FAST_HOLEY_DOUBLE_ELEMENTS; | |
98 } | |
99 | |
100 | |
101 inline bool IsFastSmiOrObjectElementsKind(ElementsKind kind) { | |
102 return kind == FAST_SMI_ELEMENTS || | |
103 kind == FAST_HOLEY_SMI_ELEMENTS || | |
104 kind == FAST_ELEMENTS || | |
105 kind == FAST_HOLEY_ELEMENTS; | |
106 } | |
107 | |
108 | |
109 inline bool IsFastSmiElementsKind(ElementsKind kind) { | |
110 return kind == FAST_SMI_ELEMENTS || | |
111 kind == FAST_HOLEY_SMI_ELEMENTS; | |
112 } | |
113 | |
114 | |
115 inline bool IsFastObjectElementsKind(ElementsKind kind) { | |
116 return kind == FAST_ELEMENTS || | |
117 kind == FAST_HOLEY_ELEMENTS; | |
118 } | |
119 | |
120 | |
121 inline bool IsFastHoleyElementsKind(ElementsKind kind) { | |
122 return kind == FAST_HOLEY_SMI_ELEMENTS || | |
123 kind == FAST_HOLEY_DOUBLE_ELEMENTS || | |
124 kind == FAST_HOLEY_ELEMENTS; | |
125 } | |
126 | |
127 | |
128 inline bool IsHoleyElementsKind(ElementsKind kind) { | |
129 return IsFastHoleyElementsKind(kind) || | |
130 kind == DICTIONARY_ELEMENTS; | |
131 } | |
132 | |
133 | |
134 inline bool IsFastPackedElementsKind(ElementsKind kind) { | |
135 return !IsFastHoleyElementsKind(kind); | |
Jakob Kummerow
2012/05/13 21:55:27
Let's add an "ASSERT(IsFastElementsKind(kind));" h
danno
2012/05/22 11:05:21
Done.
| |
136 } | |
137 | |
138 | |
139 inline ElementsKind GetPackedElementsKind(ElementsKind holey_kind) { | |
140 if (holey_kind == FAST_HOLEY_SMI_ELEMENTS) { | |
141 return FAST_SMI_ELEMENTS; | |
142 } | |
143 if (holey_kind == FAST_HOLEY_DOUBLE_ELEMENTS) { | |
144 return FAST_DOUBLE_ELEMENTS; | |
145 } | |
146 if (holey_kind == FAST_HOLEY_ELEMENTS) { | |
147 return FAST_ELEMENTS; | |
148 } | |
149 return holey_kind; | |
150 } | |
151 | |
152 | |
153 inline ElementsKind GetHoleyElementsKind(ElementsKind packed_kind) { | |
154 if (packed_kind == FAST_SMI_ELEMENTS) { | |
155 return FAST_HOLEY_SMI_ELEMENTS; | |
156 } | |
157 if (packed_kind == FAST_DOUBLE_ELEMENTS) { | |
158 return FAST_HOLEY_DOUBLE_ELEMENTS; | |
159 } | |
160 if (packed_kind == FAST_ELEMENTS) { | |
161 return FAST_HOLEY_ELEMENTS; | |
162 } | |
163 return packed_kind; | |
164 } | |
165 | |
166 | |
167 inline ElementsKind FastSmiToObjectElementsKind(ElementsKind from_kind) { | |
168 ASSERT(IsFastSmiElementsKind(from_kind)); | |
169 return (from_kind == FAST_SMI_ELEMENTS) | |
170 ? FAST_ELEMENTS | |
171 : FAST_HOLEY_ELEMENTS; | |
172 } | |
173 | |
174 | |
175 bool IsMoreGeneralElementsKindTransition(ElementsKind from_kind, | |
176 ElementsKind to_kind); | |
177 | |
178 | |
179 inline bool IsTransitionableFastElementsKind(ElementsKind from_kind) { | |
180 return IsFastElementsKind(from_kind) && | |
181 from_kind != TERMINAL_FAST_ELEMENTS_KIND; | |
182 } | |
183 | |
184 | |
185 ElementsKind GetNextMoreGeneralFastElementsKind(ElementsKind elements_kind, | |
186 bool allow_only_packed); | |
187 | |
188 | |
189 inline bool CanTransitionToMoreGeneralFastElementsKind( | |
190 ElementsKind elements_kind, | |
191 bool allow_only_packed) { | |
192 return elements_kind != TERMINAL_FAST_ELEMENTS_KIND && | |
193 (!allow_only_packed || elements_kind != FAST_ELEMENTS); | |
194 } | |
195 | |
196 | |
197 } } // namespace v8::internal | |
198 | |
199 #endif // V8_ELEMENTS_KIND_H_ | |
OLD | NEW |