OLD | NEW |
1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef V8_TYPES_H_ | 5 #ifndef V8_TYPES_H_ |
6 #define V8_TYPES_H_ | 6 #define V8_TYPES_H_ |
7 | 7 |
8 #include "src/conversions.h" | 8 #include "src/conversions.h" |
9 #include "src/factory.h" | 9 #include "src/factory.h" |
10 #include "src/handles.h" | 10 #include "src/handles.h" |
(...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
181 kUntaggedUnsigned32) \ | 181 kUntaggedUnsigned32) \ |
182 V(UntaggedIntegral8, kUntaggedSigned8 | kUntaggedUnsigned8) \ | 182 V(UntaggedIntegral8, kUntaggedSigned8 | kUntaggedUnsigned8) \ |
183 V(UntaggedIntegral16, kUntaggedSigned16 | kUntaggedUnsigned16) \ | 183 V(UntaggedIntegral16, kUntaggedSigned16 | kUntaggedUnsigned16) \ |
184 V(UntaggedIntegral32, kUntaggedSigned32 | kUntaggedUnsigned32) \ | 184 V(UntaggedIntegral32, kUntaggedSigned32 | kUntaggedUnsigned32) \ |
185 V(UntaggedIntegral, kUntaggedBit | kUntaggedSigned | kUntaggedUnsigned) \ | 185 V(UntaggedIntegral, kUntaggedBit | kUntaggedSigned | kUntaggedUnsigned) \ |
186 V(UntaggedFloat, kUntaggedFloat32 | kUntaggedFloat64) \ | 186 V(UntaggedFloat, kUntaggedFloat32 | kUntaggedFloat64) \ |
187 V(UntaggedNumber, kUntaggedIntegral | kUntaggedFloat) \ | 187 V(UntaggedNumber, kUntaggedIntegral | kUntaggedFloat) \ |
188 V(Untagged, kUntaggedNumber | kUntaggedPointer) \ | 188 V(Untagged, kUntaggedNumber | kUntaggedPointer) \ |
189 V(Tagged, kTaggedSigned | kTaggedPointer) | 189 V(Tagged, kTaggedSigned | kTaggedPointer) |
190 | 190 |
| 191 #define INTERNAL_BITSET_TYPE_LIST(V) \ |
| 192 V(OtherUnsigned31, 1u << 1 | REPRESENTATION(kTagged | kUntaggedNumber)) \ |
| 193 V(OtherUnsigned32, 1u << 2 | REPRESENTATION(kTagged | kUntaggedNumber)) \ |
| 194 V(OtherSigned32, 1u << 3 | REPRESENTATION(kTagged | kUntaggedNumber)) \ |
| 195 V(OtherNumber, 1u << 4 | REPRESENTATION(kTagged | kUntaggedNumber)) |
| 196 |
191 #define SEMANTIC_BITSET_TYPE_LIST(V) \ | 197 #define SEMANTIC_BITSET_TYPE_LIST(V) \ |
192 V(Null, 1u << 1 | REPRESENTATION(kTaggedPointer)) \ | 198 V(NegativeSignedSmall, 1u << 5 | REPRESENTATION(kTagged | kUntaggedNumber)) \ |
193 V(Undefined, 1u << 2 | REPRESENTATION(kTaggedPointer)) \ | 199 V(Null, 1u << 6 | REPRESENTATION(kTaggedPointer)) \ |
194 V(Boolean, 1u << 3 | REPRESENTATION(kTaggedPointer)) \ | 200 V(Undefined, 1u << 7 | REPRESENTATION(kTaggedPointer)) \ |
195 V(UnsignedSmall, 1u << 4 | REPRESENTATION(kTagged | kUntaggedNumber)) \ | 201 V(Boolean, 1u << 8 | REPRESENTATION(kTaggedPointer)) \ |
196 V(OtherSignedSmall, 1u << 5 | REPRESENTATION(kTagged | kUntaggedNumber)) \ | 202 V(UnsignedSmall, 1u << 9 | REPRESENTATION(kTagged | kUntaggedNumber)) \ |
197 V(OtherUnsigned31, 1u << 6 | REPRESENTATION(kTagged | kUntaggedNumber)) \ | 203 V(MinusZero, 1u << 10 | REPRESENTATION(kTagged | kUntaggedNumber)) \ |
198 V(OtherUnsigned32, 1u << 7 | REPRESENTATION(kTagged | kUntaggedNumber)) \ | 204 V(NaN, 1u << 11 | REPRESENTATION(kTagged | kUntaggedNumber)) \ |
199 V(OtherSigned32, 1u << 8 | REPRESENTATION(kTagged | kUntaggedNumber)) \ | |
200 V(MinusZero, 1u << 9 | REPRESENTATION(kTagged | kUntaggedNumber)) \ | |
201 V(NaN, 1u << 10 | REPRESENTATION(kTagged | kUntaggedNumber)) \ | |
202 V(OtherNumber, 1u << 11 | REPRESENTATION(kTagged | kUntaggedNumber)) \ | |
203 V(Symbol, 1u << 12 | REPRESENTATION(kTaggedPointer)) \ | 205 V(Symbol, 1u << 12 | REPRESENTATION(kTaggedPointer)) \ |
204 V(InternalizedString, 1u << 13 | REPRESENTATION(kTaggedPointer)) \ | 206 V(InternalizedString, 1u << 13 | REPRESENTATION(kTaggedPointer)) \ |
205 V(OtherString, 1u << 14 | REPRESENTATION(kTaggedPointer)) \ | 207 V(OtherString, 1u << 14 | REPRESENTATION(kTaggedPointer)) \ |
206 V(Undetectable, 1u << 15 | REPRESENTATION(kTaggedPointer)) \ | 208 V(Undetectable, 1u << 15 | REPRESENTATION(kTaggedPointer)) \ |
207 V(Array, 1u << 16 | REPRESENTATION(kTaggedPointer)) \ | 209 V(Array, 1u << 16 | REPRESENTATION(kTaggedPointer)) \ |
208 V(OtherObject, 1u << 17 | REPRESENTATION(kTaggedPointer)) \ | 210 V(OtherObject, 1u << 17 | REPRESENTATION(kTaggedPointer)) \ |
209 V(Proxy, 1u << 18 | REPRESENTATION(kTaggedPointer)) \ | 211 V(Proxy, 1u << 18 | REPRESENTATION(kTaggedPointer)) \ |
210 V(Internal, 1u << 19 | REPRESENTATION(kTagged | kUntagged)) \ | 212 V(Internal, 1u << 19 | REPRESENTATION(kTagged | kUntagged)) \ |
211 \ | 213 \ |
212 V(SignedSmall, kUnsignedSmall | kOtherSignedSmall) \ | 214 V(SignedSmall, kUnsignedSmall | kNegativeSignedSmall) \ |
213 V(Signed32, kSignedSmall | kOtherUnsigned31 | kOtherSigned32) \ | 215 V(Signed32, kSignedSmall | kOtherUnsigned31 | kOtherSigned32) \ |
| 216 V(NegativeSigned32, kNegativeSignedSmall | kOtherSigned32) \ |
| 217 V(NonNegativeSigned32, kUnsignedSmall | kOtherUnsigned31) \ |
214 V(Unsigned32, kUnsignedSmall | kOtherUnsigned31 | kOtherUnsigned32) \ | 218 V(Unsigned32, kUnsignedSmall | kOtherUnsigned31 | kOtherUnsigned32) \ |
215 V(Integral32, kSigned32 | kUnsigned32) \ | 219 V(Integral32, kSigned32 | kUnsigned32) \ |
216 V(OrderedNumber, kIntegral32 | kMinusZero | kOtherNumber) \ | 220 V(PlainNumber, kIntegral32 | kOtherNumber) \ |
| 221 V(OrderedNumber, kPlainNumber | kMinusZero) \ |
217 V(Number, kOrderedNumber | kNaN) \ | 222 V(Number, kOrderedNumber | kNaN) \ |
218 V(String, kInternalizedString | kOtherString) \ | 223 V(String, kInternalizedString | kOtherString) \ |
219 V(UniqueName, kSymbol | kInternalizedString) \ | 224 V(UniqueName, kSymbol | kInternalizedString) \ |
220 V(Name, kSymbol | kString) \ | 225 V(Name, kSymbol | kString) \ |
221 V(NumberOrString, kNumber | kString) \ | 226 V(NumberOrString, kNumber | kString) \ |
222 V(PlainPrimitive, kNumberOrString | kBoolean | kNull | kUndefined) \ | 227 V(PlainPrimitive, kNumberOrString | kBoolean | kNull | kUndefined) \ |
223 V(Primitive, kSymbol | kPlainPrimitive) \ | 228 V(Primitive, kSymbol | kPlainPrimitive) \ |
224 V(DetectableObject, kArray | kOtherObject) \ | 229 V(DetectableObject, kArray | kOtherObject) \ |
225 V(DetectableReceiver, kDetectableObject | kProxy) \ | 230 V(DetectableReceiver, kDetectableObject | kProxy) \ |
226 V(Detectable, kDetectableReceiver | kNumber | kName) \ | 231 V(Detectable, kDetectableReceiver | kNumber | kName) \ |
227 V(Object, kDetectableObject | kUndetectable) \ | 232 V(Object, kDetectableObject | kUndetectable) \ |
228 V(Receiver, kObject | kProxy) \ | 233 V(Receiver, kObject | kProxy) \ |
229 V(Unique, kBoolean | kUniqueName | kNull | kUndefined | \ | 234 V(Unique, kBoolean | kUniqueName | kNull | kUndefined | \ |
230 kReceiver) \ | 235 kReceiver) \ |
231 V(NonNumber, kUnique | kString | kInternal) \ | 236 V(NonNumber, kUnique | kString | kInternal) \ |
232 V(Any, 0xfffffffeu) | 237 V(Any, 0xfffffffeu) |
233 | 238 |
| 239 |
234 /* | 240 /* |
235 * The following diagrams show how integers (in the mathematical sense) are | 241 * The following diagrams show how integers (in the mathematical sense) are |
236 * divided among the different atomic numerical types. | 242 * divided among the different atomic numerical types. |
237 * | 243 * |
238 * If SmiValuesAre31Bits(): | 244 * If SmiValuesAre31Bits(): |
239 * | 245 * |
240 * ON OS32 OSS US OU31 OU32 ON | 246 * ON OS32 OSS US OU31 OU32 ON |
241 * ______[_______[_______[_______[_______[_______[_______ | 247 * ______[_______[_______[_______[_______[_______[_______ |
242 * -2^31 -2^30 0 2^30 2^31 2^32 | 248 * -2^31 -2^30 0 2^30 2^31 2^32 |
243 * | 249 * |
244 * Otherwise: | 250 * Otherwise: |
245 * | 251 * |
246 * ON OSS US OU32 ON | 252 * ON OSS US OU32 ON |
247 * ______[_______________[_______________[_______[_______ | 253 * ______[_______________[_______________[_______[_______ |
248 * -2^31 0 2^31 2^32 | 254 * -2^31 0 2^31 2^32 |
249 * | 255 * |
250 * | 256 * |
251 * E.g., OtherUnsigned32 (OU32) covers all integers from 2^31 to 2^32-1. | 257 * E.g., OtherUnsigned32 (OU32) covers all integers from 2^31 to 2^32-1. |
252 * | 258 * |
253 * NOTE: OtherSigned32 (OS32) and OU31 (OtherUnsigned31) are empty if Smis are | 259 * NOTE: OtherSigned32 (OS32) and OU31 (OtherUnsigned31) are empty if Smis are |
254 * 32-bit wide. They should thus never be used directly, only indirectly | 260 * 32-bit wide. They should thus never be used directly, only indirectly |
255 * via e.g. Number. | 261 * via e.g. Number. |
256 */ | 262 */ |
257 | 263 |
258 #define PROPER_BITSET_TYPE_LIST(V) \ | 264 #define PROPER_BITSET_TYPE_LIST(V) \ |
259 REPRESENTATION_BITSET_TYPE_LIST(V) \ | 265 REPRESENTATION_BITSET_TYPE_LIST(V) \ |
260 SEMANTIC_BITSET_TYPE_LIST(V) | 266 SEMANTIC_BITSET_TYPE_LIST(V) |
261 | 267 |
262 #define BITSET_TYPE_LIST(V) \ | 268 #define BITSET_TYPE_LIST(V) \ |
263 MASK_BITSET_TYPE_LIST(V) \ | 269 MASK_BITSET_TYPE_LIST(V) \ |
264 PROPER_BITSET_TYPE_LIST(V) | 270 REPRESENTATION_BITSET_TYPE_LIST(V) \ |
| 271 INTERNAL_BITSET_TYPE_LIST(V) \ |
| 272 SEMANTIC_BITSET_TYPE_LIST(V) |
265 | 273 |
266 | 274 |
267 // ----------------------------------------------------------------------------- | 275 // ----------------------------------------------------------------------------- |
268 // The abstract Type class, parameterized over the low-level representation. | 276 // The abstract Type class, parameterized over the low-level representation. |
269 | 277 |
270 // struct Config { | 278 // struct Config { |
271 // typedef TypeImpl<Config> Type; | 279 // typedef TypeImpl<Config> Type; |
272 // typedef Base; | 280 // typedef Base; |
273 // typedef Struct; | 281 // typedef Struct; |
274 // typedef Region; | 282 // typedef Region; |
(...skipping 316 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
591 #define DECLARE_TYPE(type, value) k##type = (value), | 599 #define DECLARE_TYPE(type, value) k##type = (value), |
592 BITSET_TYPE_LIST(DECLARE_TYPE) | 600 BITSET_TYPE_LIST(DECLARE_TYPE) |
593 #undef DECLARE_TYPE | 601 #undef DECLARE_TYPE |
594 kUnusedEOL = 0 | 602 kUnusedEOL = 0 |
595 }; | 603 }; |
596 | 604 |
597 bitset Bitset() { return Config::as_bitset(this); } | 605 bitset Bitset() { return Config::as_bitset(this); } |
598 | 606 |
599 static TypeImpl* New(bitset bits) { | 607 static TypeImpl* New(bitset bits) { |
600 DCHECK(bits == kNone || IsInhabited(bits)); | 608 DCHECK(bits == kNone || IsInhabited(bits)); |
| 609 |
| 610 if (FLAG_enable_slow_asserts) { |
| 611 // Check that the bitset does not contain any holes in number ranges. |
| 612 bitset mask = kSemantic; |
| 613 if (!i::SmiValuesAre31Bits()) { |
| 614 mask &= ~(kOtherUnsigned31 | kOtherSigned32); |
| 615 } |
| 616 bitset number_bits = bits & kPlainNumber & mask; |
| 617 if (number_bits != 0) { |
| 618 bitset lub = Lub(Min(number_bits), Max(number_bits)) & mask; |
| 619 CHECK(lub == number_bits); |
| 620 } |
| 621 } |
| 622 |
601 return Config::from_bitset(bits); | 623 return Config::from_bitset(bits); |
602 } | 624 } |
603 static TypeHandle New(bitset bits, Region* region) { | 625 static TypeHandle New(bitset bits, Region* region) { |
604 DCHECK(bits == kNone || IsInhabited(bits)); | 626 DCHECK(bits == kNone || IsInhabited(bits)); |
605 return Config::from_bitset(bits, region); | 627 return Config::from_bitset(bits, region); |
606 } | 628 } |
607 // TODO(neis): Eventually allow again for types with empty semantics | 629 // TODO(neis): Eventually allow again for types with empty semantics |
608 // part and modify intersection and possibly subtyping accordingly. | 630 // part and modify intersection and possibly subtyping accordingly. |
609 | 631 |
610 static bool IsInhabited(bitset bits) { | 632 static bool IsInhabited(bitset bits) { |
(...skipping 459 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1070 bool Narrows(BoundsImpl that) { | 1092 bool Narrows(BoundsImpl that) { |
1071 return that.lower->Is(this->lower) && this->upper->Is(that.upper); | 1093 return that.lower->Is(this->lower) && this->upper->Is(that.upper); |
1072 } | 1094 } |
1073 }; | 1095 }; |
1074 | 1096 |
1075 typedef BoundsImpl<ZoneTypeConfig> Bounds; | 1097 typedef BoundsImpl<ZoneTypeConfig> Bounds; |
1076 | 1098 |
1077 } } // namespace v8::internal | 1099 } } // namespace v8::internal |
1078 | 1100 |
1079 #endif // V8_TYPES_H_ | 1101 #endif // V8_TYPES_H_ |
OLD | NEW |