Index: test/cctest/test-hydrogen-types.cc |
diff --git a/test/cctest/test-hydrogen-types.cc b/test/cctest/test-hydrogen-types.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..1d333c6c2683ba20ba421e50d67843e57ec7fa93 |
--- /dev/null |
+++ b/test/cctest/test-hydrogen-types.cc |
@@ -0,0 +1,168 @@ |
+// 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. |
+ |
+#include "hydrogen-types.h" |
+ |
+#include "cctest.h" |
+ |
+using namespace v8::internal; |
+ |
+ |
+static const HType kTypes[] = { |
+ #define DECLARE_TYPE(Name, mask) HType::Name(), |
+ HTYPE_LIST(DECLARE_TYPE) |
+ #undef DECLARE_TYPE |
+}; |
+ |
+static const int kNumberOfTypes = sizeof(kTypes) / sizeof(kTypes[0]); |
+ |
+ |
+TEST(HTypeDistinct) { |
+ for (int i = 0; i < kNumberOfTypes; ++i) { |
+ for (int j = 0; j < kNumberOfTypes; ++j) { |
+ CHECK(i == j || !kTypes[i].Equals(kTypes[j])); |
+ } |
+ } |
+} |
+ |
+ |
+TEST(HTypeReflexivity) { |
+ // Reflexivity of = |
+ for (int i = 0; i < kNumberOfTypes; ++i) { |
+ CHECK(kTypes[i].Equals(kTypes[i])); |
+ } |
+ |
+ // Reflexivity of < |
+ for (int i = 0; i < kNumberOfTypes; ++i) { |
+ CHECK(kTypes[i].IsSubtypeOf(kTypes[i])); |
+ } |
+} |
+ |
+ |
+TEST(HTypeTransitivity) { |
+ // Transitivity of = |
+ for (int i = 0; i < kNumberOfTypes; ++i) { |
+ for (int j = 0; j < kNumberOfTypes; ++j) { |
+ for (int k = 0; k < kNumberOfTypes; ++k) { |
+ HType ti = kTypes[i]; |
+ HType tj = kTypes[j]; |
+ HType tk = kTypes[k]; |
+ CHECK(!ti.Equals(tj) || !tj.Equals(tk) || ti.Equals(tk)); |
+ } |
+ } |
+ } |
+ |
+ // Transitivity of < |
+ for (int i = 0; i < kNumberOfTypes; ++i) { |
+ for (int j = 0; j < kNumberOfTypes; ++j) { |
+ for (int k = 0; k < kNumberOfTypes; ++k) { |
+ HType ti = kTypes[i]; |
+ HType tj = kTypes[j]; |
+ HType tk = kTypes[k]; |
+ CHECK(!ti.IsSubtypeOf(tj) || !tj.IsSubtypeOf(tk) || ti.IsSubtypeOf(tk)); |
+ } |
+ } |
+ } |
+} |
+ |
+ |
+TEST(HTypeCombine) { |
+ // T < T /\ T' and T' < T /\ T' for all T,T' |
+ for (int i = 0; i < kNumberOfTypes; ++i) { |
+ for (int j = 0; j < kNumberOfTypes; ++j) { |
+ HType ti = kTypes[i]; |
+ HType tj = kTypes[j]; |
+ CHECK(ti.IsSubtypeOf(ti.Combine(tj))); |
+ CHECK(tj.IsSubtypeOf(ti.Combine(tj))); |
+ } |
+ } |
+} |
+ |
+ |
+TEST(HTypeAny) { |
+ // T < Any for all T |
+ for (int i = 0; i < kNumberOfTypes; ++i) { |
+ HType ti = kTypes[i]; |
+ CHECK(ti.IsAny()); |
+ } |
+ |
+ // Any < T implies T = Any for all T |
+ for (int i = 0; i < kNumberOfTypes; ++i) { |
+ HType ti = kTypes[i]; |
+ CHECK(!HType::Any().IsSubtypeOf(ti) || HType::Any().Equals(ti)); |
+ } |
+} |
+ |
+ |
+TEST(HTypeTagged) { |
+ // T < Tagged for all T \ {Any} |
+ for (int i = 0; i < kNumberOfTypes; ++i) { |
+ HType ti = kTypes[i]; |
+ CHECK(ti.IsTagged() || HType::Any().Equals(ti)); |
+ } |
+ |
+ // Tagged < T implies T = Tagged or T = Any |
+ for (int i = 0; i < kNumberOfTypes; ++i) { |
+ HType ti = kTypes[i]; |
+ CHECK(!HType::Tagged().IsSubtypeOf(ti) || |
+ HType::Tagged().Equals(ti) || |
+ HType::Any().Equals(ti)); |
+ } |
+} |
+ |
+ |
+TEST(HTypeSmi) { |
+ // T < Smi implies T = None or T = Smi for all T |
+ for (int i = 0; i < kNumberOfTypes; ++i) { |
+ HType ti = kTypes[i]; |
+ CHECK(!ti.IsSmi() || |
+ ti.Equals(HType::Smi()) || |
+ ti.Equals(HType::None())); |
+ } |
+} |
+ |
+ |
+TEST(HTypeHeapObject) { |
+ CHECK(!HType::TaggedPrimitive().IsHeapObject()); |
+ CHECK(!HType::TaggedNumber().IsHeapObject()); |
+ CHECK(!HType::Smi().IsHeapObject()); |
+ CHECK(HType::HeapObject().IsHeapObject()); |
+ CHECK(HType::HeapPrimitive().IsHeapObject()); |
+ CHECK(HType::Null().IsHeapObject()); |
+ CHECK(HType::HeapNumber().IsHeapObject()); |
+ CHECK(HType::String().IsHeapObject()); |
+ CHECK(HType::Boolean().IsHeapObject()); |
+ CHECK(HType::Undefined().IsHeapObject()); |
+ CHECK(HType::JSObject().IsHeapObject()); |
+ CHECK(HType::JSArray().IsHeapObject()); |
+} |
+ |
+ |
+TEST(HTypePrimitive) { |
+ CHECK(HType::TaggedNumber().IsTaggedPrimitive()); |
+ CHECK(HType::Smi().IsTaggedPrimitive()); |
+ CHECK(!HType::HeapObject().IsTaggedPrimitive()); |
+ CHECK(HType::HeapPrimitive().IsTaggedPrimitive()); |
+ CHECK(HType::Null().IsHeapPrimitive()); |
+ CHECK(HType::HeapNumber().IsHeapPrimitive()); |
+ CHECK(HType::String().IsHeapPrimitive()); |
+ CHECK(HType::Boolean().IsHeapPrimitive()); |
+ CHECK(HType::Undefined().IsHeapPrimitive()); |
+ CHECK(!HType::JSObject().IsTaggedPrimitive()); |
+ CHECK(!HType::JSArray().IsTaggedPrimitive()); |
+} |
+ |
+ |
+TEST(HTypeJSObject) { |
+ CHECK(HType::JSArray().IsJSObject()); |
+} |
+ |
+ |
+TEST(HTypeNone) { |
+ // None < T for all T |
+ for (int i = 0; i < kNumberOfTypes; ++i) { |
+ HType ti = kTypes[i]; |
+ CHECK(HType::None().IsSubtypeOf(ti)); |
+ } |
+} |