| 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);
 | 
| 
 |