Index: test/cctest/test-types.cc |
diff --git a/test/cctest/test-types.cc b/test/cctest/test-types.cc |
index 59a8f0851a47e44e0539513d7e87da433ec84af2..62ec698ec32bfe610690dcb1c4bdef1bcc02f1ef 100644 |
--- a/test/cctest/test-types.cc |
+++ b/test/cctest/test-types.cc |
@@ -43,9 +43,7 @@ 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 IsUnion(Type* t) { return IsStruct(t, 2); } |
static Struct* AsStruct(Type* t) { |
return reinterpret_cast<Struct*>(t); |
@@ -79,9 +77,7 @@ 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 IsUnion(Handle<HeapType> t) { return IsStruct(t, 2); } |
static Struct* AsStruct(Handle<HeapType> t) { return FixedArray::cast(*t); } |
static int AsBitset(Handle<HeapType> t) { return Smi::cast(*t)->value(); } |
@@ -143,31 +139,11 @@ class Types { |
types.push_back(Type::Constant(*it, region)); |
} |
- FloatArray = Type::Array(Float, region); |
- StringArray = Type::Array(String, region); |
- AnyArray = Type::Array(Any, region); |
- |
- SignedFunction1 = Type::Function(SignedSmall, SignedSmall, region); |
- NumberFunction1 = Type::Function(Number, Number, region); |
- NumberFunction2 = Type::Function(Number, Number, Number, region); |
- MethodFunction = Type::Function(String, Object, 0, region); |
- |
for (int i = 0; i < 50; ++i) { |
types.push_back(Fuzz()); |
} |
} |
- Handle<i::Map> object_map; |
- Handle<i::Map> array_map; |
- Handle<i::Map> uninitialized_map; |
- |
- Handle<i::Smi> smi; |
- Handle<i::HeapNumber> signed32; |
- Handle<i::JSObject> object1; |
- Handle<i::JSObject> object2; |
- Handle<i::JSArray> array; |
- Handle<i::Oddball> uninitialized; |
- |
#define DECLARE_TYPE(name, value) TypeHandle name; |
BITSET_TYPE_LIST(DECLARE_TYPE) |
#undef DECLARE_TYPE |
@@ -183,14 +159,16 @@ class Types { |
TypeHandle ArrayConstant; |
TypeHandle UninitializedConstant; |
- TypeHandle FloatArray; |
- TypeHandle StringArray; |
- TypeHandle AnyArray; |
+ Handle<i::Map> object_map; |
+ Handle<i::Map> array_map; |
+ Handle<i::Map> uninitialized_map; |
- TypeHandle SignedFunction1; |
- TypeHandle NumberFunction1; |
- TypeHandle NumberFunction2; |
- TypeHandle MethodFunction; |
+ Handle<i::Smi> smi; |
+ Handle<i::HeapNumber> signed32; |
+ Handle<i::JSObject> object1; |
+ Handle<i::JSObject> object2; |
+ Handle<i::JSArray> array; |
+ Handle<i::Oddball> uninitialized; |
typedef std::vector<TypeHandle> TypeVector; |
typedef std::vector<Handle<i::Map> > MapVector; |
@@ -215,24 +193,6 @@ class Types { |
return Type::Class(map, region_); |
} |
- TypeHandle Array1(TypeHandle element) { |
- return Type::Array(element, region_); |
- } |
- |
- TypeHandle Function0(TypeHandle result, TypeHandle receiver) { |
- return Type::Function(result, receiver, 0, region_); |
- } |
- |
- TypeHandle Function1(TypeHandle result, TypeHandle receiver, TypeHandle arg) { |
- TypeHandle type = Type::Function(result, receiver, 1, region_); |
- type->AsFunction()->InitParameter(0, arg); |
- return type; |
- } |
- |
- TypeHandle Function2(TypeHandle result, TypeHandle arg1, TypeHandle arg2) { |
- return Type::Function(result, arg1, arg2, region_); |
- } |
- |
TypeHandle Union(TypeHandle t1, TypeHandle t2) { |
return Type::Union(t1, t2, region_); |
} |
@@ -245,10 +205,6 @@ class Types { |
return Type::template Convert<Type2>(t, region_); |
} |
- TypeHandle Random() { |
- return types[rng_.NextInt(static_cast<int>(types.size()))]; |
- } |
- |
TypeHandle Fuzz(int depth = 5) { |
switch (rng_.NextInt(depth == 0 ? 3 : 20)) { |
case 0: { // bitset |
@@ -272,17 +228,6 @@ class Types { |
int i = rng_.NextInt(static_cast<int>(values.size())); |
return Type::Constant(values[i], region_); |
} |
- case 3: // array |
- return Type::Array(Fuzz(depth / 2), region_); |
- case 4: |
- case 5: |
- case 6: { // function |
- TypeHandle type = Type::Function( |
- Fuzz(depth / 2), Fuzz(depth / 2), rand() % 3, region_); |
- for (int i = 0; i < type->AsFunction()->Arity(); ++i) { |
- type->AsFunction()->InitParameter(i, Fuzz(depth - 1)); |
- } |
- } |
default: { // union |
int n = rng_.NextInt(10); |
TypeHandle type = None; |
@@ -461,7 +406,7 @@ struct Tests : Rep { |
for (MapIterator mt = T.maps.begin(); mt != T.maps.end(); ++mt) { |
Handle<i::Map> map = *mt; |
TypeHandle type = T.Class(map); |
- CHECK(*map == *type->AsClass()->Map()); |
+ CHECK(*map == *type->AsClass()); |
} |
// Functionality & Injectivity: Class(M1) = Class(M2) iff M1 = M2 |
@@ -488,10 +433,10 @@ struct Tests : Rep { |
for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) { |
Handle<i::Object> value = *vt; |
TypeHandle type = T.Constant(value); |
- CHECK(*value == *type->AsConstant()->Value()); |
+ CHECK(*value == *type->AsConstant()); |
} |
- // Functionality & Injectivity: Constant(V1) = Constant(V2) iff V1 = V2 |
+ // Functionality & Injectivity: Constant(V1) = Constant(v2) iff V1 = V2 |
for (ValueIterator vt1 = T.values.begin(); vt1 != T.values.end(); ++vt1) { |
for (ValueIterator vt2 = T.values.begin(); vt2 != T.values.end(); ++vt2) { |
Handle<i::Object> value1 = *vt1; |
@@ -503,102 +448,6 @@ struct Tests : Rep { |
} |
} |
- void Array() { |
- // Constructor |
- for (int i = 0; i < 20; ++i) { |
- TypeHandle type = T.Random(); |
- TypeHandle array = T.Array1(type); |
- CHECK(this->IsArray(array)); |
- } |
- |
- // Attributes |
- for (int i = 0; i < 20; ++i) { |
- TypeHandle type = T.Random(); |
- TypeHandle array = T.Array1(type); |
- CheckEqual(type, array->AsArray()->Element()); |
- } |
- |
- // Functionality & Injectivity: Array(T1) = Array(T2) iff T1 = T2 |
- for (int i = 0; i < 20; ++i) { |
- for (int j = 0; j < 20; ++j) { |
- TypeHandle type1 = T.Random(); |
- TypeHandle type2 = T.Random(); |
- TypeHandle array1 = T.Array1(type1); |
- TypeHandle array2 = T.Array1(type2); |
- CHECK(Equal(array1, array2) == Equal(type1, type2)); |
- } |
- } |
- } |
- |
- void Function() { |
- // Constructors |
- for (int i = 0; i < 20; ++i) { |
- for (int j = 0; j < 20; ++j) { |
- for (int k = 0; k < 20; ++k) { |
- TypeHandle type1 = T.Random(); |
- TypeHandle type2 = T.Random(); |
- TypeHandle type3 = T.Random(); |
- TypeHandle function0 = T.Function0(type1, type2); |
- TypeHandle function1 = T.Function1(type1, type2, type3); |
- TypeHandle function2 = T.Function2(type1, type2, type3); |
- CHECK(function0->IsFunction()); |
- CHECK(function1->IsFunction()); |
- CHECK(function2->IsFunction()); |
- } |
- } |
- } |
- |
- // Attributes |
- for (int i = 0; i < 20; ++i) { |
- for (int j = 0; j < 20; ++j) { |
- for (int k = 0; k < 20; ++k) { |
- TypeHandle type1 = T.Random(); |
- TypeHandle type2 = T.Random(); |
- TypeHandle type3 = T.Random(); |
- TypeHandle function0 = T.Function0(type1, type2); |
- TypeHandle function1 = T.Function1(type1, type2, type3); |
- TypeHandle function2 = T.Function2(type1, type2, type3); |
- CHECK_EQ(0, function0->AsFunction()->Arity()); |
- CHECK_EQ(1, function1->AsFunction()->Arity()); |
- CHECK_EQ(2, function2->AsFunction()->Arity()); |
- CheckEqual(type1, function0->AsFunction()->Result()); |
- CheckEqual(type1, function1->AsFunction()->Result()); |
- CheckEqual(type1, function2->AsFunction()->Result()); |
- CheckEqual(type2, function0->AsFunction()->Receiver()); |
- CheckEqual(type2, function1->AsFunction()->Receiver()); |
- CheckEqual(T.Any, function2->AsFunction()->Receiver()); |
- CheckEqual(type3, function1->AsFunction()->Parameter(0)); |
- CheckEqual(type2, function2->AsFunction()->Parameter(0)); |
- CheckEqual(type3, function2->AsFunction()->Parameter(1)); |
- } |
- } |
- } |
- |
- // Functionality & Injectivity: Function(Ts1) = Function(Ts2) iff Ts1 = Ts2 |
- for (int i = 0; i < 20; ++i) { |
- for (int j = 0; j < 20; ++j) { |
- for (int k = 0; k < 20; ++k) { |
- TypeHandle type1 = T.Random(); |
- TypeHandle type2 = T.Random(); |
- TypeHandle type3 = T.Random(); |
- TypeHandle function01 = T.Function0(type1, type2); |
- TypeHandle function02 = T.Function0(type1, type3); |
- TypeHandle function03 = T.Function0(type3, type2); |
- TypeHandle function11 = T.Function1(type1, type2, type2); |
- TypeHandle function12 = T.Function1(type1, type2, type3); |
- TypeHandle function21 = T.Function2(type1, type2, type2); |
- TypeHandle function22 = T.Function2(type1, type2, type3); |
- TypeHandle function23 = T.Function2(type1, type3, type2); |
- CHECK(Equal(function01, function02) == Equal(type2, type3)); |
- CHECK(Equal(function01, function03) == Equal(type1, type3)); |
- CHECK(Equal(function11, function12) == Equal(type2, type3)); |
- CHECK(Equal(function21, function22) == Equal(type2, type3)); |
- CHECK(Equal(function21, function23) == Equal(type2, type3)); |
- } |
- } |
- } |
- } |
- |
void Of() { |
// Constant(V)->Is(Of(V)) |
for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) { |
@@ -792,7 +641,6 @@ struct Tests : Rep { |
// Structural types |
CheckSub(T.ObjectClass, T.Object); |
CheckSub(T.ArrayClass, T.Object); |
- CheckSub(T.ArrayClass, T.Array); |
CheckSub(T.UninitializedClass, T.Internal); |
CheckUnordered(T.ObjectClass, T.ArrayClass); |
CheckUnordered(T.UninitializedClass, T.Null); |
@@ -816,15 +664,6 @@ struct Tests : Rep { |
CheckUnordered(T.ObjectConstant1, T.ArrayClass); |
CheckUnordered(T.ObjectConstant2, T.ArrayClass); |
CheckUnordered(T.ArrayConstant, T.ObjectClass); |
- |
- CheckSub(T.FloatArray, T.Array); |
- CheckSub(T.FloatArray, T.Object); |
- CheckUnordered(T.StringArray, T.AnyArray); |
- |
- CheckSub(T.MethodFunction, T.Function); |
- CheckSub(T.NumberFunction1, T.Object); |
- CheckUnordered(T.SignedFunction1, T.NumberFunction1); |
- CheckUnordered(T.NumberFunction1, T.NumberFunction2); |
} |
void NowIs() { |
@@ -1153,19 +992,9 @@ struct Tests : Rep { |
CheckDisjoint(T.ObjectConstant1, T.ArrayClass, T.Semantic); |
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.MethodFunction, T.Function, T.Semantic); |
- CheckDisjoint(T.SignedFunction1, T.NumberFunction1, T.Semantic); |
- CheckDisjoint(T.SignedFunction1, T.NumberFunction2, T.Semantic); |
- CheckDisjoint(T.NumberFunction1, T.NumberFunction2, T.Semantic); |
- CheckDisjoint(T.SignedFunction1, T.MethodFunction, T.Semantic); |
} |
- void Union1() { |
+ void Union() { |
// Identity: Union(T, None) = T |
for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { |
TypeHandle type = *it; |
@@ -1234,9 +1063,7 @@ struct Tests : Rep { |
if (type1->Is(type2)) CheckEqual(union12, type2); |
} |
} |
- } |
- void Union2() { |
// Monotonicity: T1->Is(T2) implies Union(T1, T3)->Is(Union(T2, T3)) |
for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) { |
for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) { |
@@ -1295,28 +1122,6 @@ struct Tests : Rep { |
CheckDisjoint( |
T.Union(T.ObjectConstant1, T.ArrayConstant), T.ObjectClass, T.Semantic); |
- // Bitset-array |
- CHECK(this->IsBitset(T.Union(T.AnyArray, T.Array))); |
- CHECK(this->IsUnion(T.Union(T.FloatArray, 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); |
- |
- // 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); |
- |
// Bitset-class |
CheckSub( |
T.Union(T.ObjectClass, T.SignedSmall), T.Union(T.Object, T.Number)); |
@@ -1372,18 +1177,6 @@ struct Tests : Rep { |
T.Union( |
T.ObjectConstant2, T.Union(T.ArrayConstant, T.ObjectConstant1))); |
- // 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); |
- |
- // Function-union |
- CheckEqual( |
- T.Union(T.NumberFunction1, T.NumberFunction2), |
- T.Union(T.NumberFunction2, T.NumberFunction1)); |
- CheckSub(T.Union(T.SignedFunction1, T.MethodFunction), T.Function); |
- |
// Union-union |
CheckEqual( |
T.Union( |
@@ -1397,7 +1190,7 @@ struct Tests : Rep { |
T.Union(T.Number, T.Array)); |
} |
- void Intersect1() { |
+ void Intersect() { |
// Identity: Intersect(T, Any) = T |
for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { |
TypeHandle type = *it; |
@@ -1467,9 +1260,7 @@ struct Tests : Rep { |
if (type1->Is(type2)) CheckEqual(intersect12, type1); |
} |
} |
- } |
- void Intersect2() { |
// Monotonicity: T1->Is(T2) implies Intersect(T1, T3)->Is(Intersect(T2, T3)) |
for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) { |
for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) { |
@@ -1517,13 +1308,9 @@ struct Tests : Rep { |
CheckSub(T.Intersect(T.ObjectClass, T.Array), T.Representation); |
CheckSub(T.Intersect(T.ObjectClass, T.Number), T.Representation); |
- // Bitset-array |
- CheckEqual(T.Intersect(T.FloatArray, T.Object), T.FloatArray); |
- CheckSub(T.Intersect(T.AnyArray, T.Function), T.Representation); |
- |
- // Bitset-function |
- CheckEqual(T.Intersect(T.MethodFunction, T.Object), T.MethodFunction); |
- CheckSub(T.Intersect(T.NumberFunction1, T.Array), T.Representation); |
+ // Class-constant |
+ CheckEqual(T.Intersect(T.ObjectConstant1, T.ObjectClass), T.None); |
+ CheckEqual(T.Intersect(T.ArrayClass, T.ObjectConstant2), T.None); |
// Bitset-union |
CheckEqual( |
@@ -1533,32 +1320,6 @@ struct Tests : Rep { |
T.Intersect(T.Union(T.ArrayClass, T.ObjectConstant1), T.Number), |
T.None); |
- // Class-constant |
- CheckEqual(T.Intersect(T.ObjectConstant1, T.ObjectClass), T.None); |
- CheckEqual(T.Intersect(T.ArrayClass, T.ObjectConstant2), T.None); |
- |
- // Array-union |
- CheckEqual( |
- T.Intersect(T.FloatArray, T.Union(T.FloatArray, T.ArrayClass)), |
- T.FloatArray); |
- 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.None); |
- |
- // Function-union |
- CheckEqual( |
- T.Intersect(T.MethodFunction, T.Union(T.String, T.MethodFunction)), |
- T.MethodFunction); |
- CheckEqual( |
- T.Intersect(T.NumberFunction1, T.Union(T.Object, T.SmiConstant)), |
- T.NumberFunction1); |
- CheckEqual( |
- T.Intersect(T.Union(T.MethodFunction, T.Name), T.NumberFunction2), |
- T.None); |
- |
// Class-union |
CheckEqual( |
T.Intersect(T.ArrayClass, T.Union(T.ObjectConstant2, T.ArrayClass)), |
@@ -1626,41 +1387,27 @@ typedef Tests<Type, Type*, Zone, ZoneRep> ZoneTests; |
typedef Tests<HeapType, Handle<HeapType>, Isolate, HeapRep> HeapTests; |
-TEST(BitsetType) { |
+TEST(Bitset) { |
CcTest::InitializeVM(); |
ZoneTests().Bitset(); |
HeapTests().Bitset(); |
} |
-TEST(ClassType) { |
+TEST(Class) { |
CcTest::InitializeVM(); |
ZoneTests().Class(); |
HeapTests().Class(); |
} |
-TEST(ConstantType) { |
+TEST(Constant) { |
CcTest::InitializeVM(); |
ZoneTests().Constant(); |
HeapTests().Constant(); |
} |
-TEST(ArrayType) { |
- CcTest::InitializeVM(); |
- ZoneTests().Array(); |
- HeapTests().Array(); |
-} |
- |
- |
-TEST(FunctionType) { |
- CcTest::InitializeVM(); |
- ZoneTests().Function(); |
- HeapTests().Function(); |
-} |
- |
- |
TEST(Of) { |
CcTest::InitializeVM(); |
ZoneTests().Of(); |
@@ -1710,31 +1457,17 @@ TEST(Maybe) { |
} |
-TEST(Union1) { |
- CcTest::InitializeVM(); |
- ZoneTests().Union1(); |
- HeapTests().Union1(); |
-} |
- |
- |
-TEST(Union2) { |
- CcTest::InitializeVM(); |
- ZoneTests().Union2(); |
- HeapTests().Union2(); |
-} |
- |
- |
-TEST(Intersect1) { |
+TEST(Union) { |
CcTest::InitializeVM(); |
- ZoneTests().Intersect1(); |
- HeapTests().Intersect1(); |
+ ZoneTests().Union(); |
+ HeapTests().Union(); |
} |
-TEST(Intersect2) { |
+TEST(Intersect) { |
CcTest::InitializeVM(); |
- ZoneTests().Intersect2(); |
- HeapTests().Intersect2(); |
+ ZoneTests().Intersect(); |
+ HeapTests().Intersect(); |
} |