Index: test/unittests/wasm/function-body-decoder-unittest.cc |
diff --git a/test/unittests/wasm/function-body-decoder-unittest.cc b/test/unittests/wasm/function-body-decoder-unittest.cc |
index 66bbaa75807a103dc2e7d2f4932e5457ba5c01ee..196e2357c5e18ce48a0360d414ea7bd4ae5ba40b 100644 |
--- a/test/unittests/wasm/function-body-decoder-unittest.cc |
+++ b/test/unittests/wasm/function-body-decoder-unittest.cc |
@@ -201,6 +201,60 @@ class FunctionBodyDecoderTest : public TestWithZone { |
} |
}; |
+namespace { |
+// A helper for tests that require a module environment for functions, |
+// globals, or memories. |
+class TestModuleEnv : public ModuleEnv { |
+ public: |
+ explicit TestModuleEnv(ModuleOrigin origin = kWasmOrigin) |
+ : ModuleEnv(&mod, nullptr) { |
+ mod.origin = origin; |
+ } |
+ byte AddGlobal(ValueType type, bool mutability = true) { |
+ mod.globals.push_back({type, mutability, WasmInitExpr(), 0, false, false}); |
+ CHECK(mod.globals.size() <= 127); |
+ return static_cast<byte>(mod.globals.size() - 1); |
+ } |
+ byte AddSignature(FunctionSig* sig) { |
+ mod.signatures.push_back(sig); |
+ CHECK(mod.signatures.size() <= 127); |
+ return static_cast<byte>(mod.signatures.size() - 1); |
+ } |
+ byte AddFunction(FunctionSig* sig) { |
+ mod.functions.push_back({sig, // sig |
+ 0, // func_index |
+ 0, // sig_index |
+ 0, // name_offset |
+ 0, // name_length |
+ 0, // code_start_offset |
+ 0, // code_end_offset |
+ false, // import |
+ false}); // export |
+ CHECK(mod.functions.size() <= 127); |
+ return static_cast<byte>(mod.functions.size() - 1); |
+ } |
+ byte AddImport(FunctionSig* sig) { |
+ byte result = AddFunction(sig); |
+ mod.functions[result].imported = true; |
+ return result; |
+ } |
+ |
+ void InitializeMemory() { |
+ mod.has_memory = true; |
+ mod.min_mem_pages = 1; |
+ mod.max_mem_pages = 100; |
+ } |
+ |
+ void InitializeFunctionTable() { |
+ mod.function_tables.push_back( |
+ {0, 0, true, std::vector<int32_t>(), false, false, SignatureMap()}); |
+ } |
+ |
+ private: |
+ WasmModule mod; |
+}; |
+} // namespace |
+ |
TEST_F(FunctionBodyDecoderTest, Int32Const1) { |
byte code[] = {kExprI32Const, 0}; |
for (int i = -64; i <= 63; i++) { |
@@ -1023,6 +1077,9 @@ TEST_F(FunctionBodyDecoderTest, TypeConversions) { |
} |
TEST_F(FunctionBodyDecoderTest, MacrosStmt) { |
+ TestModuleEnv module_env; |
+ module = &module_env; |
+ module_env.InitializeMemory(); |
EXPECT_VERIFIES(v_i, WASM_SET_LOCAL(0, WASM_I32V_3(87348))); |
EXPECT_VERIFIES(v_i, WASM_STORE_MEM(MachineType::Int32(), WASM_I32V_1(24), |
WASM_I32V_1(40))); |
@@ -1159,12 +1216,18 @@ TEST_F(FunctionBodyDecoderTest, AllSimpleExpressions) { |
} |
TEST_F(FunctionBodyDecoderTest, MemorySize) { |
+ TestModuleEnv module_env; |
+ module = &module_env; |
+ module_env.InitializeMemory(); |
byte code[] = {kExprMemorySize, 0}; |
EXPECT_VERIFIES_C(i_i, code); |
EXPECT_FAILURE_C(f_ff, code); |
} |
TEST_F(FunctionBodyDecoderTest, LoadMemOffset) { |
+ TestModuleEnv module_env; |
+ module = &module_env; |
+ module_env.InitializeMemory(); |
for (int offset = 0; offset < 128; offset += 7) { |
byte code[] = {kExprI32Const, 0, kExprI32LoadMem, ZERO_ALIGNMENT, |
static_cast<byte>(offset)}; |
@@ -1173,6 +1236,9 @@ TEST_F(FunctionBodyDecoderTest, LoadMemOffset) { |
} |
TEST_F(FunctionBodyDecoderTest, LoadMemAlignment) { |
+ TestModuleEnv module_env; |
+ module = &module_env; |
+ module_env.InitializeMemory(); |
struct { |
WasmOpcode instruction; |
uint32_t maximum_aligment; |
@@ -1207,6 +1273,9 @@ TEST_F(FunctionBodyDecoderTest, LoadMemAlignment) { |
} |
TEST_F(FunctionBodyDecoderTest, StoreMemOffset) { |
+ TestModuleEnv module_env; |
+ module = &module_env; |
+ module_env.InitializeMemory(); |
for (int offset = 0; offset < 128; offset += 7) { |
byte code[] = {WASM_STORE_MEM_OFFSET(MachineType::Int32(), offset, |
WASM_ZERO, WASM_ZERO)}; |
@@ -1215,6 +1284,9 @@ TEST_F(FunctionBodyDecoderTest, StoreMemOffset) { |
} |
TEST_F(FunctionBodyDecoderTest, StoreMemOffset_void) { |
+ TestModuleEnv module_env; |
+ module = &module_env; |
+ module_env.InitializeMemory(); |
EXPECT_FAILURE(i_i, WASM_STORE_MEM_OFFSET(MachineType::Int32(), 0, WASM_ZERO, |
WASM_ZERO)); |
} |
@@ -1230,6 +1302,9 @@ TEST_F(FunctionBodyDecoderTest, StoreMemOffset_void) { |
#define VARINT4(x) BYTE0(x) | 0x80, BYTE1(x) | 0x80, BYTE2(x) | 0x80, BYTE3(x) |
TEST_F(FunctionBodyDecoderTest, LoadMemOffset_varint) { |
+ TestModuleEnv module_env; |
+ module = &module_env; |
+ module_env.InitializeMemory(); |
EXPECT_VERIFIES(i_i, WASM_ZERO, kExprI32LoadMem, ZERO_ALIGNMENT, |
VARINT1(0x45)); |
EXPECT_VERIFIES(i_i, WASM_ZERO, kExprI32LoadMem, ZERO_ALIGNMENT, |
@@ -1241,6 +1316,9 @@ TEST_F(FunctionBodyDecoderTest, LoadMemOffset_varint) { |
} |
TEST_F(FunctionBodyDecoderTest, StoreMemOffset_varint) { |
+ TestModuleEnv module_env; |
+ module = &module_env; |
+ module_env.InitializeMemory(); |
EXPECT_VERIFIES(v_i, WASM_ZERO, WASM_ZERO, kExprI32StoreMem, ZERO_ALIGNMENT, |
VARINT1(0x33)); |
EXPECT_VERIFIES(v_i, WASM_ZERO, WASM_ZERO, kExprI32StoreMem, ZERO_ALIGNMENT, |
@@ -1252,6 +1330,9 @@ TEST_F(FunctionBodyDecoderTest, StoreMemOffset_varint) { |
} |
TEST_F(FunctionBodyDecoderTest, AllLoadMemCombinations) { |
+ TestModuleEnv module_env; |
+ module = &module_env; |
+ module_env.InitializeMemory(); |
for (size_t i = 0; i < arraysize(kValueTypes); i++) { |
ValueType local_type = kValueTypes[i]; |
for (size_t j = 0; j < arraysize(machineTypes); j++) { |
@@ -1268,6 +1349,9 @@ TEST_F(FunctionBodyDecoderTest, AllLoadMemCombinations) { |
} |
TEST_F(FunctionBodyDecoderTest, AllStoreMemCombinations) { |
+ TestModuleEnv module_env; |
+ module = &module_env; |
+ module_env.InitializeMemory(); |
for (size_t i = 0; i < arraysize(kValueTypes); i++) { |
ValueType local_type = kValueTypes[i]; |
for (size_t j = 0; j < arraysize(machineTypes); j++) { |
@@ -1283,54 +1367,6 @@ TEST_F(FunctionBodyDecoderTest, AllStoreMemCombinations) { |
} |
} |
-namespace { |
-// A helper for tests that require a module environment for functions and |
-// globals. |
-class TestModuleEnv : public ModuleEnv { |
- public: |
- explicit TestModuleEnv(ModuleOrigin origin = kWasmOrigin) |
- : ModuleEnv(&mod, nullptr) { |
- mod.origin = origin; |
- } |
- byte AddGlobal(ValueType type, bool mutability = true) { |
- mod.globals.push_back({type, mutability, WasmInitExpr(), 0, false, false}); |
- CHECK(mod.globals.size() <= 127); |
- return static_cast<byte>(mod.globals.size() - 1); |
- } |
- byte AddSignature(FunctionSig* sig) { |
- mod.signatures.push_back(sig); |
- CHECK(mod.signatures.size() <= 127); |
- return static_cast<byte>(mod.signatures.size() - 1); |
- } |
- byte AddFunction(FunctionSig* sig) { |
- mod.functions.push_back({sig, // sig |
- 0, // func_index |
- 0, // sig_index |
- 0, // name_offset |
- 0, // name_length |
- 0, // code_start_offset |
- 0, // code_end_offset |
- false, // import |
- false}); // export |
- CHECK(mod.functions.size() <= 127); |
- return static_cast<byte>(mod.functions.size() - 1); |
- } |
- byte AddImport(FunctionSig* sig) { |
- byte result = AddFunction(sig); |
- mod.functions[result].imported = true; |
- return result; |
- } |
- |
- void InitializeFunctionTable() { |
- mod.function_tables.push_back( |
- {0, 0, true, std::vector<int32_t>(), false, false, SignatureMap()}); |
- } |
- |
- private: |
- WasmModule mod; |
-}; |
-} // namespace |
- |
TEST_F(FunctionBodyDecoderTest, SimpleCalls) { |
FunctionSig* sig = sigs.i_i(); |
TestModuleEnv module_env; |
@@ -1665,6 +1701,7 @@ TEST_F(FunctionBodyDecoderTest, AllSetGlobalCombinations) { |
TEST_F(FunctionBodyDecoderTest, WasmGrowMemory) { |
TestModuleEnv module_env; |
module = &module_env; |
+ module_env.InitializeMemory(); |
byte code[] = {WASM_GET_LOCAL(0), kExprGrowMemory, 0}; |
EXPECT_VERIFIES_C(i_i, code); |
@@ -1674,6 +1711,7 @@ TEST_F(FunctionBodyDecoderTest, WasmGrowMemory) { |
TEST_F(FunctionBodyDecoderTest, AsmJsGrowMemory) { |
TestModuleEnv module_env(kAsmJsOrigin); |
module = &module_env; |
+ module_env.InitializeMemory(); |
byte code[] = {WASM_GET_LOCAL(0), kExprGrowMemory, 0}; |
EXPECT_FAILURE_C(i_i, code); |
@@ -1705,6 +1743,7 @@ TEST_F(FunctionBodyDecoderTest, AsmJsBinOpsCheckOrigin) { |
{ |
TestModuleEnv module_env(kAsmJsOrigin); |
module = &module_env; |
+ module_env.InitializeMemory(); |
for (size_t i = 0; i < arraysize(AsmJsBinOps); i++) { |
TestBinop(AsmJsBinOps[i].op, AsmJsBinOps[i].sig); |
} |
@@ -1713,6 +1752,7 @@ TEST_F(FunctionBodyDecoderTest, AsmJsBinOpsCheckOrigin) { |
{ |
TestModuleEnv module_env; |
module = &module_env; |
+ module_env.InitializeMemory(); |
for (size_t i = 0; i < arraysize(AsmJsBinOps); i++) { |
byte code[] = { |
WASM_BINOP(AsmJsBinOps[i].op, WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))}; |
@@ -1751,6 +1791,7 @@ TEST_F(FunctionBodyDecoderTest, AsmJsUnOpsCheckOrigin) { |
{ |
TestModuleEnv module_env(kAsmJsOrigin); |
module = &module_env; |
+ module_env.InitializeMemory(); |
for (size_t i = 0; i < arraysize(AsmJsUnOps); i++) { |
TestUnop(AsmJsUnOps[i].op, AsmJsUnOps[i].sig); |
} |
@@ -1759,6 +1800,7 @@ TEST_F(FunctionBodyDecoderTest, AsmJsUnOpsCheckOrigin) { |
{ |
TestModuleEnv module_env; |
module = &module_env; |
+ module_env.InitializeMemory(); |
for (size_t i = 0; i < arraysize(AsmJsUnOps); i++) { |
byte code[] = {WASM_UNOP(AsmJsUnOps[i].op, WASM_GET_LOCAL(0))}; |
EXPECT_FAILURE_SC(AsmJsUnOps[i].sig, code); |