| Index: test/cctest/compiler/test-typer.cc
|
| diff --git a/test/cctest/compiler/test-typer.cc b/test/cctest/compiler/test-typer.cc
|
| index 0c9438a9ddb831206a0fcdc7107cc6644a74a1e4..f3136288b305c07a7799f07711903e5a752edbb0 100644
|
| --- a/test/cctest/compiler/test-typer.cc
|
| +++ b/test/cctest/compiler/test-typer.cc
|
| @@ -2,20 +2,13 @@
|
| // Use of this source code is governed by a BSD-style license that can be
|
| // found in the LICENSE file.
|
|
|
| -
|
| -// This tests the correctness of the typer.
|
| -//
|
| -// For simplicity, it currently only tests it on expression operators that have
|
| -// a direct equivalent in C++. Also, testing is currently limited to ranges as
|
| -// input types.
|
| -
|
| -
|
| #include <functional>
|
|
|
| #include "src/compiler/node-properties-inl.h"
|
| #include "src/compiler/typer.h"
|
| #include "test/cctest/cctest.h"
|
| #include "test/cctest/compiler/graph-builder-tester.h"
|
| +#include "test/cctest/test-types.h"
|
|
|
| using namespace v8::internal;
|
| using namespace v8::internal::compiler;
|
| @@ -26,6 +19,7 @@ class TyperTester : public HandleAndZoneScope, public GraphAndBuilders {
|
| public:
|
| TyperTester()
|
| : GraphAndBuilders(main_zone()),
|
| + types_(main_zone(), isolate()),
|
| typer_(main_zone()),
|
| javascript_(main_zone()) {
|
| Node* s = graph()->NewNode(common()->Start(3));
|
| @@ -57,6 +51,7 @@ class TyperTester : public HandleAndZoneScope, public GraphAndBuilders {
|
| }
|
| }
|
|
|
| + Types<Type, Type*, Zone> types_;
|
| Typer typer_;
|
| JSOperatorBuilder javascript_;
|
| Node* context_node_;
|
| @@ -161,6 +156,26 @@ class TyperTester : public HandleAndZoneScope, public GraphAndBuilders {
|
| CHECK(result_type->Is(expected_type));
|
| }
|
| }
|
| +
|
| + Type* RandomSubtype(Type* type) {
|
| + Type* subtype;
|
| + do {
|
| + subtype = types_.Fuzz();
|
| + } while (!subtype->Is(type));
|
| + return subtype;
|
| + }
|
| +
|
| + void TestBinaryMonotonicity(const Operator* op) {
|
| + for (int i = 0; i < 50; ++i) {
|
| + Type* type1 = types_.Fuzz();
|
| + Type* type2 = types_.Fuzz();
|
| + Type* type = TypeBinaryOp(op, type1, type2);
|
| + Type* subtype1 = RandomSubtype(type1);;
|
| + Type* subtype2 = RandomSubtype(type2);;
|
| + Type* subtype = TypeBinaryOp(op, subtype1, subtype2);
|
| + CHECK(subtype->Is(type));
|
| + }
|
| + }
|
| };
|
|
|
|
|
| @@ -171,6 +186,13 @@ static int32_t bit_and(int32_t x, int32_t y) { return x & y; }
|
| static int32_t bit_xor(int32_t x, int32_t y) { return x ^ y; }
|
|
|
|
|
| +//------------------------------------------------------------------------------
|
| +// Soundness
|
| +// For simplicity, we currently only test soundness on expression operators
|
| +// that have a direct equivalent in C++. Also, testing is currently limited
|
| +// to ranges as input types.
|
| +
|
| +
|
| TEST(TypeJSAdd) {
|
| TyperTester t;
|
| t.TestBinaryArithOp(t.javascript_.Subtract(), std::plus<double>());
|
| @@ -275,3 +297,16 @@ TEST(TypeJSStrictNotEqual) {
|
| t.TestBinaryCompareOp(
|
| t.javascript_.StrictNotEqual(), std::not_equal_to<double>());
|
| }
|
| +
|
| +
|
| +//------------------------------------------------------------------------------
|
| +// Monotonicity
|
| +
|
| +
|
| +TEST(Monotonicity) {
|
| + TyperTester t;
|
| + #define TEST_TYPE(name, x, y, z) \
|
| + t.TestBinaryMonotonicity(t.javascript_.name());
|
| + SHARED_SIMPLE_BINOP_LIST(TEST_TYPE)
|
| + #undef TEST_TYPE
|
| +}
|
|
|