| Index: test/unittests/wasm/asm-types-unittest.cc
|
| diff --git a/test/unittests/wasm/asm-types-unittest.cc b/test/unittests/wasm/asm-types-unittest.cc
|
| index 0bca843dd238d138382b6546eec07a3860f751b9..328cb97d8f0714a8b89f53432bb4e2a7d42e0a63 100644
|
| --- a/test/unittests/wasm/asm-types-unittest.cc
|
| +++ b/test/unittests/wasm/asm-types-unittest.cc
|
| @@ -216,19 +216,22 @@ TEST_F(AsmTypeTest, Names) {
|
| ->Name(),
|
| StrEq("(double, float) -> int /\\ (int) -> int"));
|
|
|
| - EXPECT_THAT(Type::FroundType(zone(), Type::Int())->Name(),
|
| - StrEq("(int) -> float"));
|
| - EXPECT_THAT(Type::FroundType(zone(), Type::Floatish())->Name(),
|
| - StrEq("(floatish) -> float"));
|
| - EXPECT_THAT(Type::FroundType(zone(), Type::DoubleQ())->Name(),
|
| - StrEq("(double?) -> float"));
|
| -
|
| - EXPECT_THAT(Type::MinMaxType(zone(), Type::Int())->Name(),
|
| - StrEq("(int, int...) -> int"));
|
| - EXPECT_THAT(Type::MinMaxType(zone(), Type::Floatish())->Name(),
|
| - StrEq("(floatish, floatish...) -> floatish"));
|
| - EXPECT_THAT(Type::MinMaxType(zone(), Type::DoubleQ())->Name(),
|
| - StrEq("(double?, double?...) -> double?"));
|
| + EXPECT_THAT(Type::FroundType(zone())->Name(), StrEq("fround"));
|
| +
|
| + EXPECT_THAT(Type::MinMaxType(zone(), Type::Signed(), Type::Int())->Name(),
|
| + StrEq("(int, int...) -> signed"));
|
| + EXPECT_THAT(Type::MinMaxType(zone(), Type::Float(), Type::Floatish())->Name(),
|
| + StrEq("(floatish, floatish...) -> float"));
|
| + EXPECT_THAT(Type::MinMaxType(zone(), Type::Double(), Type::DoubleQ())->Name(),
|
| + StrEq("(double?, double?...) -> double"));
|
| +
|
| + EXPECT_THAT(Type::FFIType(zone())->Name(), StrEq("Function"));
|
| +
|
| + EXPECT_THAT(Type::FunctionTableType(zone(), 4)->Name(),
|
| + StrEq("[unbound][4]"));
|
| + auto* ft = Type::FunctionTableType(zone(), 15);
|
| + ft->AsFunctionTableType()->set_signature(Function(Type::Double)(Type::Int));
|
| + EXPECT_THAT(ft->Name(), StrEq("(int) -> double[15]"));
|
| }
|
|
|
| TEST_F(AsmTypeTest, IsExactly) {
|
| @@ -240,8 +243,9 @@ TEST_F(AsmTypeTest, IsExactly) {
|
| Function(Type::Int)(Type::DoubleQ),
|
| Overload(Function(Type::Int)(Type::Double)),
|
| Function(Type::Int)(Type::Int, Type::Int),
|
| - Type::MinMaxType(zone(), Type::Int()), Function(Type::Int)(Type::Float),
|
| - Type::FroundType(zone(), Type::Int()),
|
| + Type::MinMaxType(zone(), Type::Signed(), Type::Int()),
|
| + Function(Type::Int)(Type::Float), Type::FroundType(zone()),
|
| + Type::FFIType(zone()), Type::FunctionTableType(zone(), 10),
|
| };
|
|
|
| for (size_t ii = 0; ii < arraysize(test_types); ++ii) {
|
| @@ -263,8 +267,9 @@ TEST_F(AsmTypeTest, IsA) {
|
| Function(Type::Int)(Type::DoubleQ),
|
| Overload(Function(Type::Int)(Type::Double)),
|
| Function(Type::Int)(Type::Int, Type::Int),
|
| - Type::MinMaxType(zone(), Type::Int()), Function(Type::Int)(Type::Float),
|
| - Type::FroundType(zone(), Type::Int()),
|
| + Type::MinMaxType(zone(), Type::Signed(), Type::Int()),
|
| + Function(Type::Int)(Type::Float), Type::FroundType(zone()),
|
| + Type::FFIType(zone()), Type::FunctionTableType(zone(), 10),
|
| };
|
|
|
| for (size_t ii = 0; ii < arraysize(test_types); ++ii) {
|
| @@ -279,21 +284,23 @@ TEST_F(AsmTypeTest, IsA) {
|
| }
|
|
|
| TEST_F(AsmTypeTest, ValidateCall) {
|
| - auto* min_max_int = Type::MinMaxType(zone(), Type::Int());
|
| - auto* i2i = Function(Type::Int)(Type::Int);
|
| - auto* ii2i = Function(Type::Int)(Type::Int, Type::Int);
|
| - auto* iii2i = Function(Type::Int)(Type::Int, Type::Int, Type::Int);
|
| - auto* iiii2i =
|
| - Function(Type::Int)(Type::Int, Type::Int, Type::Int, Type::Int);
|
| -
|
| - EXPECT_EQ(Type::Int(),
|
| + auto* min_max_int = Type::MinMaxType(zone(), Type::Signed(), Type::Int());
|
| + auto* i2s = Function(Type::Signed)(Type::Int);
|
| + auto* ii2s = Function(Type::Signed)(Type::Int, Type::Int);
|
| + auto* iii2s = Function(Type::Signed)(Type::Int, Type::Int, Type::Int);
|
| + auto* iiii2s =
|
| + Function(Type::Signed)(Type::Int, Type::Int, Type::Int, Type::Int);
|
| +
|
| + EXPECT_EQ(Type::Signed(),
|
| min_max_int->AsCallableType()->ValidateCall(min_max_int));
|
| - EXPECT_EQ(Type::Int(), min_max_int->AsCallableType()->ValidateCall(ii2i));
|
| - EXPECT_EQ(Type::Int(), min_max_int->AsCallableType()->ValidateCall(iii2i));
|
| - EXPECT_EQ(Type::Int(), min_max_int->AsCallableType()->ValidateCall(iiii2i));
|
| - EXPECT_EQ(Type::None(), min_max_int->AsCallableType()->ValidateCall(i2i));
|
| -
|
| - auto* min_max_double = Type::MinMaxType(zone(), Type::Double());
|
| + EXPECT_EQ(Type::Signed(), min_max_int->AsCallableType()->ValidateCall(ii2s));
|
| + EXPECT_EQ(Type::Signed(), min_max_int->AsCallableType()->ValidateCall(iii2s));
|
| + EXPECT_EQ(Type::Signed(),
|
| + min_max_int->AsCallableType()->ValidateCall(iiii2s));
|
| + EXPECT_EQ(Type::None(), min_max_int->AsCallableType()->ValidateCall(i2s));
|
| +
|
| + auto* min_max_double =
|
| + Type::MinMaxType(zone(), Type::Double(), Type::Double());
|
| auto* d2d = Function(Type::Double)(Type::Double);
|
| auto* dd2d = Function(Type::Double)(Type::Double, Type::Double);
|
| auto* ddd2d =
|
| @@ -312,29 +319,20 @@ TEST_F(AsmTypeTest, ValidateCall) {
|
|
|
| auto* min_max = Overload(min_max_int, min_max_double);
|
| EXPECT_EQ(Type::None(), min_max->AsCallableType()->ValidateCall(min_max));
|
| - EXPECT_EQ(Type::None(), min_max->AsCallableType()->ValidateCall(i2i));
|
| + EXPECT_EQ(Type::None(), min_max->AsCallableType()->ValidateCall(i2s));
|
| EXPECT_EQ(Type::None(), min_max->AsCallableType()->ValidateCall(d2d));
|
| - EXPECT_EQ(Type::Int(), min_max->AsCallableType()->ValidateCall(min_max_int));
|
| - EXPECT_EQ(Type::Int(), min_max->AsCallableType()->ValidateCall(ii2i));
|
| - EXPECT_EQ(Type::Int(), min_max->AsCallableType()->ValidateCall(iii2i));
|
| - EXPECT_EQ(Type::Int(), min_max->AsCallableType()->ValidateCall(iiii2i));
|
| + EXPECT_EQ(Type::Signed(),
|
| + min_max->AsCallableType()->ValidateCall(min_max_int));
|
| + EXPECT_EQ(Type::Signed(), min_max->AsCallableType()->ValidateCall(ii2s));
|
| + EXPECT_EQ(Type::Signed(), min_max->AsCallableType()->ValidateCall(iii2s));
|
| + EXPECT_EQ(Type::Signed(), min_max->AsCallableType()->ValidateCall(iiii2s));
|
| EXPECT_EQ(Type::Double(),
|
| min_max->AsCallableType()->ValidateCall(min_max_double));
|
| EXPECT_EQ(Type::Double(), min_max->AsCallableType()->ValidateCall(dd2d));
|
| EXPECT_EQ(Type::Double(), min_max->AsCallableType()->ValidateCall(ddd2d));
|
| EXPECT_EQ(Type::Double(), min_max->AsCallableType()->ValidateCall(dddd2d));
|
|
|
| - auto* fround_floatish = Type::FroundType(zone(), Type::Floatish());
|
| - auto* fround_floatq = Type::FroundType(zone(), Type::FloatQ());
|
| - auto* fround_float = Type::FroundType(zone(), Type::Float());
|
| - auto* fround_doubleq = Type::FroundType(zone(), Type::DoubleQ());
|
| - auto* fround_double = Type::FroundType(zone(), Type::Double());
|
| - auto* fround_signed = Type::FroundType(zone(), Type::Signed());
|
| - auto* fround_unsigned = Type::FroundType(zone(), Type::Unsigned());
|
| - auto* fround_fixnum = Type::FroundType(zone(), Type::FixNum());
|
| - auto* fround =
|
| - Overload(fround_floatish, fround_floatq, fround_float, fround_doubleq,
|
| - fround_double, fround_signed, fround_unsigned, fround_fixnum);
|
| + auto* fround = Type::FroundType(zone());
|
|
|
| EXPECT_EQ(Type::Float(), fround->AsCallableType()->ValidateCall(
|
| Function(Type::Float)(Type::Floatish)));
|
| @@ -366,6 +364,67 @@ TEST_F(AsmTypeTest, ValidateCall) {
|
| EXPECT_EQ(Type::Int(), overload->AsCallableType()->ValidateCall(idif2i));
|
| EXPECT_EQ(Type::None(), overload->AsCallableType()->ValidateCall(i2d));
|
| EXPECT_EQ(Type::None(), i2f->AsCallableType()->ValidateCall(i2d));
|
| +
|
| + auto* ffi = Type::FFIType(zone());
|
| + AsmType* (*kReturnTypes[])() = {
|
| + Type::Void, Type::Double, Type::Signed,
|
| + };
|
| + AsmType* (*kExternTypes[])() = {
|
| + Type::Double, Type::Signed, Type::FixNum,
|
| + };
|
| + for (size_t ii = 0; ii < arraysize(kReturnTypes); ++ii) {
|
| + for (size_t jj = 0; jj < arraysize(kExternTypes); ++jj) {
|
| + auto* f = Function(kReturnTypes[ii])(kExternTypes[jj]);
|
| + EXPECT_EQ(kReturnTypes[ii](), ffi->AsCallableType()->ValidateCall(f))
|
| + << kReturnTypes[ii]()->Name();
|
| +
|
| + // Call with extern type should fail.
|
| + f = Function(kReturnTypes[ii])(kExternTypes[jj], Type::Int);
|
| + EXPECT_EQ(Type::None(), ffi->AsCallableType()->ValidateCall(f))
|
| + << kReturnTypes[ii]()->Name();
|
| + }
|
| + }
|
| +
|
| + auto* ft0 = Type::FunctionTableType(zone(), 10);
|
| + ft0->AsFunctionTableType()->set_signature(fi2d);
|
| + EXPECT_EQ(Type::Double(), ft0->AsCallableType()->ValidateCall(fi2d));
|
| + EXPECT_EQ(Type::None(), ft0->AsCallableType()->ValidateCall(i2d));
|
| +
|
| + auto* ft1 = Type::FunctionTableType(zone(), 10);
|
| + EXPECT_EQ(Type::Double(), ft1->AsCallableType()->ValidateCall(fi2d));
|
| + EXPECT_EQ(Type::Double(), ft1->AsCallableType()->ValidateCall(fi2d));
|
| + EXPECT_EQ(Type::None(), ft1->AsCallableType()->ValidateCall(i2d));
|
| +}
|
| +
|
| +TEST_F(AsmTypeTest, ToReturnType) {
|
| + std::unordered_map<AsmType*, AsmType*> kToReturnType = {
|
| + {Type::Signed(), Type::Signed()}, {Type::FixNum(), Type::Signed()},
|
| + {Type::Double(), Type::Double()}, {Type::Float(), Type::Float()},
|
| + {Type::Void(), Type::Void()},
|
| + };
|
| +
|
| + Type* test_types[] = {
|
| +#define CREATE(CamelName, string_name, number, parent_types) Type::CamelName(),
|
| + FOR_EACH_ASM_VALUE_TYPE_LIST(CREATE)
|
| +#undef CREATE
|
| + Function(Type::Int)(Type::Double),
|
| + Function(Type::Int)(Type::DoubleQ),
|
| + Overload(Function(Type::Int)(Type::Double)),
|
| + Function(Type::Int)(Type::Int, Type::Int),
|
| + Type::MinMaxType(zone(), Type::Signed(), Type::Int()),
|
| + Function(Type::Int)(Type::Float), Type::FroundType(zone()),
|
| + Type::FFIType(zone()), Type::FunctionTableType(zone(), 10),
|
| + };
|
| +
|
| + for (size_t ii = 0; ii < arraysize(test_types); ++ii) {
|
| + auto* return_type = Type::None();
|
| + auto to_return_type_iter = kToReturnType.find(test_types[ii]);
|
| + if (to_return_type_iter != kToReturnType.end()) {
|
| + return_type = to_return_type_iter->second;
|
| + }
|
| + EXPECT_EQ(return_type, test_types[ii]->ToReturnType())
|
| + << return_type->Name() << " != " << test_types[ii]->ToReturnType();
|
| + }
|
| }
|
|
|
| TEST_F(AsmTypeTest, IsReturnType) {
|
| @@ -377,8 +436,9 @@ TEST_F(AsmTypeTest, IsReturnType) {
|
| Function(Type::Int)(Type::DoubleQ),
|
| Overload(Function(Type::Int)(Type::Double)),
|
| Function(Type::Int)(Type::Int, Type::Int),
|
| - Type::MinMaxType(zone(), Type::Int()), Function(Type::Int)(Type::Float),
|
| - Type::FroundType(zone(), Type::Int()),
|
| + Type::MinMaxType(zone(), Type::Signed(), Type::Int()),
|
| + Function(Type::Int)(Type::Float), Type::FroundType(zone()),
|
| + Type::FFIType(zone()), Type::FunctionTableType(zone(), 10),
|
| };
|
|
|
| std::unordered_set<Type*> return_types{
|
| @@ -393,6 +453,38 @@ TEST_F(AsmTypeTest, IsReturnType) {
|
| }
|
| }
|
|
|
| +TEST_F(AsmTypeTest, ToParameterType) {
|
| + std::unordered_map<AsmType*, AsmType*> kToParameterType = {
|
| + {Type::Int(), Type::Int()}, {Type::Signed(), Type::Int()},
|
| + {Type::Unsigned(), Type::Int()}, {Type::FixNum(), Type::Int()},
|
| + {Type::Double(), Type::Double()}, {Type::Float(), Type::Float()},
|
| + };
|
| +
|
| + Type* test_types[] = {
|
| +#define CREATE(CamelName, string_name, number, parent_types) Type::CamelName(),
|
| + FOR_EACH_ASM_VALUE_TYPE_LIST(CREATE)
|
| +#undef CREATE
|
| + Function(Type::Int)(Type::Double),
|
| + Function(Type::Int)(Type::DoubleQ),
|
| + Overload(Function(Type::Int)(Type::Double)),
|
| + Function(Type::Int)(Type::Int, Type::Int),
|
| + Type::MinMaxType(zone(), Type::Signed(), Type::Int()),
|
| + Function(Type::Int)(Type::Float), Type::FroundType(zone()),
|
| + Type::FFIType(zone()), Type::FunctionTableType(zone(), 10),
|
| + };
|
| +
|
| + for (size_t ii = 0; ii < arraysize(test_types); ++ii) {
|
| + auto* parameter_type = Type::None();
|
| + auto to_parameter_type_iter = kToParameterType.find(test_types[ii]);
|
| + if (to_parameter_type_iter != kToParameterType.end()) {
|
| + parameter_type = to_parameter_type_iter->second;
|
| + }
|
| + EXPECT_EQ(parameter_type, test_types[ii]->ToParameterType())
|
| + << parameter_type->Name()
|
| + << " != " << test_types[ii]->ToParameterType();
|
| + }
|
| +}
|
| +
|
| TEST_F(AsmTypeTest, IsParameterType) {
|
| Type* test_types[] = {
|
| #define CREATE(CamelName, string_name, number, parent_types) Type::CamelName(),
|
| @@ -402,8 +494,9 @@ TEST_F(AsmTypeTest, IsParameterType) {
|
| Function(Type::Int)(Type::DoubleQ),
|
| Overload(Function(Type::Int)(Type::Double)),
|
| Function(Type::Int)(Type::Int, Type::Int),
|
| - Type::MinMaxType(zone(), Type::Int()), Function(Type::Int)(Type::Float),
|
| - Type::FroundType(zone(), Type::Int()),
|
| + Type::MinMaxType(zone(), Type::Signed(), Type::Int()),
|
| + Function(Type::Int)(Type::Float), Type::FroundType(zone()),
|
| + Type::FFIType(zone()), Type::FunctionTableType(zone(), 10),
|
| };
|
|
|
| std::unordered_set<Type*> parameter_types{
|
| @@ -428,8 +521,9 @@ TEST_F(AsmTypeTest, IsComparableType) {
|
| Function(Type::Int)(Type::DoubleQ),
|
| Overload(Function(Type::Int)(Type::Double)),
|
| Function(Type::Int)(Type::Int, Type::Int),
|
| - Type::MinMaxType(zone(), Type::Int()), Function(Type::Int)(Type::Float),
|
| - Type::FroundType(zone(), Type::Int()),
|
| + Type::MinMaxType(zone(), Type::Signed(), Type::Int()),
|
| + Function(Type::Int)(Type::Float), Type::FroundType(zone()),
|
| + Type::FFIType(zone()), Type::FunctionTableType(zone(), 10),
|
| };
|
|
|
| std::unordered_set<Type*> comparable_types{
|
| @@ -454,8 +548,9 @@ TEST_F(AsmTypeTest, ElementSizeInBytes) {
|
| Function(Type::Int)(Type::DoubleQ),
|
| Overload(Function(Type::Int)(Type::Double)),
|
| Function(Type::Int)(Type::Int, Type::Int),
|
| - Type::MinMaxType(zone(), Type::Int()), Function(Type::Int)(Type::Float),
|
| - Type::FroundType(zone(), Type::Int()),
|
| + Type::MinMaxType(zone(), Type::Signed(), Type::Int()),
|
| + Function(Type::Int)(Type::Float), Type::FroundType(zone()),
|
| + Type::FFIType(zone()), Type::FunctionTableType(zone(), 10),
|
| };
|
|
|
| auto ElementSizeInBytesForType = [](Type* type) -> int32_t {
|
| @@ -490,8 +585,9 @@ TEST_F(AsmTypeTest, LoadType) {
|
| Function(Type::Int)(Type::DoubleQ),
|
| Overload(Function(Type::Int)(Type::Double)),
|
| Function(Type::Int)(Type::Int, Type::Int),
|
| - Type::MinMaxType(zone(), Type::Int()), Function(Type::Int)(Type::Float),
|
| - Type::FroundType(zone(), Type::Int()),
|
| + Type::MinMaxType(zone(), Type::Signed(), Type::Int()),
|
| + Function(Type::Int)(Type::Float), Type::FroundType(zone()),
|
| + Type::FFIType(zone()), Type::FunctionTableType(zone(), 10),
|
| };
|
|
|
| auto LoadTypeForType = [](Type* type) -> Type* {
|
| @@ -526,8 +622,9 @@ TEST_F(AsmTypeTest, StoreType) {
|
| Function(Type::Int)(Type::DoubleQ),
|
| Overload(Function(Type::Int)(Type::Double)),
|
| Function(Type::Int)(Type::Int, Type::Int),
|
| - Type::MinMaxType(zone(), Type::Int()), Function(Type::Int)(Type::Float),
|
| - Type::FroundType(zone(), Type::Int()),
|
| + Type::MinMaxType(zone(), Type::Signed(), Type::Int()),
|
| + Function(Type::Int)(Type::Float), Type::FroundType(zone()),
|
| + Type::FFIType(zone()), Type::FunctionTableType(zone(), 10),
|
| };
|
|
|
| auto StoreTypeForType = [](Type* type) -> Type* {
|
|
|