| Index: src/compiler/types.h
|
| diff --git a/src/compiler/types.h b/src/compiler/types.h
|
| index ef5bec3f9de63ac179b3526a7499895179e9405a..9b49f6430eded06a560d711ddc7af24dc70d6870 100644
|
| --- a/src/compiler/types.h
|
| +++ b/src/compiler/types.h
|
| @@ -263,7 +263,7 @@ class TypeBase {
|
| protected:
|
| friend class Type;
|
|
|
| - enum Kind { kConstant, kTuple, kUnion, kRange };
|
| + enum Kind { kHeapConstant, kOtherNumberConstant, kTuple, kUnion, kRange };
|
|
|
| Kind kind() const { return kind_; }
|
| explicit TypeBase(Kind kind) : kind_(kind) {}
|
| @@ -287,7 +287,38 @@ class TypeBase {
|
| // -----------------------------------------------------------------------------
|
| // Constant types.
|
|
|
| -class ConstantType : public TypeBase {
|
| +class OtherNumberConstantType : public TypeBase {
|
| + public:
|
| + double Value() { return value_; }
|
| +
|
| + static bool IsOtherNumberConstant(double value);
|
| + static bool IsOtherNumberConstant(Object* value);
|
| +
|
| + private:
|
| + friend class Type;
|
| + friend class BitsetType;
|
| +
|
| + static Type* New(double value, Zone* zone) {
|
| + return AsType(new (zone->New(sizeof(OtherNumberConstantType)))
|
| + OtherNumberConstantType(value)); // NOLINT
|
| + }
|
| +
|
| + static OtherNumberConstantType* cast(Type* type) {
|
| + DCHECK(IsKind(type, kOtherNumberConstant));
|
| + return static_cast<OtherNumberConstantType*>(FromType(type));
|
| + }
|
| +
|
| + explicit OtherNumberConstantType(double value)
|
| + : TypeBase(kOtherNumberConstant), value_(value) {
|
| + CHECK(IsOtherNumberConstant(value));
|
| + }
|
| +
|
| + BitsetType::bitset Lub() { return BitsetType::kOtherNumber; }
|
| +
|
| + double value_;
|
| +};
|
| +
|
| +class HeapConstantType : public TypeBase {
|
| public:
|
| i::Handle<i::Object> Value() { return object_; }
|
|
|
| @@ -297,24 +328,22 @@ class ConstantType : public TypeBase {
|
|
|
| static Type* New(i::Handle<i::Object> value, Zone* zone) {
|
| BitsetType::bitset bitset = BitsetType::Lub(*value);
|
| - return AsType(new (zone->New(sizeof(ConstantType)))
|
| - ConstantType(bitset, value));
|
| + return AsType(new (zone->New(sizeof(HeapConstantType)))
|
| + HeapConstantType(bitset, value));
|
| }
|
|
|
| - static ConstantType* cast(Type* type) {
|
| - DCHECK(IsKind(type, kConstant));
|
| - return static_cast<ConstantType*>(FromType(type));
|
| + static HeapConstantType* cast(Type* type) {
|
| + DCHECK(IsKind(type, kHeapConstant));
|
| + return static_cast<HeapConstantType*>(FromType(type));
|
| }
|
|
|
| - ConstantType(BitsetType::bitset bitset, i::Handle<i::Object> object)
|
| - : TypeBase(kConstant), bitset_(bitset), object_(object) {}
|
| + HeapConstantType(BitsetType::bitset bitset, i::Handle<i::Object> object);
|
|
|
| BitsetType::bitset Lub() { return bitset_; }
|
|
|
| BitsetType::bitset bitset_;
|
| Handle<i::Object> object_;
|
| };
|
| -// TODO(neis): Also cache value if numerical.
|
|
|
| // -----------------------------------------------------------------------------
|
| // Range types.
|
| @@ -474,8 +503,11 @@ class Type {
|
| return BitsetType::New(BitsetType::UnsignedSmall());
|
| }
|
|
|
| - static Type* Constant(i::Handle<i::Object> value, Zone* zone) {
|
| - return ConstantType::New(value, zone);
|
| + static Type* OtherNumberConstant(double value, Zone* zone) {
|
| + return OtherNumberConstantType::New(value, zone);
|
| + }
|
| + static Type* HeapConstant(i::Handle<i::Object> value, Zone* zone) {
|
| + return HeapConstantType::New(value, zone);
|
| }
|
| static Type* Range(double min, double max, Zone* zone) {
|
| return RangeType::New(min, max, zone);
|
| @@ -488,6 +520,10 @@ class Type {
|
| return tuple;
|
| }
|
|
|
| + // NewConstant is a factory that returns Constant, Range or Number.
|
| + static Type* NewConstant(i::Handle<i::Object> value, Zone* zone);
|
| + static Type* NewConstant(double value, Zone* zone);
|
| +
|
| static Type* Union(Type* type1, Type* type2, Zone* zone);
|
| static Type* Intersect(Type* type1, Type* type2, Zone* zone);
|
|
|
| @@ -515,10 +551,16 @@ class Type {
|
|
|
| // Inspection.
|
| bool IsRange() { return IsKind(TypeBase::kRange); }
|
| - bool IsConstant() { return IsKind(TypeBase::kConstant); }
|
| + bool IsHeapConstant() { return IsKind(TypeBase::kHeapConstant); }
|
| + bool IsOtherNumberConstant() {
|
| + return IsKind(TypeBase::kOtherNumberConstant);
|
| + }
|
| bool IsTuple() { return IsKind(TypeBase::kTuple); }
|
|
|
| - ConstantType* AsConstant() { return ConstantType::cast(this); }
|
| + HeapConstantType* AsHeapConstant() { return HeapConstantType::cast(this); }
|
| + OtherNumberConstantType* AsOtherNumberConstant() {
|
| + return OtherNumberConstantType::cast(this);
|
| + }
|
| RangeType* AsRange() { return RangeType::cast(this); }
|
| TupleType* AsTuple() { return TupleType::cast(this); }
|
|
|
| @@ -582,7 +624,6 @@ class Type {
|
|
|
| static bool Overlap(RangeType* lhs, RangeType* rhs);
|
| static bool Contains(RangeType* lhs, RangeType* rhs);
|
| - static bool Contains(RangeType* range, ConstantType* constant);
|
| static bool Contains(RangeType* range, i::Object* val);
|
|
|
| static int UpdateRange(Type* type, UnionType* result, int size, Zone* zone);
|
|
|