| 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_COMPILER_TYPES_H_ |
| 6 #define V8_TYPES_H_ | 6 #define V8_COMPILER_TYPES_H_ |
| 7 | 7 |
| 8 #include "src/conversions.h" | 8 #include "src/conversions.h" |
| 9 #include "src/handles.h" | 9 #include "src/handles.h" |
| 10 #include "src/objects.h" | 10 #include "src/objects.h" |
| 11 #include "src/ostreams.h" | 11 #include "src/ostreams.h" |
| 12 | 12 |
| 13 namespace v8 { | 13 namespace v8 { |
| 14 namespace internal { | 14 namespace internal { |
| 15 namespace compiler { |
| 15 | 16 |
| 16 // SUMMARY | 17 // SUMMARY |
| 17 // | 18 // |
| 18 // A simple type system for compiler-internal use. It is based entirely on | 19 // A simple type system for compiler-internal use. It is based entirely on |
| 19 // union types, and all subtyping hence amounts to set inclusion. Besides the | 20 // union types, and all subtyping hence amounts to set inclusion. Besides the |
| 20 // obvious primitive types and some predefined unions, the type language also | 21 // obvious primitive types and some predefined unions, the type language also |
| 21 // can express class types (a.k.a. specific maps) and singleton types (i.e., | 22 // can express class types (a.k.a. specific maps) and singleton types (i.e., |
| 22 // concrete constants). | 23 // concrete constants). |
| 23 // | 24 // |
| 24 // Types consist of two dimensions: semantic (value range) and representation. | 25 // Types consist of two dimensions: semantic (value range) and representation. |
| (...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 235 * -2^31 -2^30 0 2^30 2^31 2^32 | 236 * -2^31 -2^30 0 2^30 2^31 2^32 |
| 236 * | 237 * |
| 237 * E.g., OtherUnsigned32 (OU32) covers all integers from 2^31 to 2^32-1. | 238 * E.g., OtherUnsigned32 (OU32) covers all integers from 2^31 to 2^32-1. |
| 238 * | 239 * |
| 239 * Some of the atomic numerical bitsets are internal only (see | 240 * Some of the atomic numerical bitsets are internal only (see |
| 240 * INTERNAL_BITSET_TYPE_LIST). To a types user, they should only occur in | 241 * INTERNAL_BITSET_TYPE_LIST). To a types user, they should only occur in |
| 241 * union with certain other bitsets. For instance, OtherNumber should only | 242 * union with certain other bitsets. For instance, OtherNumber should only |
| 242 * occur as part of PlainNumber. | 243 * occur as part of PlainNumber. |
| 243 */ | 244 */ |
| 244 | 245 |
| 245 #define PROPER_BITSET_TYPE_LIST(V) \ | 246 #define PROPER_BITSET_TYPE_LIST(V) \ |
| 246 REPRESENTATION_BITSET_TYPE_LIST(V) \ | 247 REPRESENTATION_BITSET_TYPE_LIST(V) \ |
| 247 SEMANTIC_BITSET_TYPE_LIST(V) | 248 SEMANTIC_BITSET_TYPE_LIST(V) |
| 248 | 249 |
| 249 #define BITSET_TYPE_LIST(V) \ | 250 #define BITSET_TYPE_LIST(V) \ |
| 250 MASK_BITSET_TYPE_LIST(V) \ | 251 MASK_BITSET_TYPE_LIST(V) \ |
| 251 REPRESENTATION_BITSET_TYPE_LIST(V) \ | 252 REPRESENTATION_BITSET_TYPE_LIST(V) \ |
| 252 INTERNAL_BITSET_TYPE_LIST(V) \ | 253 INTERNAL_BITSET_TYPE_LIST(V) \ |
| 253 SEMANTIC_BITSET_TYPE_LIST(V) | 254 SEMANTIC_BITSET_TYPE_LIST(V) |
| 254 | 255 |
| 255 class Type; | 256 class Type; |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 329 static inline const Boundary* Boundaries(); | 330 static inline const Boundary* Boundaries(); |
| 330 static inline size_t BoundariesSize(); | 331 static inline size_t BoundariesSize(); |
| 331 }; | 332 }; |
| 332 | 333 |
| 333 // ----------------------------------------------------------------------------- | 334 // ----------------------------------------------------------------------------- |
| 334 // Superclass for non-bitset types (internal). | 335 // Superclass for non-bitset types (internal). |
| 335 class TypeBase { | 336 class TypeBase { |
| 336 protected: | 337 protected: |
| 337 friend class Type; | 338 friend class Type; |
| 338 | 339 |
| 339 enum Kind { | 340 enum Kind { kConstant, kTuple, kUnion, kRange }; |
| 340 kConstant, | |
| 341 kTuple, | |
| 342 kUnion, | |
| 343 kRange | |
| 344 }; | |
| 345 | 341 |
| 346 Kind kind() const { return kind_; } | 342 Kind kind() const { return kind_; } |
| 347 explicit TypeBase(Kind kind) : kind_(kind) {} | 343 explicit TypeBase(Kind kind) : kind_(kind) {} |
| 348 | 344 |
| 349 static bool IsKind(Type* type, Kind kind) { | 345 static bool IsKind(Type* type, Kind kind) { |
| 350 if (BitsetType::IsBitset(type)) return false; | 346 if (BitsetType::IsBitset(type)) return false; |
| 351 TypeBase* base = reinterpret_cast<TypeBase*>(type); | 347 TypeBase* base = reinterpret_cast<TypeBase*>(type); |
| 352 return base->kind() == kind; | 348 return base->kind() == kind; |
| 353 } | 349 } |
| 354 | 350 |
| (...skipping 414 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 769 Type* upper = Type::Intersect(b.upper, t, zone); | 765 Type* upper = Type::Intersect(b.upper, t, zone); |
| 770 // Lower bounds are considered approximate, correct as necessary. | 766 // Lower bounds are considered approximate, correct as necessary. |
| 771 if (!lower->Is(upper)) lower = upper; | 767 if (!lower->Is(upper)) lower = upper; |
| 772 return Bounds(lower, upper); | 768 return Bounds(lower, upper); |
| 773 } | 769 } |
| 774 | 770 |
| 775 bool Narrows(Bounds that) { | 771 bool Narrows(Bounds that) { |
| 776 return that.lower->Is(this->lower) && this->upper->Is(that.upper); | 772 return that.lower->Is(this->lower) && this->upper->Is(that.upper); |
| 777 } | 773 } |
| 778 }; | 774 }; |
| 775 } // namespace compiler |
| 779 } // namespace internal | 776 } // namespace internal |
| 780 } // namespace v8 | 777 } // namespace v8 |
| 781 | 778 |
| 782 #endif // V8_TYPES_H_ | 779 #endif // V8_COMPILER_TYPES_H_ |
| OLD | NEW |