Index: test/cctest/test-types.cc |
diff --git a/test/cctest/test-types.cc b/test/cctest/test-types.cc |
index 47868f6484b3e09fee9bf69d5fd9613296f74dff..e8f20be9b02d46ed10c2ca913f5740d636e80253 100644 |
--- a/test/cctest/test-types.cc |
+++ b/test/cctest/test-types.cc |
@@ -43,9 +43,10 @@ struct ZoneRep { |
static bool IsBitset(Type* t) { return reinterpret_cast<intptr_t>(t) & 1; } |
static bool IsClass(Type* t) { return IsStruct(t, 0); } |
static bool IsConstant(Type* t) { return IsStruct(t, 1); } |
- static bool IsArray(Type* t) { return IsStruct(t, 2); } |
- static bool IsFunction(Type* t) { return IsStruct(t, 3); } |
- static bool IsUnion(Type* t) { return IsStruct(t, 4); } |
+ static bool IsContext(Type* t) { return IsStruct(t, 2); } |
+ static bool IsArray(Type* t) { return IsStruct(t, 3); } |
+ static bool IsFunction(Type* t) { return IsStruct(t, 4); } |
+ static bool IsUnion(Type* t) { return IsStruct(t, 5); } |
static Struct* AsStruct(Type* t) { |
return reinterpret_cast<Struct*>(t); |
@@ -59,6 +60,9 @@ struct ZoneRep { |
static Object* AsConstant(Type* t) { |
return *static_cast<Object**>(AsStruct(t)[3]); |
} |
+ static Type* AsContext(Type* t) { |
+ return *static_cast<Type**>(AsStruct(t)[2]); |
+ } |
static Struct* AsUnion(Type* t) { |
return AsStruct(t); |
} |
@@ -79,9 +83,10 @@ struct HeapRep { |
static bool IsBitset(Handle<HeapType> t) { return t->IsSmi(); } |
static bool IsClass(Handle<HeapType> t) { return t->IsMap(); } |
static bool IsConstant(Handle<HeapType> t) { return t->IsBox(); } |
- static bool IsArray(Handle<HeapType> t) { return IsStruct(t, 2); } |
- static bool IsFunction(Handle<HeapType> t) { return IsStruct(t, 3); } |
- static bool IsUnion(Handle<HeapType> t) { return IsStruct(t, 4); } |
+ static bool IsContext(Handle<HeapType> t) { return IsStruct(t, 2); } |
+ static bool IsArray(Handle<HeapType> t) { return IsStruct(t, 3); } |
+ static bool IsFunction(Handle<HeapType> t) { return IsStruct(t, 4); } |
+ static bool IsUnion(Handle<HeapType> t) { return IsStruct(t, 5); } |
static Struct* AsStruct(Handle<HeapType> t) { return FixedArray::cast(*t); } |
static int AsBitset(Handle<HeapType> t) { return Smi::cast(*t)->value(); } |
@@ -89,6 +94,9 @@ struct HeapRep { |
static Object* AsConstant(Handle<HeapType> t) { |
return Box::cast(*t)->value(); |
} |
+ static HeapType* AsContext(Handle<HeapType> t) { |
+ return HeapType::cast(AsStruct(t)->get(1)); |
+ } |
static Struct* AsUnion(Handle<HeapType> t) { return AsStruct(t); } |
static int Length(Struct* structured) { return structured->length() - 1; } |
@@ -143,7 +151,7 @@ class Types { |
types.push_back(Type::Constant(*it, region)); |
} |
- FloatArray = Type::Array(Float, region); |
+ NumberArray = Type::Array(Number, region); |
StringArray = Type::Array(String, region); |
AnyArray = Type::Array(Any, region); |
@@ -183,7 +191,7 @@ class Types { |
TypeHandle ArrayConstant; |
TypeHandle UninitializedConstant; |
- TypeHandle FloatArray; |
+ TypeHandle NumberArray; |
TypeHandle StringArray; |
TypeHandle AnyArray; |
@@ -272,13 +280,19 @@ class Types { |
int i = rng_.NextInt(static_cast<int>(values.size())); |
return Type::Constant(values[i], region_); |
} |
- case 3: { // array |
+ case 3: { // context |
+ int depth = rng_.NextInt(3); |
+ TypeHandle type = Type::Internal(region_); |
+ for (int i = 0; i < depth; ++i) type = Type::Context(type, region_); |
+ return type; |
+ } |
+ case 4: { // array |
TypeHandle element = Fuzz(depth / 2); |
return Type::Array(element, region_); |
} |
- case 4: |
case 5: |
- case 6: { // function |
+ case 6: |
+ case 7: { // function |
TypeHandle result = Fuzz(depth / 2); |
TypeHandle receiver = Fuzz(depth / 2); |
int arity = rng_.NextInt(3); |
@@ -332,6 +346,7 @@ struct Tests : Rep { |
Rep::IsBitset(type1) == Rep::IsBitset(type2) && |
Rep::IsClass(type1) == Rep::IsClass(type2) && |
Rep::IsConstant(type1) == Rep::IsConstant(type2) && |
+ Rep::IsContext(type1) == Rep::IsContext(type2) && |
Rep::IsUnion(type1) == Rep::IsUnion(type2) && |
type1->NumClasses() == type2->NumClasses() && |
type1->NumConstants() == type2->NumConstants() && |
@@ -507,6 +522,45 @@ struct Tests : Rep { |
CHECK(Equal(type1, type2) == (*value1 == *value2)); |
} |
} |
+ |
+ // Typing of numbers |
+ Factory* fac = isolate->factory(); |
+ CHECK(T.Constant(fac->NewNumber(0))->Is(T.UnsignedSmall)); |
+ CHECK(T.Constant(fac->NewNumber(1))->Is(T.UnsignedSmall)); |
+ CHECK(T.Constant(fac->NewNumber(0x3fffffff))->Is(T.UnsignedSmall)); |
+ CHECK(T.Constant(fac->NewNumber(-1))->Is(T.OtherSignedSmall)); |
+ CHECK(T.Constant(fac->NewNumber(-0x3fffffff))->Is(T.OtherSignedSmall)); |
+ CHECK(T.Constant(fac->NewNumber(-0x40000000))->Is(T.OtherSignedSmall)); |
+ if (SmiValuesAre31Bits()) { |
+ CHECK(T.Constant(fac->NewNumber(0x40000000))->Is(T.OtherUnsigned31)); |
+ CHECK(T.Constant(fac->NewNumber(0x7fffffff))->Is(T.OtherUnsigned31)); |
+ CHECK(T.Constant(fac->NewNumber(-0x40000001))->Is(T.OtherSigned32)); |
+ CHECK(T.Constant(fac->NewNumber(-0x7fffffff))->Is(T.OtherSigned32)); |
+ CHECK(T.Constant(fac->NewNumber(-0x7fffffff-1))->Is(T.OtherSigned32)); |
+ } else { |
+ CHECK(SmiValuesAre32Bits()); |
+ CHECK(T.Constant(fac->NewNumber(0x40000000))->Is(T.UnsignedSmall)); |
+ CHECK(T.Constant(fac->NewNumber(0x7fffffff))->Is(T.UnsignedSmall)); |
+ CHECK(!T.Constant(fac->NewNumber(0x40000000))->Is(T.OtherUnsigned31)); |
+ CHECK(!T.Constant(fac->NewNumber(0x7fffffff))->Is(T.OtherUnsigned31)); |
+ CHECK(T.Constant(fac->NewNumber(-0x40000001))->Is(T.OtherSignedSmall)); |
+ CHECK(T.Constant(fac->NewNumber(-0x7fffffff))->Is(T.OtherSignedSmall)); |
+ CHECK(T.Constant(fac->NewNumber(-0x7fffffff-1))->Is(T.OtherSignedSmall)); |
+ CHECK(!T.Constant(fac->NewNumber(-0x40000001))->Is(T.OtherSigned32)); |
+ CHECK(!T.Constant(fac->NewNumber(-0x7fffffff))->Is(T.OtherSigned32)); |
+ CHECK(!T.Constant(fac->NewNumber(-0x7fffffff-1))->Is(T.OtherSigned32)); |
+ } |
+ CHECK(T.Constant(fac->NewNumber(0x80000000u))->Is(T.OtherUnsigned32)); |
+ CHECK(T.Constant(fac->NewNumber(0xffffffffu))->Is(T.OtherUnsigned32)); |
+ CHECK(T.Constant(fac->NewNumber(0xffffffffu+1.0))->Is(T.OtherNumber)); |
+ CHECK(T.Constant(fac->NewNumber(-0x7fffffff-2.0))->Is(T.OtherNumber)); |
+ CHECK(T.Constant(fac->NewNumber(0.1))->Is(T.OtherNumber)); |
+ CHECK(T.Constant(fac->NewNumber(-10.1))->Is(T.OtherNumber)); |
+ CHECK(T.Constant(fac->NewNumber(10e60))->Is(T.OtherNumber)); |
+ CHECK(T.Constant(fac->NewNumber(-1.0*0.0))->Is(T.MinusZero)); |
+ CHECK(T.Constant(fac->NewNumber(0.0/0.0))->Is(T.NaN)); |
+ CHECK(T.Constant(fac->NewNumber(1.0/0.0))->Is(T.OtherNumber)); |
+ CHECK(T.Constant(fac->NewNumber(-1.0/0.0))->Is(T.OtherNumber)); |
} |
void Array() { |
@@ -772,10 +826,9 @@ struct Tests : Rep { |
CheckSub(T.SignedSmall, T.Number); |
CheckSub(T.Signed32, T.Number); |
- CheckSub(T.Float, T.Number); |
CheckSub(T.SignedSmall, T.Signed32); |
- CheckUnordered(T.SignedSmall, T.Float); |
- CheckUnordered(T.Signed32, T.Float); |
+ CheckUnordered(T.SignedSmall, T.MinusZero); |
+ CheckUnordered(T.Signed32, T.Unsigned32); |
CheckSub(T.UniqueName, T.Name); |
CheckSub(T.String, T.Name); |
@@ -823,8 +876,8 @@ struct Tests : Rep { |
CheckUnordered(T.ObjectConstant2, T.ArrayClass); |
CheckUnordered(T.ArrayConstant, T.ObjectClass); |
- CheckSub(T.FloatArray, T.Array); |
- CheckSub(T.FloatArray, T.Object); |
+ CheckSub(T.NumberArray, T.Array); |
+ CheckSub(T.NumberArray, T.Object); |
CheckUnordered(T.StringArray, T.AnyArray); |
CheckSub(T.MethodFunction, T.Function); |
@@ -1114,8 +1167,8 @@ struct Tests : Rep { |
CheckDisjoint(T.Boolean, T.Undefined, T.Semantic); |
CheckOverlap(T.SignedSmall, T.Number, T.Semantic); |
- CheckOverlap(T.Float, T.Number, T.Semantic); |
- CheckDisjoint(T.Signed32, T.Float, T.Semantic); |
+ CheckOverlap(T.NaN, T.Number, T.Semantic); |
+ CheckDisjoint(T.Signed32, T.NaN, T.Semantic); |
CheckOverlap(T.UniqueName, T.Name, T.Semantic); |
CheckOverlap(T.String, T.Name, T.Semantic); |
@@ -1145,7 +1198,6 @@ struct Tests : Rep { |
CheckOverlap(T.SmiConstant, T.SignedSmall, T.Semantic); |
CheckOverlap(T.SmiConstant, T.Signed32, T.Semantic); |
CheckOverlap(T.SmiConstant, T.Number, T.Semantic); |
- CheckDisjoint(T.SmiConstant, T.Float, T.Semantic); |
CheckOverlap(T.ObjectConstant1, T.Object, T.Semantic); |
CheckOverlap(T.ObjectConstant2, T.Object, T.Semantic); |
CheckOverlap(T.ArrayConstant, T.Object, T.Semantic); |
@@ -1160,9 +1212,9 @@ struct Tests : Rep { |
CheckDisjoint(T.ObjectConstant2, T.ArrayClass, T.Semantic); |
CheckDisjoint(T.ArrayConstant, T.ObjectClass, T.Semantic); |
- CheckOverlap(T.FloatArray, T.Array, T.Semantic); |
- CheckDisjoint(T.FloatArray, T.AnyArray, T.Semantic); |
- CheckDisjoint(T.FloatArray, T.StringArray, T.Semantic); |
+ CheckOverlap(T.NumberArray, T.Array, T.Semantic); |
+ CheckDisjoint(T.NumberArray, T.AnyArray, T.Semantic); |
+ CheckDisjoint(T.NumberArray, T.StringArray, T.Semantic); |
CheckOverlap(T.MethodFunction, T.Function, T.Semantic); |
CheckDisjoint(T.SignedFunction1, T.NumberFunction1, T.Semantic); |
@@ -1303,22 +1355,18 @@ struct Tests : Rep { |
// Bitset-array |
CHECK(this->IsBitset(T.Union(T.AnyArray, T.Array))); |
- CHECK(this->IsUnion(T.Union(T.FloatArray, T.Number))); |
+ CHECK(this->IsUnion(T.Union(T.NumberArray, T.Number))); |
CheckEqual(T.Union(T.AnyArray, T.Array), T.Array); |
- CheckSub(T.None, T.Union(T.FloatArray, T.Number)); |
- CheckSub(T.Union(T.FloatArray, T.Number), T.Any); |
CheckUnordered(T.Union(T.AnyArray, T.String), T.Array); |
- CheckOverlap(T.Union(T.FloatArray, T.String), T.Object, T.Semantic); |
- CheckDisjoint(T.Union(T.FloatArray, T.String), T.Number, T.Semantic); |
+ CheckOverlap(T.Union(T.NumberArray, T.String), T.Object, T.Semantic); |
+ CheckDisjoint(T.Union(T.NumberArray, T.String), T.Number, T.Semantic); |
// Bitset-function |
CHECK(this->IsBitset(T.Union(T.MethodFunction, T.Function))); |
CHECK(this->IsUnion(T.Union(T.NumberFunction1, T.Number))); |
CheckEqual(T.Union(T.MethodFunction, T.Function), T.Function); |
- CheckSub(T.None, T.Union(T.MethodFunction, T.Number)); |
- CheckSub(T.Union(T.MethodFunction, T.Number), T.Any); |
CheckUnordered(T.Union(T.NumberFunction1, T.String), T.Function); |
CheckOverlap(T.Union(T.NumberFunction2, T.String), T.Object, T.Semantic); |
CheckDisjoint(T.Union(T.NumberFunction1, T.String), T.Number, T.Semantic); |
@@ -1353,10 +1401,10 @@ struct Tests : Rep { |
// Bitset-union |
CheckSub( |
- T.Float, |
+ T.NaN, |
T.Union(T.Union(T.ArrayClass, T.ObjectConstant1), T.Number)); |
CheckSub( |
- T.Union(T.Union(T.ArrayClass, T.ObjectConstant1), T.Float), |
+ T.Union(T.Union(T.ArrayClass, T.ObjectConstant1), T.Signed32), |
T.Union(T.ObjectConstant1, T.Union(T.Number, T.ArrayClass))); |
// Class-union |
@@ -1380,9 +1428,9 @@ struct Tests : Rep { |
// Array-union |
CheckEqual( |
- T.Union(T.AnyArray, T.Union(T.FloatArray, T.AnyArray)), |
- T.Union(T.AnyArray, T.FloatArray)); |
- CheckSub(T.Union(T.AnyArray, T.FloatArray), T.Array); |
+ T.Union(T.AnyArray, T.Union(T.NumberArray, T.AnyArray)), |
+ T.Union(T.AnyArray, T.NumberArray)); |
+ CheckSub(T.Union(T.AnyArray, T.NumberArray), T.Array); |
// Function-union |
CheckEqual( |
@@ -1524,7 +1572,7 @@ struct Tests : Rep { |
CheckSub(T.Intersect(T.ObjectClass, T.Number), T.Representation); |
// Bitset-array |
- CheckEqual(T.Intersect(T.FloatArray, T.Object), T.FloatArray); |
+ CheckEqual(T.Intersect(T.NumberArray, T.Object), T.NumberArray); |
CheckSub(T.Intersect(T.AnyArray, T.Function), T.Representation); |
// Bitset-function |
@@ -1545,13 +1593,13 @@ struct Tests : Rep { |
// Array-union |
CheckEqual( |
- T.Intersect(T.FloatArray, T.Union(T.FloatArray, T.ArrayClass)), |
- T.FloatArray); |
+ T.Intersect(T.NumberArray, T.Union(T.NumberArray, T.ArrayClass)), |
+ T.NumberArray); |
CheckEqual( |
T.Intersect(T.AnyArray, T.Union(T.Object, T.SmiConstant)), |
T.AnyArray); |
CheckEqual( |
- T.Intersect(T.Union(T.AnyArray, T.ArrayConstant), T.FloatArray), |
+ T.Intersect(T.Union(T.AnyArray, T.ArrayConstant), T.NumberArray), |
T.None); |
// Function-union |