| Index: src/types.h
|
| diff --git a/src/types.h b/src/types.h
|
| index f4cc1f992bd5da4d0eeef0a963cf36ebba8d2b86..3acd5cc842db8e5d451756a5d28c4e7304db6b12 100644
|
| --- a/src/types.h
|
| +++ b/src/types.h
|
| @@ -257,6 +257,11 @@ namespace internal {
|
| * -2^31 -2^30 0 2^30 2^31 2^32
|
| *
|
| * E.g., OtherUnsigned32 (OU32) covers all integers from 2^31 to 2^32-1.
|
| + *
|
| + * Some of the atomic numerical bitsets are internal only (see
|
| + * INTERNAL_BITSET_TYPE_LIST). To a types user, they should only occur in
|
| + * union with certain other bitsets. For instance, OtherNumber should only
|
| + * occur as part of PlainNumber.
|
| */
|
|
|
| #define PROPER_BITSET_TYPE_LIST(V) \
|
| @@ -436,10 +441,12 @@ class TypeImpl : public Config::Base {
|
| static TypeHandle Intersect(TypeHandle type1, TypeHandle type2, Region* reg);
|
|
|
| static TypeHandle Of(double value, Region* region) {
|
| - return Config::from_bitset(BitsetType::Lub(value), region);
|
| + return Config::from_bitset(BitsetType::ExpandInternals(
|
| + BitsetType::Lub(value)), region);
|
| }
|
| static TypeHandle Of(i::Object* value, Region* region) {
|
| - return Config::from_bitset(BitsetType::Lub(value), region);
|
| + return Config::from_bitset(BitsetType::ExpandInternals(
|
| + BitsetType::Lub(value)), region);
|
| }
|
| static TypeHandle Of(i::Handle<i::Object> value, Region* region) {
|
| return Of(*value, region);
|
| @@ -657,11 +664,9 @@ class TypeImpl<Config>::BitsetType : public TypeImpl<Config> {
|
| bitset Bitset() { return Config::as_bitset(this); }
|
|
|
| static TypeImpl* New(bitset bits) {
|
| - if (FLAG_enable_slow_asserts) CheckNumberBits(bits);
|
| return Config::from_bitset(bits);
|
| }
|
| static TypeHandle New(bitset bits, Region* region) {
|
| - if (FLAG_enable_slow_asserts) CheckNumberBits(bits);
|
| return Config::from_bitset(bits, region);
|
| }
|
|
|
| @@ -687,6 +692,7 @@ class TypeImpl<Config>::BitsetType : public TypeImpl<Config> {
|
| static bitset Lub(i::Object* value);
|
| static bitset Lub(double value);
|
| static bitset Lub(double min, double max);
|
| + static bitset ExpandInternals(bitset bits);
|
|
|
| static const char* Name(bitset);
|
| static void Print(std::ostream& os, bitset); // NOLINT
|
| @@ -698,14 +704,13 @@ class TypeImpl<Config>::BitsetType : public TypeImpl<Config> {
|
|
|
| private:
|
| struct Boundary {
|
| - bitset bits;
|
| + bitset internal;
|
| + bitset external;
|
| double min;
|
| };
|
| static const Boundary BoundariesArray[];
|
| static inline const Boundary* Boundaries();
|
| static inline size_t BoundariesSize();
|
| -
|
| - static void CheckNumberBits(bitset bits);
|
| };
|
|
|
|
|
| @@ -790,11 +795,6 @@ class TypeImpl<Config>::UnionType : public StructuralType {
|
| template<class Config>
|
| class TypeImpl<Config>::ClassType : public StructuralType {
|
| public:
|
| - TypeHandle Bound(Region* region) {
|
| - return Config::is_class(this) ?
|
| - BitsetType::New(BitsetType::Lub(*Config::as_class(this)), region) :
|
| - this->Get(0);
|
| - }
|
| i::Handle<i::Map> Map() {
|
| return Config::is_class(this) ? Config::as_class(this) :
|
| this->template GetValue<i::Map>(1);
|
| @@ -816,6 +816,14 @@ class TypeImpl<Config>::ClassType : public StructuralType {
|
| DCHECK(type->IsClass());
|
| return static_cast<ClassType*>(type);
|
| }
|
| +
|
| + private:
|
| + template<class> friend class TypeImpl;
|
| + bitset Lub() {
|
| + return Config::is_class(this) ?
|
| + BitsetType::Lub(*Config::as_class(this)) :
|
| + this->Get(0)->AsBitset();
|
| + }
|
| };
|
|
|
|
|
| @@ -825,7 +833,6 @@ class TypeImpl<Config>::ClassType : public StructuralType {
|
| template<class Config>
|
| class TypeImpl<Config>::ConstantType : public StructuralType {
|
| public:
|
| - TypeHandle Bound() { return this->Get(0); }
|
| i::Handle<i::Object> Value() { return this->template GetValue<i::Object>(1); }
|
|
|
| static ConstantHandle New(i::Handle<i::Object> value, Region* region) {
|
| @@ -840,6 +847,10 @@ class TypeImpl<Config>::ConstantType : public StructuralType {
|
| DCHECK(type->IsConstant());
|
| return static_cast<ConstantType*>(type);
|
| }
|
| +
|
| + private:
|
| + template<class> friend class TypeImpl;
|
| + bitset Lub() { return this->Get(0)->AsBitset(); }
|
| };
|
| // TODO(neis): Also cache value if numerical.
|
| // TODO(neis): Allow restricting the representation.
|
| @@ -851,7 +862,6 @@ class TypeImpl<Config>::ConstantType : public StructuralType {
|
| template <class Config>
|
| class TypeImpl<Config>::RangeType : public TypeImpl<Config> {
|
| public:
|
| - bitset Bound() { return Config::range_get_bitset(Config::as_range(this)); }
|
| double Min() { return Config::range_get_double(Config::as_range(this), 0); }
|
| double Max() { return Config::range_get_double(Config::as_range(this), 1); }
|
|
|
| @@ -881,8 +891,13 @@ class TypeImpl<Config>::RangeType : public TypeImpl<Config> {
|
| DCHECK(type->IsRange());
|
| return static_cast<RangeType*>(type);
|
| }
|
| +
|
| + private:
|
| + template<class> friend class TypeImpl;
|
| + bitset Lub() {
|
| + return Config::range_get_bitset(Config::as_range(this));
|
| + }
|
| };
|
| -// TODO(neis): Also cache min and max values.
|
|
|
|
|
| // -----------------------------------------------------------------------------
|
|
|