 Chromium Code Reviews
 Chromium Code Reviews Issue 2148073002:
  V8. ASM-2-WASM. Fixes technical debt in asm-types.  (Closed) 
  Base URL: https://chromium.googlesource.com/v8/v8.git@master
    
  
    Issue 2148073002:
  V8. ASM-2-WASM. Fixes technical debt in asm-types.  (Closed) 
  Base URL: https://chromium.googlesource.com/v8/v8.git@master| 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 b4fbb77dcdccc5bc37c0b391c0d6e4db01471866..4b9096d17d061235902891f3ad1d45b8eba2a195 100644 | 
| --- a/test/unittests/wasm/asm-types-unittest.cc | 
| +++ b/test/unittests/wasm/asm-types-unittest.cc | 
| @@ -33,18 +33,23 @@ class AsmTypeTest : public TestWithZone { | 
| {Type::Int32Array(), {Type::Heap()}}, | 
| {Type::Float32Array(), {Type::Heap()}}, | 
| {Type::Float64Array(), {Type::Heap()}}, | 
| - {Type::FloatishDoubleQ(), {Type::Floatish(), Type::DoubleQ()}}, | 
| - {Type::FloatQDoubleQ(), | 
| - {Type::FloatQ(), Type::Floatish(), Type::DoubleQ()}}, | 
| - {Type::Float(), {Type::FloatQ(), Type::Floatish()}}, | 
| - {Type::FloatQ(), {Type::Floatish()}}, | 
| + {Type::Float(), | 
| + {Type::FloatishDoubleQ(), Type::FloatQDoubleQ(), Type::FloatQ(), | 
| + Type::Floatish()}}, | 
| + {Type::Floatish(), {Type::FloatishDoubleQ()}}, | 
| + {Type::FloatQ(), | 
| + {Type::FloatishDoubleQ(), Type::FloatQDoubleQ(), | 
| + Type::Floatish()}}, | 
| {Type::FixNum(), | 
| {Type::Signed(), Type::Extern(), Type::Unsigned(), Type::Int(), | 
| Type::Intish()}}, | 
| {Type::Unsigned(), {Type::Int(), Type::Intish()}}, | 
| {Type::Signed(), {Type::Extern(), Type::Int(), Type::Intish()}}, | 
| {Type::Int(), {Type::Intish()}}, | 
| - {Type::Double(), {Type::DoubleQ(), Type::Extern()}}, | 
| + {Type::DoubleQ(), {Type::FloatishDoubleQ(), Type::FloatQDoubleQ()}}, | 
| + {Type::Double(), | 
| + {Type::FloatishDoubleQ(), Type::FloatQDoubleQ(), Type::DoubleQ(), | 
| + Type::Extern()}}, | 
| }) {} | 
| protected: | 
| @@ -232,7 +237,7 @@ TEST_F(AsmTypeTest, Names) { | 
| auto* ft = | 
| Type::FunctionTableType(zone(), 15, Function(Type::Double)(Type::Int)); | 
| - EXPECT_THAT(ft->Name(), StrEq("(int) -> double[15]")); | 
| + EXPECT_THAT(ft->Name(), StrEq("((int) -> double)[15]")); | 
| } | 
| TEST_F(AsmTypeTest, IsExactly) { | 
| @@ -260,12 +265,22 @@ TEST_F(AsmTypeTest, IsExactly) { | 
| } | 
| } | 
| +bool FunctionsWithSameSignature(AsmType* a, AsmType* b) { | 
| + if (auto* func_a = a->AsFunctionType()) { | 
| 
John
2016/07/13 22:54:36
Brad, I'm OOO right now, so can you please send a
 | 
| + if (auto* func_b = b->AsFunctionType()) { | 
| + return a->IsA(b); | 
| + } | 
| + } | 
| + return false; | 
| +} | 
| + | 
| TEST_F(AsmTypeTest, IsA) { | 
| 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::Int, Type::Int), | 
| Function(Type::Int)(Type::DoubleQ), | 
| Overload(Function(Type::Int)(Type::Double)), | 
| Function(Type::Int)(Type::Int, Type::Int), | 
| @@ -278,15 +293,24 @@ TEST_F(AsmTypeTest, IsA) { | 
| for (size_t ii = 0; ii < arraysize(test_types); ++ii) { | 
| for (size_t jj = 0; jj < arraysize(test_types); ++jj) { | 
| const bool Expected = | 
| - (ii == jj) || ParentsOf(test_types[ii]).count(test_types[jj]) != 0; | 
| + (ii == jj) || ParentsOf(test_types[ii]).count(test_types[jj]) != 0 || | 
| + FunctionsWithSameSignature(test_types[ii], test_types[jj]); | 
| EXPECT_EQ(Expected, test_types[ii]->IsA(test_types[jj])) | 
| << test_types[ii]->Name() << (Expected ? " is not a " : " is a ") | 
| << test_types[jj]->Name(); | 
| } | 
| } | 
| + | 
| + EXPECT_TRUE(Function(Type::Int)(Type::Int, Type::Int) | 
| + ->IsA(Function(Type::Int)(Type::Int, Type::Int))); | 
| + | 
| + EXPECT_FALSE(Function(Type::Int)(Type::Int, Type::Int) | 
| + ->IsA(Function(Type::Double)(Type::Int, Type::Int))); | 
| + EXPECT_FALSE(Function(Type::Int)(Type::Int, Type::Int) | 
| + ->IsA(Function(Type::Int)(Type::Double, Type::Int))); | 
| } | 
| -TEST_F(AsmTypeTest, ValidateCall) { | 
| +TEST_F(AsmTypeTest, CanBeInvokedWith) { | 
| 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); | 
| @@ -294,21 +318,17 @@ TEST_F(AsmTypeTest, ValidateCall) { | 
| 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->AsFunctionType()->ReturnType(), | 
| - min_max_int->AsFunctionType()->Arguments())); | 
| - EXPECT_EQ(Type::Signed(), min_max_int->AsCallableType()->ValidateCall( | 
| - ii2s->AsFunctionType()->ReturnType(), | 
| - ii2s->AsFunctionType()->Arguments())); | 
| - EXPECT_EQ(Type::Signed(), min_max_int->AsCallableType()->ValidateCall( | 
| - iii2s->AsFunctionType()->ReturnType(), | 
| - iii2s->AsFunctionType()->Arguments())); | 
| - EXPECT_EQ(Type::Signed(), min_max_int->AsCallableType()->ValidateCall( | 
| - iiii2s->AsFunctionType()->ReturnType(), | 
| - iiii2s->AsFunctionType()->Arguments())); | 
| - EXPECT_EQ(Type::None(), min_max_int->AsCallableType()->ValidateCall( | 
| - i2s->AsFunctionType()->ReturnType(), | 
| - i2s->AsFunctionType()->Arguments())); | 
| + EXPECT_TRUE(min_max_int->AsCallableType()->CanBeInvokedWith( | 
| + ii2s->AsFunctionType()->ReturnType(), | 
| + ii2s->AsFunctionType()->Arguments())); | 
| + EXPECT_TRUE(min_max_int->AsCallableType()->CanBeInvokedWith( | 
| + iii2s->AsFunctionType()->ReturnType(), | 
| + iii2s->AsFunctionType()->Arguments())); | 
| + EXPECT_TRUE(min_max_int->AsCallableType()->CanBeInvokedWith( | 
| + iiii2s->AsFunctionType()->ReturnType(), | 
| + iiii2s->AsFunctionType()->Arguments())); | 
| + EXPECT_FALSE(min_max_int->AsCallableType()->CanBeInvokedWith( | 
| + i2s->AsFunctionType()->ReturnType(), i2s->AsFunctionType()->Arguments())); | 
| auto* min_max_double = | 
| Type::MinMaxType(zone(), Type::Double(), Type::Double()); | 
| @@ -318,88 +338,68 @@ TEST_F(AsmTypeTest, ValidateCall) { | 
| Function(Type::Double)(Type::Double, Type::Double, Type::Double); | 
| auto* dddd2d = Function(Type::Double)(Type::Double, Type::Double, | 
| Type::Double, Type::Double); | 
| - EXPECT_EQ(Type::Double(), min_max_double->AsCallableType()->ValidateCall( | 
| - min_max_double->AsFunctionType()->ReturnType(), | 
| - min_max_double->AsFunctionType()->Arguments())); | 
| - EXPECT_EQ(Type::Double(), min_max_double->AsCallableType()->ValidateCall( | 
| - dd2d->AsFunctionType()->ReturnType(), | 
| - dd2d->AsFunctionType()->Arguments())); | 
| - EXPECT_EQ(Type::Double(), min_max_double->AsCallableType()->ValidateCall( | 
| - ddd2d->AsFunctionType()->ReturnType(), | 
| - ddd2d->AsFunctionType()->Arguments())); | 
| - EXPECT_EQ(Type::Double(), min_max_double->AsCallableType()->ValidateCall( | 
| - dddd2d->AsFunctionType()->ReturnType(), | 
| - dddd2d->AsFunctionType()->Arguments())); | 
| - EXPECT_EQ(Type::None(), min_max_double->AsCallableType()->ValidateCall( | 
| - d2d->AsFunctionType()->ReturnType(), | 
| - d2d->AsFunctionType()->Arguments())); | 
| + EXPECT_TRUE(min_max_double->AsCallableType()->CanBeInvokedWith( | 
| + dd2d->AsFunctionType()->ReturnType(), | 
| + dd2d->AsFunctionType()->Arguments())); | 
| + EXPECT_TRUE(min_max_double->AsCallableType()->CanBeInvokedWith( | 
| + ddd2d->AsFunctionType()->ReturnType(), | 
| + ddd2d->AsFunctionType()->Arguments())); | 
| + EXPECT_TRUE(min_max_double->AsCallableType()->CanBeInvokedWith( | 
| + dddd2d->AsFunctionType()->ReturnType(), | 
| + dddd2d->AsFunctionType()->Arguments())); | 
| + EXPECT_FALSE(min_max_double->AsCallableType()->CanBeInvokedWith( | 
| + d2d->AsFunctionType()->ReturnType(), d2d->AsFunctionType()->Arguments())); | 
| auto* min_max = Overload(min_max_int, min_max_double); | 
| - EXPECT_EQ(Type::None(), min_max->AsCallableType()->ValidateCall( | 
| - i2s->AsFunctionType()->ReturnType(), | 
| - i2s->AsFunctionType()->Arguments())); | 
| - EXPECT_EQ(Type::None(), min_max->AsCallableType()->ValidateCall( | 
| - d2d->AsFunctionType()->ReturnType(), | 
| - d2d->AsFunctionType()->Arguments())); | 
| - EXPECT_EQ(Type::Signed(), min_max->AsCallableType()->ValidateCall( | 
| - min_max_int->AsFunctionType()->ReturnType(), | 
| - min_max_int->AsFunctionType()->Arguments())); | 
| - EXPECT_EQ(Type::Signed(), min_max->AsCallableType()->ValidateCall( | 
| - ii2s->AsFunctionType()->ReturnType(), | 
| - ii2s->AsFunctionType()->Arguments())); | 
| - EXPECT_EQ(Type::Signed(), min_max->AsCallableType()->ValidateCall( | 
| - iii2s->AsFunctionType()->ReturnType(), | 
| - iii2s->AsFunctionType()->Arguments())); | 
| - EXPECT_EQ(Type::Signed(), min_max->AsCallableType()->ValidateCall( | 
| - iiii2s->AsFunctionType()->ReturnType(), | 
| - iiii2s->AsFunctionType()->Arguments())); | 
| - EXPECT_EQ(Type::Double(), min_max->AsCallableType()->ValidateCall( | 
| - min_max_double->AsFunctionType()->ReturnType(), | 
| - min_max_double->AsFunctionType()->Arguments())); | 
| - EXPECT_EQ(Type::Double(), min_max->AsCallableType()->ValidateCall( | 
| - dd2d->AsFunctionType()->ReturnType(), | 
| - dd2d->AsFunctionType()->Arguments())); | 
| - EXPECT_EQ(Type::Double(), min_max->AsCallableType()->ValidateCall( | 
| - ddd2d->AsFunctionType()->ReturnType(), | 
| - ddd2d->AsFunctionType()->Arguments())); | 
| - EXPECT_EQ(Type::Double(), min_max->AsCallableType()->ValidateCall( | 
| - dddd2d->AsFunctionType()->ReturnType(), | 
| - dddd2d->AsFunctionType()->Arguments())); | 
| + EXPECT_FALSE(min_max->AsCallableType()->CanBeInvokedWith( | 
| + i2s->AsFunctionType()->ReturnType(), i2s->AsFunctionType()->Arguments())); | 
| + EXPECT_FALSE(min_max->AsCallableType()->CanBeInvokedWith( | 
| + d2d->AsFunctionType()->ReturnType(), d2d->AsFunctionType()->Arguments())); | 
| + EXPECT_TRUE(min_max->AsCallableType()->CanBeInvokedWith( | 
| + ii2s->AsFunctionType()->ReturnType(), | 
| + ii2s->AsFunctionType()->Arguments())); | 
| + EXPECT_TRUE(min_max->AsCallableType()->CanBeInvokedWith( | 
| + iii2s->AsFunctionType()->ReturnType(), | 
| + iii2s->AsFunctionType()->Arguments())); | 
| + EXPECT_TRUE(min_max->AsCallableType()->CanBeInvokedWith( | 
| + iiii2s->AsFunctionType()->ReturnType(), | 
| + iiii2s->AsFunctionType()->Arguments())); | 
| + EXPECT_TRUE(min_max->AsCallableType()->CanBeInvokedWith( | 
| + dd2d->AsFunctionType()->ReturnType(), | 
| + dd2d->AsFunctionType()->Arguments())); | 
| + EXPECT_TRUE(min_max->AsCallableType()->CanBeInvokedWith( | 
| + ddd2d->AsFunctionType()->ReturnType(), | 
| + ddd2d->AsFunctionType()->Arguments())); | 
| + EXPECT_TRUE(min_max->AsCallableType()->CanBeInvokedWith( | 
| + dddd2d->AsFunctionType()->ReturnType(), | 
| + dddd2d->AsFunctionType()->Arguments())); | 
| auto* fround = Type::FroundType(zone()); | 
| ZoneVector<AsmType*> arg(zone()); | 
| arg.push_back(Type::Floatish()); | 
| - EXPECT_EQ(Type::Float(), | 
| - fround->AsCallableType()->ValidateCall(Type::Float(), arg)); | 
| + EXPECT_TRUE(fround->AsCallableType()->CanBeInvokedWith(Type::Float(), arg)); | 
| arg.clear(); | 
| arg.push_back(Type::FloatQ()); | 
| - EXPECT_EQ(Type::Float(), | 
| - fround->AsCallableType()->ValidateCall(Type::Float(), arg)); | 
| + EXPECT_TRUE(fround->AsCallableType()->CanBeInvokedWith(Type::Float(), arg)); | 
| arg.clear(); | 
| arg.push_back(Type::Float()); | 
| - EXPECT_EQ(Type::Float(), | 
| - fround->AsCallableType()->ValidateCall(Type::Float(), arg)); | 
| + EXPECT_TRUE(fround->AsCallableType()->CanBeInvokedWith(Type::Float(), arg)); | 
| arg.clear(); | 
| arg.push_back(Type::DoubleQ()); | 
| - EXPECT_EQ(Type::Float(), | 
| - fround->AsCallableType()->ValidateCall(Type::Float(), arg)); | 
| + EXPECT_TRUE(fround->AsCallableType()->CanBeInvokedWith(Type::Float(), arg)); | 
| arg.clear(); | 
| arg.push_back(Type::Double()); | 
| - EXPECT_EQ(Type::Float(), | 
| - fround->AsCallableType()->ValidateCall(Type::Float(), arg)); | 
| + EXPECT_TRUE(fround->AsCallableType()->CanBeInvokedWith(Type::Float(), arg)); | 
| arg.clear(); | 
| arg.push_back(Type::Signed()); | 
| - EXPECT_EQ(Type::Float(), | 
| - fround->AsCallableType()->ValidateCall(Type::Float(), arg)); | 
| + EXPECT_TRUE(fround->AsCallableType()->CanBeInvokedWith(Type::Float(), arg)); | 
| arg.clear(); | 
| arg.push_back(Type::Unsigned()); | 
| - EXPECT_EQ(Type::Float(), | 
| - fround->AsCallableType()->ValidateCall(Type::Float(), arg)); | 
| + EXPECT_TRUE(fround->AsCallableType()->CanBeInvokedWith(Type::Float(), arg)); | 
| arg.clear(); | 
| arg.push_back(Type::FixNum()); | 
| - EXPECT_EQ(Type::Float(), | 
| - fround->AsCallableType()->ValidateCall(Type::Float(), arg)); | 
| + EXPECT_TRUE(fround->AsCallableType()->CanBeInvokedWith(Type::Float(), arg)); | 
| auto* idf2v = Function(Type::Void)(Type::Int, Type::Double, Type::Float); | 
| auto* i2d = Function(Type::Double)(Type::Int); | 
| @@ -408,24 +408,21 @@ TEST_F(AsmTypeTest, ValidateCall) { | 
| auto* idif2i = | 
| Function(Type::Int)(Type::Int, Type::Double, Type::Int, Type::Float); | 
| auto* overload = Overload(idf2v, i2f, /*i2d missing, */ fi2d, idif2i); | 
| - EXPECT_EQ(Type::Void(), overload->AsCallableType()->ValidateCall( | 
| - idf2v->AsFunctionType()->ReturnType(), | 
| - idf2v->AsFunctionType()->Arguments())); | 
| - EXPECT_EQ(Type::Float(), overload->AsCallableType()->ValidateCall( | 
| - i2f->AsFunctionType()->ReturnType(), | 
| - i2f->AsFunctionType()->Arguments())); | 
| - EXPECT_EQ(Type::Double(), overload->AsCallableType()->ValidateCall( | 
| - fi2d->AsFunctionType()->ReturnType(), | 
| - fi2d->AsFunctionType()->Arguments())); | 
| - EXPECT_EQ(Type::Int(), overload->AsCallableType()->ValidateCall( | 
| - idif2i->AsFunctionType()->ReturnType(), | 
| - idif2i->AsFunctionType()->Arguments())); | 
| - EXPECT_EQ(Type::None(), overload->AsCallableType()->ValidateCall( | 
| - i2d->AsFunctionType()->ReturnType(), | 
| - i2d->AsFunctionType()->Arguments())); | 
| - EXPECT_EQ(Type::None(), i2f->AsCallableType()->ValidateCall( | 
| - i2d->AsFunctionType()->ReturnType(), | 
| - i2d->AsFunctionType()->Arguments())); | 
| + EXPECT_TRUE(overload->AsCallableType()->CanBeInvokedWith( | 
| + idf2v->AsFunctionType()->ReturnType(), | 
| + idf2v->AsFunctionType()->Arguments())); | 
| + EXPECT_TRUE(overload->AsCallableType()->CanBeInvokedWith( | 
| + i2f->AsFunctionType()->ReturnType(), i2f->AsFunctionType()->Arguments())); | 
| + EXPECT_TRUE(overload->AsCallableType()->CanBeInvokedWith( | 
| + fi2d->AsFunctionType()->ReturnType(), | 
| + fi2d->AsFunctionType()->Arguments())); | 
| + EXPECT_TRUE(overload->AsCallableType()->CanBeInvokedWith( | 
| + idif2i->AsFunctionType()->ReturnType(), | 
| + idif2i->AsFunctionType()->Arguments())); | 
| + EXPECT_FALSE(overload->AsCallableType()->CanBeInvokedWith( | 
| + i2d->AsFunctionType()->ReturnType(), i2d->AsFunctionType()->Arguments())); | 
| + EXPECT_FALSE(i2f->AsCallableType()->CanBeInvokedWith( | 
| + i2d->AsFunctionType()->ReturnType(), i2d->AsFunctionType()->Arguments())); | 
| auto* ffi = Type::FFIType(zone()); | 
| AsmType* (*kReturnTypes[])() = { | 
| @@ -437,27 +434,24 @@ TEST_F(AsmTypeTest, ValidateCall) { | 
| for (size_t ii = 0; ii < arraysize(kReturnTypes); ++ii) { | 
| for (size_t jj = 0; jj < arraysize(kParameterTypes); ++jj) { | 
| auto* f = Function(kReturnTypes[ii])(kParameterTypes[jj]); | 
| - EXPECT_EQ(kReturnTypes[ii](), ffi->AsCallableType()->ValidateCall( | 
| - f->AsFunctionType()->ReturnType(), | 
| - f->AsFunctionType()->Arguments())) | 
| + EXPECT_TRUE(ffi->AsCallableType()->CanBeInvokedWith( | 
| + f->AsFunctionType()->ReturnType(), f->AsFunctionType()->Arguments())) | 
| << kReturnTypes[ii]()->Name(); | 
| // Call with non-parameter type type should fail. | 
| f = Function(kReturnTypes[ii])(kParameterTypes[jj], Type::Int); | 
| - EXPECT_EQ(Type::None(), ffi->AsCallableType()->ValidateCall( | 
| - f->AsFunctionType()->ReturnType(), | 
| - f->AsFunctionType()->Arguments())) | 
| + EXPECT_FALSE(ffi->AsCallableType()->CanBeInvokedWith( | 
| + f->AsFunctionType()->ReturnType(), f->AsFunctionType()->Arguments())) | 
| << kReturnTypes[ii]()->Name(); | 
| } | 
| } | 
| auto* ft0 = Type::FunctionTableType(zone(), 10, fi2d); | 
| - EXPECT_EQ(Type::Double(), ft0->AsCallableType()->ValidateCall( | 
| - fi2d->AsFunctionType()->ReturnType(), | 
| - fi2d->AsFunctionType()->Arguments())); | 
| - EXPECT_EQ(Type::None(), ft0->AsCallableType()->ValidateCall( | 
| - i2d->AsFunctionType()->ReturnType(), | 
| - i2d->AsFunctionType()->Arguments())); | 
| + EXPECT_TRUE(ft0->AsCallableType()->CanBeInvokedWith( | 
| + fi2d->AsFunctionType()->ReturnType(), | 
| + fi2d->AsFunctionType()->Arguments())); | 
| + EXPECT_FALSE(ft0->AsCallableType()->CanBeInvokedWith( | 
| + i2d->AsFunctionType()->ReturnType(), i2d->AsFunctionType()->Arguments())); | 
| } | 
| TEST_F(AsmTypeTest, ToReturnType) { |