// in the graph. In the current implementation, we are
// increasing the limits to the closest power of two.
Type* Typer::Visitor::Weaken(Type* current_type, Type* previous_type) {
- Type::RangeType* previous = previous_type->GetRange();
- Type::RangeType* current = current_type->GetRange();
- if (previous != NULL && current != NULL) {
+ if (current_type->IsRange() && previous_type->IsRange()) {
+ Type::RangeType* previous = previous_type->AsRange();
+ Type::RangeType* current = current_type->AsRange();
+
double current_min = current->Min()->Number();
Handle<Object> new_min = current->Min();
}
}
- return Type::Union(current_type,
- Type::Range(new_min, new_max, typer_->zone()),
- typer_->zone());
+ return Type::Range(new_min, new_max, typer_->zone());
}
return current_type;
}
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include <iomanip>
-
#include "src/types.h"
#include "src/ostreams.h"
} else if (this->IsConstant()) {
os << "Constant(" << Brief(*this->AsConstant()->Value()) << ")";
} 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.flags(saved_flags);
- os.precision(saved_precision);
} else if (this->IsContext()) {
os << "Context(";
this->AsContext()->Outer()->PrintTo(os, dim);
double Min();
double Max();
- // Extracts a range from the type. If the type is a range, it just
- // returns it; if it is a union, it returns the range component.
- // Note that it does not contain range for constants.
- RangeType* GetRange();
-
int NumClasses();
int NumConstants();
static bool Contains(RangeType* lhs, RangeType* rhs);
static bool Contains(RangeType* range, i::Object* val);
+ RangeType* GetRange();
static int UpdateRange(
RangeHandle type, UnionHandle result, int size, Region* region);
*/
}
- TypeHandle RangeToHandle(typename Type::RangeType* range) {
- return T.Range(range->Min(), range->Max());
- }
-
- void GetRange() {
- // GetRange(Range(a, b)) = Range(a, b).
- for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) {
- TypeHandle type1 = *it1;
- if (type1->IsRange()) {
- typename Type::RangeType* range = type1->GetRange();
- CHECK(type1->Equals(RangeToHandle(range)));
- }
- }
-
- // GetRange(Union(Constant(x), Range(min,max))) == Range(min, max).
- for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) {
- for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) {
- TypeHandle type1 = *it1;
- TypeHandle type2 = *it2;
- if (type1->IsConstant() && type2->IsRange()) {
- TypeHandle u = T.Union(type1, type2);
-
- CHECK(type2->Equals(RangeToHandle(u->GetRange())));
- }
- }
- }
-
- // GetRange is monotone whenever it is defined.
- for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) {
- for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) {
- TypeHandle type1 = *it1;
- TypeHandle type2 = *it2;
- if (type1->GetRange() != NULL && type2->GetRange() != NULL &&
- type1->Is(type2)) {
- TypeHandle r1 = RangeToHandle(type1->GetRange());
- TypeHandle r2 = RangeToHandle(type2->GetRange());
- CHECK(r1->Is(r2));
- }
- }
- }
- }
-
template<class Type2, class TypeHandle2, class Region2, class Rep2>
void Convert() {
Types<Type2, TypeHandle2, Region2> T2(
}
-TEST(GetRange) {
- CcTest::InitializeVM();
- ZoneTests().GetRange();
- HeapTests().GetRange();
-}
-
-
TEST(Convert) {
CcTest::InitializeVM();
ZoneTests().Convert<HeapType, Handle<HeapType>, Isolate, HeapRep>();
+++ /dev/null
-// Copyright 2014 the V8 project authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-function f() {
- for (var j = 1; j < 1; j *= -8) {
- }
- for (var i = 1; i < 1; j += 2) {
- j * -1;
- }
-}
-f();