summaryrefslogtreecommitdiff
path: root/deps/v8/test/unittests/wasm/function-body-decoder-unittest.cc
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/test/unittests/wasm/function-body-decoder-unittest.cc')
-rw-r--r--deps/v8/test/unittests/wasm/function-body-decoder-unittest.cc87
1 files changed, 51 insertions, 36 deletions
diff --git a/deps/v8/test/unittests/wasm/function-body-decoder-unittest.cc b/deps/v8/test/unittests/wasm/function-body-decoder-unittest.cc
index 771c61e237..31e4a12ae7 100644
--- a/deps/v8/test/unittests/wasm/function-body-decoder-unittest.cc
+++ b/deps/v8/test/unittests/wasm/function-body-decoder-unittest.cc
@@ -2403,34 +2403,29 @@ TEST_F(FunctionBodyDecoderTest, Throw) {
WASM_FEATURE_SCOPE(eh);
TestModuleBuilder builder;
module = builder.module();
-
- builder.AddException(sigs.v_v());
- builder.AddException(sigs.v_i());
- AddLocals(kWasmI32, 1);
-
- EXPECT_VERIFIES(v_v, kExprThrow, 0);
-
- // exception index out of range.
- EXPECT_FAILURE(v_v, kExprThrow, 2);
-
- EXPECT_VERIFIES(v_v, WASM_I32V(0), kExprThrow, 1);
-
- // TODO(kschimpf): Add more tests.
+ byte ex1 = builder.AddException(sigs.v_v());
+ byte ex2 = builder.AddException(sigs.v_i());
+ byte ex3 = builder.AddException(sigs.v_ii());
+ EXPECT_VERIFIES(v_v, kExprThrow, ex1);
+ EXPECT_VERIFIES(v_v, WASM_I32V(0), kExprThrow, ex2);
+ EXPECT_FAILURE(v_v, WASM_F32(0.0), kExprThrow, ex2);
+ EXPECT_VERIFIES(v_v, WASM_I32V(0), WASM_I32V(0), kExprThrow, ex3);
+ EXPECT_FAILURE(v_v, WASM_F32(0.0), WASM_I32V(0), kExprThrow, ex3);
+ EXPECT_FAILURE(v_v, kExprThrow, 99);
}
TEST_F(FunctionBodyDecoderTest, ThrowUnreachable) {
- // TODO(titzer): unreachable code after throw should validate.
WASM_FEATURE_SCOPE(eh);
TestModuleBuilder builder;
module = builder.module();
-
- builder.AddException(sigs.v_v());
- builder.AddException(sigs.v_i());
- AddLocals(kWasmI32, 1);
- EXPECT_VERIFIES(i_i, kExprThrow, 0, WASM_GET_LOCAL(0));
-
- // TODO(kschimpf): Add more (block-level) tests of unreachable to see
- // if they validate.
+ byte ex1 = builder.AddException(sigs.v_v());
+ byte ex2 = builder.AddException(sigs.v_i());
+ EXPECT_VERIFIES(i_i, WASM_GET_LOCAL(0), kExprThrow, ex1, WASM_NOP);
+ EXPECT_VERIFIES(v_i, WASM_GET_LOCAL(0), kExprThrow, ex2, WASM_NOP);
+ EXPECT_VERIFIES(i_i, WASM_GET_LOCAL(0), kExprThrow, ex1, WASM_ZERO);
+ EXPECT_FAILURE(v_i, WASM_GET_LOCAL(0), kExprThrow, ex2, WASM_ZERO);
+ EXPECT_FAILURE(i_i, WASM_GET_LOCAL(0), kExprThrow, ex1, WASM_F32(0.0));
+ EXPECT_FAILURE(v_i, WASM_GET_LOCAL(0), kExprThrow, ex2, WASM_F32(0.0));
}
#define WASM_TRY_OP kExprTry, kLocalVoid
@@ -2438,24 +2433,30 @@ TEST_F(FunctionBodyDecoderTest, ThrowUnreachable) {
TEST_F(FunctionBodyDecoderTest, TryCatch) {
WASM_FEATURE_SCOPE(eh);
-
TestModuleBuilder builder;
module = builder.module();
- builder.AddException(sigs.v_v());
- builder.AddException(sigs.v_v());
-
- // TODO(kschimpf): Need to fix catch to use declared exception.
- EXPECT_VERIFIES(v_v, WASM_TRY_OP, WASM_CATCH(0), kExprEnd);
-
- // Missing catch.
- EXPECT_FAILURE(v_v, WASM_TRY_OP, kExprEnd);
+ byte ex1 = builder.AddException(sigs.v_v());
+ byte ex2 = builder.AddException(sigs.v_v());
+ EXPECT_VERIFIES(v_v, WASM_TRY_OP, WASM_CATCH(ex1), kExprEnd);
+ EXPECT_FAILURE(v_v, WASM_TRY_OP, kExprEnd); // Missing catch.
+ EXPECT_FAILURE(v_v, WASM_TRY_OP, WASM_CATCH(ex1)); // Missing end.
+ EXPECT_FAILURE(v_v, WASM_CATCH(ex1), kExprEnd); // Missing try.
- // Missing end.
- EXPECT_FAILURE(v_i, WASM_TRY_OP, WASM_CATCH(0));
+ // TODO(mstarzinger): Double catch. Fix this to verify.
+ EXPECT_FAILURE(v_v, WASM_TRY_OP, WASM_CATCH(ex1), WASM_CATCH(ex2), kExprEnd);
+}
- // Double catch.
- // TODO(kschimpf): Fix this to verify.
- EXPECT_FAILURE(v_i, WASM_TRY_OP, WASM_CATCH(0), WASM_CATCH(1), kExprEnd);
+TEST_F(FunctionBodyDecoderTest, TryCatchAll) {
+ WASM_FEATURE_SCOPE(eh);
+ TestModuleBuilder builder;
+ module = builder.module();
+ byte ex1 = builder.AddException(sigs.v_v());
+ EXPECT_VERIFIES(v_v, WASM_TRY_OP, kExprCatchAll, kExprEnd);
+ EXPECT_VERIFIES(v_v, WASM_TRY_OP, WASM_CATCH(ex1), kExprCatchAll, kExprEnd);
+ EXPECT_FAILURE(v_v, WASM_TRY_OP, kExprCatchAll, kExprCatchAll, kExprEnd);
+ EXPECT_FAILURE(v_v, WASM_TRY_OP, kExprCatchAll, WASM_CATCH(ex1), kExprEnd);
+ EXPECT_FAILURE(v_v, WASM_TRY_OP, kExprCatchAll); // Missing end.
+ EXPECT_FAILURE(v_v, kExprCatchAll, kExprEnd); // Missing try.
}
#undef WASM_TRY_OP
@@ -3132,6 +3133,20 @@ TEST_F(LocalDeclDecoderTest, UseEncoder) {
pos = ExpectRun(map, pos, kWasmI64, 212);
}
+TEST_F(LocalDeclDecoderTest, ExceptRef) {
+ WASM_FEATURE_SCOPE(eh);
+ ValueType type = kWasmExceptRef;
+ const byte data[] = {1, 1,
+ static_cast<byte>(ValueTypes::ValueTypeCodeFor(type))};
+ BodyLocalDecls decls(zone());
+ bool result = DecodeLocalDecls(&decls, data, data + sizeof(data));
+ EXPECT_TRUE(result);
+ EXPECT_EQ(1u, decls.type_list.size());
+
+ TypesOfLocals map = decls.type_list;
+ EXPECT_EQ(type, map[0]);
+}
+
class BytecodeIteratorTest : public TestWithZone {};
TEST_F(BytecodeIteratorTest, SimpleForeach) {