| Index: test/cctest/test-types.cc | 
| diff --git a/test/cctest/test-types.cc b/test/cctest/test-types.cc | 
| index 86a8d4ee40dbf8bea93ffbcae139299d37205043..fdf5a0a9822d2c0704999141328c389a0c7e4b19 100644 | 
| --- a/test/cctest/test-types.cc | 
| +++ b/test/cctest/test-types.cc | 
| @@ -159,6 +159,10 @@ class Types { | 
| if (!IsMinusZero(x)) integers.push_back(isolate->factory()->NewNumber(x)); | 
| } | 
|  | 
| +    Integer = Type::Range( | 
| +        isolate->factory()->NewNumber(-V8_INFINITY), | 
| +        isolate->factory()->NewNumber(-V8_INFINITY), region); | 
| + | 
| NumberArray = Type::Array(Number, region); | 
| StringArray = Type::Array(String, region); | 
| AnyArray = Type::Array(Any, region); | 
| @@ -189,6 +193,8 @@ class Types { | 
| BITSET_TYPE_LIST(DECLARE_TYPE) | 
| #undef DECLARE_TYPE | 
|  | 
| +  TypeHandle Integer; | 
| + | 
| TypeHandle ObjectClass; | 
| TypeHandle ArrayClass; | 
| TypeHandle NumberClass; | 
| @@ -653,6 +659,21 @@ struct Tests : Rep { | 
| } | 
| } | 
| } | 
| + | 
| +    // Weakening: | 
| +    // 1.) Range(x,y)->Is(Range(x,y)->Weaken()) | 
| +    // 2.) Range(x,y)->Weaken()->IsRange() iff Range(x,y)->Maybe(OtherNumber) | 
| +    for (ValueIterator i = T.integers.begin(); i != T.integers.end(); ++i) { | 
| +      for (ValueIterator j = T.integers.begin(); j != T.integers.end(); ++j) { | 
| +        i::Handle<i::Object> min = *i; | 
| +        i::Handle<i::Object> max = *j; | 
| +        if (min->Number() > max->Number()) std::swap(min, max); | 
| +        typename Type::RangeType* range = T.Range(min, max)->AsRange(); | 
| +        CHECK(range->Is(range->Weaken(T.region()))); | 
| +        CHECK(range->Weaken(T.region())->IsRange() == | 
| +              range->Maybe(T.OtherNumber)); | 
| +      } | 
| +    } | 
| } | 
|  | 
| void Context() { | 
| @@ -867,6 +888,8 @@ struct Tests : Rep { | 
| } | 
|  | 
| void MinMax() { | 
| +    Factory* fac = isolate->factory(); | 
| + | 
| // If b is regular numeric bitset, then Range(b->Min(), b->Max())->Is(b). | 
| // TODO(neis): Need to ignore representation for this to be true. | 
| /* | 
| @@ -885,8 +908,7 @@ struct Tests : Rep { | 
| // If b is regular numeric bitset, then b->Min() and b->Max() are integers. | 
| for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { | 
| TypeHandle type = *it; | 
| -      if (this->IsBitset(type) && type->Is(T.Number) && | 
| -          !type->Is(T.None) && !type->Is(T.NaN)) { | 
| +      if (this->IsBitset(type) && type->Is(T.Number) && !type->Is(T.NaN)) { | 
| CHECK(IsInteger(type->Min()) && IsInteger(type->Max())); | 
| } | 
| } | 
| @@ -914,6 +936,16 @@ struct Tests : Rep { | 
| CHECK(lub->Min() <= type->Min() && type->Max() <= lub->Max()); | 
| } | 
| } | 
| + | 
| +    // Rangification: If T->Is(Range(-inf,+inf)) and !T->Is(None), then | 
| +    // T->Is(Range(T->Min(), T->Max())). | 
| +    for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { | 
| +      TypeHandle type = *it; | 
| +      CHECK( | 
| +          !(type->Is(T.Integer) && !type->Is(T.None)) || | 
| +          type->Is(T.Range( | 
| +              fac->NewNumber(type->Min()), fac->NewNumber(type->Max())))); | 
| +    } | 
| } | 
|  | 
| void BitsetGlb() { | 
|  |