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_COMPILER_TYPES_H_ | 5 #ifndef V8_COMPILER_TYPES_H_ |
6 #define V8_COMPILER_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" |
(...skipping 703 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
714 | 714 |
715 bool SimplyEquals(Type* that); | 715 bool SimplyEquals(Type* that); |
716 | 716 |
717 static int AddToUnion(Type* type, UnionType* result, int size, Zone* zone); | 717 static int AddToUnion(Type* type, UnionType* result, int size, Zone* zone); |
718 static int IntersectAux(Type* type, Type* other, UnionType* result, int size, | 718 static int IntersectAux(Type* type, Type* other, UnionType* result, int size, |
719 RangeType::Limits* limits, Zone* zone); | 719 RangeType::Limits* limits, Zone* zone); |
720 static Type* NormalizeUnion(Type* unioned, int size, Zone* zone); | 720 static Type* NormalizeUnion(Type* unioned, int size, Zone* zone); |
721 static Type* NormalizeRangeAndBitset(Type* range, bitset* bits, Zone* zone); | 721 static Type* NormalizeRangeAndBitset(Type* range, bitset* bits, Zone* zone); |
722 }; | 722 }; |
723 | 723 |
724 // ----------------------------------------------------------------------------- | |
725 // Type bounds. A simple struct to represent a pair of lower/upper types. | |
726 | |
727 struct Bounds { | |
728 Type* lower; | |
729 Type* upper; | |
730 | |
731 Bounds() | |
732 : // Make sure accessing uninitialized bounds crashes big-time. | |
733 lower(nullptr), | |
734 upper(nullptr) {} | |
735 explicit Bounds(Type* t) : lower(t), upper(t) {} | |
736 Bounds(Type* l, Type* u) : lower(l), upper(u) { DCHECK(lower->Is(upper)); } | |
737 | |
738 // Unrestricted bounds. | |
739 static Bounds Unbounded() { return Bounds(Type::None(), Type::Any()); } | |
740 | |
741 // Meet: both b1 and b2 are known to hold. | |
742 static Bounds Both(Bounds b1, Bounds b2, Zone* zone) { | |
743 Type* lower = Type::Union(b1.lower, b2.lower, zone); | |
744 Type* upper = Type::Intersect(b1.upper, b2.upper, zone); | |
745 // Lower bounds are considered approximate, correct as necessary. | |
746 if (!lower->Is(upper)) lower = upper; | |
747 return Bounds(lower, upper); | |
748 } | |
749 | |
750 // Join: either b1 or b2 is known to hold. | |
751 static Bounds Either(Bounds b1, Bounds b2, Zone* zone) { | |
752 Type* lower = Type::Intersect(b1.lower, b2.lower, zone); | |
753 Type* upper = Type::Union(b1.upper, b2.upper, zone); | |
754 return Bounds(lower, upper); | |
755 } | |
756 | |
757 static Bounds NarrowLower(Bounds b, Type* t, Zone* zone) { | |
758 Type* lower = Type::Union(b.lower, t, zone); | |
759 // Lower bounds are considered approximate, correct as necessary. | |
760 if (!lower->Is(b.upper)) lower = b.upper; | |
761 return Bounds(lower, b.upper); | |
762 } | |
763 static Bounds NarrowUpper(Bounds b, Type* t, Zone* zone) { | |
764 Type* lower = b.lower; | |
765 Type* upper = Type::Intersect(b.upper, t, zone); | |
766 // Lower bounds are considered approximate, correct as necessary. | |
767 if (!lower->Is(upper)) lower = upper; | |
768 return Bounds(lower, upper); | |
769 } | |
770 | |
771 bool Narrows(Bounds that) { | |
772 return that.lower->Is(this->lower) && this->upper->Is(that.upper); | |
773 } | |
774 }; | |
775 } // namespace compiler | 724 } // namespace compiler |
776 } // namespace internal | 725 } // namespace internal |
777 } // namespace v8 | 726 } // namespace v8 |
778 | 727 |
779 #endif // V8_COMPILER_TYPES_H_ | 728 #endif // V8_COMPILER_TYPES_H_ |
OLD | NEW |