Index: src/types.cc |
diff --git a/src/types.cc b/src/types.cc |
index c2d4eaa5b7b6a24e75ebd9b4283c124eee4584f1..3413d34a8b1e103316c98b7008a91c36f909f453 100644 |
--- a/src/types.cc |
+++ b/src/types.cc |
@@ -26,8 +26,8 @@ typename TypeImpl<Config>::Limits TypeImpl<Config>::Intersect( |
Limits lhs, Limits rhs) { |
DisallowHeapAllocation no_allocation; |
Limits result(lhs); |
- if (lhs.min->Number() < rhs.min->Number()) result.min = rhs.min; |
- if (lhs.max->Number() > rhs.max->Number()) result.max = rhs.max; |
+ if (lhs.min < rhs.min) result.min = rhs.min; |
+ if (lhs.max > rhs.max) result.max = rhs.max; |
result.representation = lhs.representation & rhs.representation; |
return result; |
} |
@@ -35,7 +35,7 @@ typename TypeImpl<Config>::Limits TypeImpl<Config>::Intersect( |
template <class Config> |
bool TypeImpl<Config>::IsEmpty(Limits lim) { |
- return lim.min->Number() > lim.max->Number(); |
+ return lim.min > lim.max; |
} |
@@ -44,8 +44,8 @@ typename TypeImpl<Config>::Limits TypeImpl<Config>::Union(Limits lhs, |
Limits rhs) { |
DisallowHeapAllocation no_allocation; |
Limits result(lhs); |
- if (lhs.min->Number() > rhs.min->Number()) result.min = rhs.min; |
- if (lhs.max->Number() < rhs.max->Number()) result.max = rhs.max; |
+ if (lhs.min > rhs.min) result.min = rhs.min; |
+ if (lhs.max < rhs.max) result.max = rhs.max; |
result.representation = lhs.representation | rhs.representation; |
return result; |
} |
@@ -57,7 +57,7 @@ bool TypeImpl<Config>::Overlap( |
typename TypeImpl<Config>::RangeType* rhs) { |
DisallowHeapAllocation no_allocation; |
typename TypeImpl<Config>::Limits lim = Intersect(Limits(lhs), Limits(rhs)); |
- return lim.min->Number() <= lim.max->Number(); |
+ return lim.min <= lim.max; |
} |
@@ -66,9 +66,8 @@ bool TypeImpl<Config>::Contains( |
typename TypeImpl<Config>::RangeType* lhs, |
typename TypeImpl<Config>::RangeType* rhs) { |
DisallowHeapAllocation no_allocation; |
- return rhs->Bound()->Is(lhs->Bound()) && |
- lhs->Min()->Number() <= rhs->Min()->Number() && |
- rhs->Max()->Number() <= lhs->Max()->Number(); |
+ return BitsetType::Is(rhs->Bound(), lhs->Bound()) && |
+ lhs->Min() <= rhs->Min() && rhs->Max() <= lhs->Max(); |
} |
@@ -76,9 +75,10 @@ template <class Config> |
bool TypeImpl<Config>::Contains(typename TypeImpl<Config>::RangeType* lhs, |
typename TypeImpl<Config>::ConstantType* rhs) { |
DisallowHeapAllocation no_allocation; |
- return IsInteger(*rhs->Value()) && rhs->Bound()->Is(lhs->Bound()) && |
- lhs->Min()->Number() <= rhs->Value()->Number() && |
- rhs->Value()->Number() <= lhs->Max()->Number(); |
+ return IsInteger(*rhs->Value()) && |
+ BitsetType::Is(rhs->Bound()->AsBitset(), lhs->Bound()) && |
+ lhs->Min() <= rhs->Value()->Number() && |
+ rhs->Value()->Number() <= lhs->Max(); |
} |
@@ -87,9 +87,8 @@ bool TypeImpl<Config>::Contains( |
typename TypeImpl<Config>::RangeType* range, i::Object* val) { |
DisallowHeapAllocation no_allocation; |
return IsInteger(val) && |
- BitsetType::Is(BitsetType::Lub(val), range->Bound()->AsBitset()) && |
- range->Min()->Number() <= val->Number() && |
- val->Number() <= range->Max()->Number(); |
+ BitsetType::Is(BitsetType::Lub(val), range->Bound()) && |
+ range->Min() <= val->Number() && val->Number() <= range->Max(); |
} |
@@ -107,7 +106,7 @@ double TypeImpl<Config>::Min() { |
} |
return min; |
} |
- if (this->IsRange()) return this->AsRange()->Min()->Number(); |
+ if (this->IsRange()) return this->AsRange()->Min(); |
if (this->IsConstant()) return this->AsConstant()->Value()->Number(); |
UNREACHABLE(); |
return 0; |
@@ -125,7 +124,7 @@ double TypeImpl<Config>::Max() { |
} |
return max; |
} |
- if (this->IsRange()) return this->AsRange()->Max()->Number(); |
+ if (this->IsRange()) return this->AsRange()->Max(); |
if (this->IsConstant()) return this->AsConstant()->Value()->Number(); |
UNREACHABLE(); |
return 0; |
@@ -148,8 +147,8 @@ TypeImpl<Config>::BitsetType::Glb(TypeImpl* type) { |
return type->AsUnion()->Get(0)->BitsetGlb() | |
type->AsUnion()->Get(1)->BitsetGlb(); // Shortcut. |
} else if (type->IsRange()) { |
- bitset glb = SEMANTIC(BitsetType::Glb(type->AsRange()->Min()->Number(), |
- type->AsRange()->Max()->Number())); |
+ bitset glb = SEMANTIC( |
+ BitsetType::Glb(type->AsRange()->Min(), type->AsRange()->Max())); |
if (glb == 0) { |
return kNone; |
} else { |
@@ -181,7 +180,7 @@ TypeImpl<Config>::BitsetType::Lub(TypeImpl* type) { |
type->AsClass()->Bound(NULL)->AsBitset(); |
} |
if (type->IsConstant()) return type->AsConstant()->Bound()->AsBitset(); |
- if (type->IsRange()) return type->AsRange()->Bound()->AsBitset(); |
+ if (type->IsRange()) return type->AsRange()->Bound(); |
if (type->IsContext()) return kInternal & kTaggedPointer; |
if (type->IsArray()) return kArray; |
if (type->IsFunction()) return kOtherObject; // TODO(rossberg): kFunction |
@@ -765,13 +764,7 @@ typename TypeImpl<Config>::Limits TypeImpl<Config>::ToLimits(bitset bits, |
return Limits::Empty(region); |
} |
- double bitset_min = BitsetType::Min(number_bits); |
- double bitset_max = BitsetType::Max(number_bits); |
- |
- // TODO(jarin) Get rid of the heap numbers. |
- i::Factory* f = i::Isolate::Current()->factory(); |
- |
- return Limits(f->NewNumber(bitset_min), f->NewNumber(bitset_max), |
+ return Limits(BitsetType::Min(number_bits), BitsetType::Max(number_bits), |
representation); |
} |
@@ -874,10 +867,8 @@ typename TypeImpl<Config>::TypeHandle TypeImpl<Config>::NormalizeRangeAndBitset( |
double bitset_min = BitsetType::Min(number_bits); |
double bitset_max = BitsetType::Max(number_bits); |
- i::Handle<i::Object> range_min_obj = range->Min(); |
- i::Handle<i::Object> range_max_obj = range->Max(); |
- double range_min = range_min_obj->Number(); |
- double range_max = range_max_obj->Number(); |
+ double range_min = range->Min(); |
+ double range_max = range->Max(); |
bitset range_representation = REPRESENTATION(range->BitsetLub()); |
bitset bits_representation = REPRESENTATION(*bits); |
@@ -897,14 +888,12 @@ typename TypeImpl<Config>::TypeHandle TypeImpl<Config>::NormalizeRangeAndBitset( |
} |
if (bitset_min < range_min) { |
- // TODO(jarin) Get rid of the heap numbers. |
- range_min_obj = i::Isolate::Current()->factory()->NewNumber(bitset_min); |
+ range_min = bitset_min; |
} |
if (bitset_max > range_max) { |
- // TODO(jarin) Get rid of the heap numbers. |
- range_max_obj = i::Isolate::Current()->factory()->NewNumber(bitset_max); |
+ range_max = bitset_max; |
} |
- return RangeType::New(range_min_obj, range_max_obj, |
+ return RangeType::New(range_min, range_max, |
BitsetType::New(representation, region), region); |
} |
@@ -1227,8 +1216,8 @@ void TypeImpl<Config>::PrintTo(std::ostream& os, PrintDimension dim) { |
} else if (this->IsRange()) { |
std::ostream::fmtflags saved_flags = os.setf(std::ios::fixed); |
std::streamsize saved_precision = os.precision(0); |
- os << "Range(" << this->AsRange()->Min()->Number() << ", " |
- << this->AsRange()->Max()->Number() << ")"; |
+ os << "Range(" << this->AsRange()->Min() << ", " << this->AsRange()->Max() |
+ << ")"; |
os.flags(saved_flags); |
os.precision(saved_precision); |
} else if (this->IsContext()) { |