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 49f4320a8e60f2d4e83cd2ac491c362f46bad432..c377d760c95c0ba2c09ea74d3cc6d9254f61be2b 100644 |
--- a/test/unittests/wasm/asm-types-unittest.cc |
+++ b/test/unittests/wasm/asm-types-unittest.cc |
@@ -225,8 +225,16 @@ TEST_F(AsmTypeTest, Names) { |
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::Double())->Name(), |
- StrEq("(double, double...) -> double")); |
+ 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,6 +248,7 @@ TEST_F(AsmTypeTest, IsExactly) { |
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) { |
@@ -263,6 +272,7 @@ TEST_F(AsmTypeTest, IsA) { |
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) { |
@@ -357,6 +367,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. |
bradnelson
2016/06/17 23:38:50
Comment seems off here
John
2016/06/20 15:09:53
Done.
|
+ 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) { |
@@ -370,6 +441,7 @@ TEST_F(AsmTypeTest, IsReturnType) { |
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), |
}; |
std::unordered_set<Type*> return_types{ |
@@ -384,6 +456,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(), |
@@ -395,6 +499,7 @@ TEST_F(AsmTypeTest, IsParameterType) { |
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), |
}; |
std::unordered_set<Type*> parameter_types{ |
@@ -421,6 +526,7 @@ TEST_F(AsmTypeTest, IsComparableType) { |
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), |
}; |
std::unordered_set<Type*> comparable_types{ |
@@ -447,6 +553,7 @@ TEST_F(AsmTypeTest, ElementSizeInBytes) { |
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), |
}; |
auto ElementSizeInBytesForType = [](Type* type) -> int32_t { |
@@ -483,6 +590,7 @@ TEST_F(AsmTypeTest, LoadType) { |
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), |
}; |
auto LoadTypeForType = [](Type* type) -> Type* { |
@@ -519,6 +627,7 @@ TEST_F(AsmTypeTest, StoreType) { |
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), |
}; |
auto StoreTypeForType = [](Type* type) -> Type* { |