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/handles.h" | 9 #include "src/handles.h" |
10 #include "src/objects.h" | 10 #include "src/objects.h" |
(...skipping 30 matching lines...) Expand all Loading... |
41 // Receiver = Object \/ Proxy | 41 // Receiver = Object \/ Proxy |
42 // Array < Object | 42 // Array < Object |
43 // Function < Object | 43 // Function < Object |
44 // RegExp < Object | 44 // RegExp < Object |
45 // OtherUndetectable < Object | 45 // OtherUndetectable < Object |
46 // DetectableReceiver = Receiver - OtherUndetectable | 46 // DetectableReceiver = Receiver - OtherUndetectable |
47 // | 47 // |
48 // Constant(x) < T iff instance_type(map(x)) < T | 48 // Constant(x) < T iff instance_type(map(x)) < T |
49 // Array(T) < Array | 49 // Array(T) < Array |
50 // Function(R, S, T0, T1, ...) < Function | 50 // Function(R, S, T0, T1, ...) < Function |
51 // Context(T) < Internal | |
52 // | 51 // |
53 // Both structural Array and Function types are invariant in all parameters; | 52 // Both structural Array and Function types are invariant in all parameters; |
54 // relaxing this would make Union and Intersect operations more involved. | 53 // relaxing this would make Union and Intersect operations more involved. |
55 // There is no subtyping relation between Array, Function, or Context types | 54 // There is no subtyping relation between Array or Function types and |
56 // and respective Constant types, since these types cannot be reconstructed | 55 // respective Constant types, since these types cannot be reconstructed |
57 // for arbitrary heap values. | 56 // for arbitrary heap values. |
58 // | 57 // |
59 // | 58 // |
60 // REPRESENTATIONAL DIMENSION | 59 // REPRESENTATIONAL DIMENSION |
61 // | 60 // |
62 // For the representation axis, the following holds: | 61 // For the representation axis, the following holds: |
63 // | 62 // |
64 // None <= R | 63 // None <= R |
65 // R <= Any | 64 // R <= Any |
66 // | 65 // |
(...skipping 275 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
342 }; | 341 }; |
343 | 342 |
344 // ----------------------------------------------------------------------------- | 343 // ----------------------------------------------------------------------------- |
345 // Superclass for non-bitset types (internal). | 344 // Superclass for non-bitset types (internal). |
346 class TypeBase { | 345 class TypeBase { |
347 protected: | 346 protected: |
348 friend class Type; | 347 friend class Type; |
349 | 348 |
350 enum Kind { | 349 enum Kind { |
351 kConstant, | 350 kConstant, |
352 kContext, | |
353 kArray, | 351 kArray, |
354 kFunction, | 352 kFunction, |
355 kTuple, | 353 kTuple, |
356 kUnion, | 354 kUnion, |
357 kRange | 355 kRange |
358 }; | 356 }; |
359 | 357 |
360 Kind kind() const { return kind_; } | 358 Kind kind() const { return kind_; } |
361 explicit TypeBase(Kind kind) : kind_(kind) {} | 359 explicit TypeBase(Kind kind) : kind_(kind) {} |
362 | 360 |
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
460 RangeType(BitsetType::bitset bitset, Limits limits) | 458 RangeType(BitsetType::bitset bitset, Limits limits) |
461 : TypeBase(kRange), bitset_(bitset), limits_(limits) {} | 459 : TypeBase(kRange), bitset_(bitset), limits_(limits) {} |
462 | 460 |
463 BitsetType::bitset Lub() { return bitset_; } | 461 BitsetType::bitset Lub() { return bitset_; } |
464 | 462 |
465 BitsetType::bitset bitset_; | 463 BitsetType::bitset bitset_; |
466 Limits limits_; | 464 Limits limits_; |
467 }; | 465 }; |
468 | 466 |
469 // ----------------------------------------------------------------------------- | 467 // ----------------------------------------------------------------------------- |
470 // Context types. | |
471 | |
472 class ContextType : public TypeBase { | |
473 public: | |
474 Type* Outer() { return outer_; } | |
475 | |
476 private: | |
477 friend class Type; | |
478 | |
479 static Type* New(Type* outer, Zone* zone) { | |
480 return AsType(new (zone->New(sizeof(ContextType))) ContextType(outer)); | |
481 } | |
482 | |
483 static ContextType* cast(Type* type) { | |
484 DCHECK(IsKind(type, kContext)); | |
485 return static_cast<ContextType*>(FromType(type)); | |
486 } | |
487 | |
488 explicit ContextType(Type* outer) : TypeBase(kContext), outer_(outer) {} | |
489 | |
490 Type* outer_; | |
491 }; | |
492 | |
493 // ----------------------------------------------------------------------------- | |
494 // Array types. | 468 // Array types. |
495 | 469 |
496 class ArrayType : public TypeBase { | 470 class ArrayType : public TypeBase { |
497 public: | 471 public: |
498 Type* Element() { return element_; } | 472 Type* Element() { return element_; } |
499 | 473 |
500 private: | 474 private: |
501 friend class Type; | 475 friend class Type; |
502 | 476 |
503 explicit ArrayType(Type* element) : TypeBase(kArray), element_(element) {} | 477 explicit ArrayType(Type* element) : TypeBase(kArray), element_(element) {} |
(...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
651 } | 625 } |
652 | 626 |
653 static Type* Constant(i::Handle<i::Object> value, Zone* zone) { | 627 static Type* Constant(i::Handle<i::Object> value, Zone* zone) { |
654 return ConstantType::New(value, zone); | 628 return ConstantType::New(value, zone); |
655 } | 629 } |
656 static Type* Range(double min, double max, Zone* zone) { | 630 static Type* Range(double min, double max, Zone* zone) { |
657 return RangeType::New(min, max, REPRESENTATION(BitsetType::kTagged | | 631 return RangeType::New(min, max, REPRESENTATION(BitsetType::kTagged | |
658 BitsetType::kUntaggedNumber), | 632 BitsetType::kUntaggedNumber), |
659 zone); | 633 zone); |
660 } | 634 } |
661 static Type* Context(Type* outer, Zone* zone) { | |
662 return ContextType::New(outer, zone); | |
663 } | |
664 static Type* Array(Type* element, Zone* zone) { | 635 static Type* Array(Type* element, Zone* zone) { |
665 return ArrayType::New(element, zone); | 636 return ArrayType::New(element, zone); |
666 } | 637 } |
667 static Type* Function(Type* result, Type* receiver, int arity, Zone* zone) { | 638 static Type* Function(Type* result, Type* receiver, int arity, Zone* zone) { |
668 return FunctionType::New(result, receiver, arity, zone); | 639 return FunctionType::New(result, receiver, arity, zone); |
669 } | 640 } |
670 static Type* Function(Type* result, Zone* zone) { | 641 static Type* Function(Type* result, Zone* zone) { |
671 return Function(result, Any(), 0, zone); | 642 return Function(result, Any(), 0, zone); |
672 } | 643 } |
673 static Type* Function(Type* result, Type* param0, Zone* zone) { | 644 static Type* Function(Type* result, Type* param0, Zone* zone) { |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
733 bool Maybe(Type* that); | 704 bool Maybe(Type* that); |
734 bool Equals(Type* that) { return this->Is(that) && that->Is(this); } | 705 bool Equals(Type* that) { return this->Is(that) && that->Is(this); } |
735 | 706 |
736 // Equivalent to Constant(val)->Is(this), but avoiding allocation. | 707 // Equivalent to Constant(val)->Is(this), but avoiding allocation. |
737 bool Contains(i::Object* val); | 708 bool Contains(i::Object* val); |
738 bool Contains(i::Handle<i::Object> val) { return this->Contains(*val); } | 709 bool Contains(i::Handle<i::Object> val) { return this->Contains(*val); } |
739 | 710 |
740 // Inspection. | 711 // Inspection. |
741 bool IsRange() { return IsKind(TypeBase::kRange); } | 712 bool IsRange() { return IsKind(TypeBase::kRange); } |
742 bool IsConstant() { return IsKind(TypeBase::kConstant); } | 713 bool IsConstant() { return IsKind(TypeBase::kConstant); } |
743 bool IsContext() { return IsKind(TypeBase::kContext); } | |
744 bool IsArray() { return IsKind(TypeBase::kArray); } | 714 bool IsArray() { return IsKind(TypeBase::kArray); } |
745 bool IsFunction() { return IsKind(TypeBase::kFunction); } | 715 bool IsFunction() { return IsKind(TypeBase::kFunction); } |
746 bool IsTuple() { return IsKind(TypeBase::kTuple); } | 716 bool IsTuple() { return IsKind(TypeBase::kTuple); } |
747 | 717 |
748 ConstantType* AsConstant() { return ConstantType::cast(this); } | 718 ConstantType* AsConstant() { return ConstantType::cast(this); } |
749 RangeType* AsRange() { return RangeType::cast(this); } | 719 RangeType* AsRange() { return RangeType::cast(this); } |
750 ContextType* AsContext() { return ContextType::cast(this); } | |
751 ArrayType* AsArray() { return ArrayType::cast(this); } | 720 ArrayType* AsArray() { return ArrayType::cast(this); } |
752 FunctionType* AsFunction() { return FunctionType::cast(this); } | 721 FunctionType* AsFunction() { return FunctionType::cast(this); } |
753 TupleType* AsTuple() { return TupleType::cast(this); } | 722 TupleType* AsTuple() { return TupleType::cast(this); } |
754 | 723 |
755 // Minimum and maximum of a numeric type. | 724 // Minimum and maximum of a numeric type. |
756 // These functions do not distinguish between -0 and +0. If the type equals | 725 // These functions do not distinguish between -0 and +0. If the type equals |
757 // kNaN, they return NaN; otherwise kNaN is ignored. Only call these | 726 // kNaN, they return NaN; otherwise kNaN is ignored. Only call these |
758 // functions on subtypes of Number. | 727 // functions on subtypes of Number. |
759 double Min(); | 728 double Min(); |
760 double Max(); | 729 double Max(); |
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
911 } | 880 } |
912 | 881 |
913 bool Narrows(Bounds that) { | 882 bool Narrows(Bounds that) { |
914 return that.lower->Is(this->lower) && this->upper->Is(that.upper); | 883 return that.lower->Is(this->lower) && this->upper->Is(that.upper); |
915 } | 884 } |
916 }; | 885 }; |
917 } // namespace internal | 886 } // namespace internal |
918 } // namespace v8 | 887 } // namespace v8 |
919 | 888 |
920 #endif // V8_TYPES_H_ | 889 #endif // V8_TYPES_H_ |
OLD | NEW |