| Index: src/wasm/wasm-module.h | 
| diff --git a/src/wasm/wasm-module.h b/src/wasm/wasm-module.h | 
| index 8ff64fe1da70eb8276fc9ede6c6d076f9f2f9939..376a2448fc32819e024b7bf1405dbac0331c13b2 100644 | 
| --- a/src/wasm/wasm-module.h | 
| +++ b/src/wasm/wasm-module.h | 
| @@ -43,7 +43,6 @@ const uint8_t kWasmFunctionTypeForm = 0x40; | 
| F(FunctionBodies, 8, "code")         \ | 
| F(DataSegments, 9, "data")           \ | 
| F(Names, 10, "name")                 \ | 
| -  F(FunctionTablePad, 11, "table_pad") \ | 
| F(Globals, 0, "global")              \ | 
| F(End, 0, "end") | 
|  | 
| @@ -61,8 +60,6 @@ const uint8_t kWasmFunctionTypeForm = 0x40; | 
| 8, 'f', 'u', 'n', 'c', 't', 'i', 'o', 'n' | 
| #define WASM_SECTION_FUNCTION_BODIES 4, 'c', 'o', 'd', 'e' | 
| #define WASM_SECTION_NAMES 4, 'n', 'a', 'm', 'e' | 
| -#define WASM_SECTION_FUNCTION_TABLE_PAD \ | 
| -  9, 't', 'a', 'b', 'l', 'e', '_', 'p', 'a', 'd' | 
|  | 
| // Constants for the above section headers' size (LEB128 + characters). | 
| #define WASM_SECTION_MEMORY_SIZE ((size_t)7) | 
| @@ -77,7 +74,6 @@ const uint8_t kWasmFunctionTypeForm = 0x40; | 
| #define WASM_SECTION_FUNCTION_SIGNATURES_SIZE ((size_t)9) | 
| #define WASM_SECTION_FUNCTION_BODIES_SIZE ((size_t)5) | 
| #define WASM_SECTION_NAMES_SIZE ((size_t)5) | 
| -#define WASM_SECTION_FUNCTION_TABLE_PAD_SIZE ((size_t)10) | 
|  | 
| class WasmDebugInfo; | 
|  | 
| @@ -153,6 +149,13 @@ struct WasmDataSegment { | 
| bool init;               // true if loaded upon instantiation. | 
| }; | 
|  | 
| +// Static representation of a wasm indirect call table. | 
| +struct WasmIndirectFunctionTable { | 
| +  uint32_t size;                 // initial table size. | 
| +  uint32_t max_size;             // maximum table size. | 
| +  std::vector<uint16_t> values;  // function table. | 
| +}; | 
| + | 
| enum ModuleOrigin { kWasmOrigin, kAsmJsOrigin }; | 
|  | 
| // Static representation of a module. | 
| @@ -175,12 +178,10 @@ struct WasmModule { | 
|  | 
| std::vector<WasmGlobal> globals;             // globals in this module. | 
| uint32_t globals_size;                       // size of globals table. | 
| -  uint32_t indirect_table_size;                // size of indirect function | 
| -                                               //     table (includes padding). | 
| std::vector<FunctionSig*> signatures;        // signatures in this module. | 
| std::vector<WasmFunction> functions;         // functions in this module. | 
| std::vector<WasmDataSegment> data_segments;  // data segments in this module. | 
| -  std::vector<uint16_t> function_table;        // function table. | 
| +  std::vector<WasmIndirectFunctionTable> function_tables;  // function tables. | 
| std::vector<WasmImport> import_table;        // import table. | 
| std::vector<WasmExport> export_table;        // export table. | 
| // We store the semaphore here to extend its lifetime. In <libc-2.21, which we | 
| @@ -238,14 +239,6 @@ struct WasmModule { | 
| MaybeHandle<FixedArray> CompileFunctions(Isolate* isolate, | 
| ErrorThrower* thrower) const; | 
|  | 
| -  uint32_t FunctionTableSize() const { | 
| -    if (indirect_table_size > 0) { | 
| -      return indirect_table_size; | 
| -    } | 
| -    DCHECK_LE(function_table.size(), UINT32_MAX); | 
| -    return static_cast<uint32_t>(function_table.size()); | 
| -  } | 
| - | 
| private: | 
| DISALLOW_COPY_AND_ASSIGN(WasmModule); | 
| }; | 
| @@ -258,7 +251,7 @@ struct WasmModuleInstance { | 
| Handle<Context> context;               // JavaScript native context. | 
| Handle<JSArrayBuffer> mem_buffer;      // Handle to array buffer of memory. | 
| Handle<JSArrayBuffer> globals_buffer;  // Handle to array buffer of globals. | 
| -  Handle<FixedArray> function_table;     // indirect function table. | 
| +  std::vector<Handle<FixedArray>> function_tables;  // indirect function tables. | 
| std::vector<Handle<Code>> function_code;  // code objects for each function. | 
| std::vector<Handle<Code>> import_code;    // code objects for each import. | 
| // -- raw memory ------------------------------------------------------------ | 
| @@ -269,6 +262,7 @@ struct WasmModuleInstance { | 
|  | 
| explicit WasmModuleInstance(const WasmModule* m) | 
| : module(m), | 
| +        function_tables(m->function_tables.size()), | 
| function_code(m->functions.size()), | 
| import_code(m->import_table.size()), | 
| mem_start(nullptr), | 
| @@ -286,18 +280,21 @@ struct ModuleEnv { | 
| // reloc infos. | 
| std::vector<Handle<Code>> placeholders; | 
|  | 
| -  bool IsValidGlobal(uint32_t index) { | 
| +  bool IsValidGlobal(uint32_t index) const { | 
| return module && index < module->globals.size(); | 
| } | 
| bool IsValidFunction(uint32_t index) const { | 
| return module && index < module->functions.size(); | 
| } | 
| -  bool IsValidSignature(uint32_t index) { | 
| +  bool IsValidSignature(uint32_t index) const { | 
| return module && index < module->signatures.size(); | 
| } | 
| -  bool IsValidImport(uint32_t index) { | 
| +  bool IsValidImport(uint32_t index) const { | 
| return module && index < module->import_table.size(); | 
| } | 
| +  bool IsValidTable(uint32_t index) const { | 
| +    return module && index < module->function_tables.size(); | 
| +  } | 
| LocalType GetGlobalType(uint32_t index) { | 
| DCHECK(IsValidGlobal(index)); | 
| return module->globals[index].type; | 
| @@ -314,8 +311,9 @@ struct ModuleEnv { | 
| DCHECK(IsValidSignature(index)); | 
| return module->signatures[index]; | 
| } | 
| -  uint32_t FunctionTableSize() const { | 
| -    return module->FunctionTableSize(); | 
| +  const WasmIndirectFunctionTable* GetTable(uint32_t index) const { | 
| +    DCHECK(IsValidTable(index)); | 
| +    return &module->function_tables[index]; | 
| } | 
|  | 
| bool asm_js() { return origin == kAsmJsOrigin; } | 
| @@ -387,6 +385,16 @@ bool UpdateWasmModuleMemory(Handle<JSObject> object, Address old_start, | 
| Address new_start, uint32_t old_size, | 
| uint32_t new_size); | 
|  | 
| +// Constructs a single function table as a FixedArray of double size, | 
| +// populating it with function signature indices and function indices. | 
| +Handle<FixedArray> BuildFunctionTable(Isolate* isolate, uint32_t index, | 
| +                                      const WasmModule* module); | 
| + | 
| +// Populates a function table by replacing function indices with handles to | 
| +// the compiled code. | 
| +void PopulateFunctionTable(Handle<FixedArray> table, uint32_t table_size, | 
| +                           const std::vector<Handle<Code>>* code_table); | 
| + | 
| namespace testing { | 
|  | 
| // Decode, verify, and run the function labeled "main" in the | 
|  |