| OLD | NEW | 
|     1 // Copyright 2015 the V8 project authors. All rights reserved. |     1 // Copyright 2015 the V8 project authors. All rights reserved. | 
|     2 // Use of this source code is governed by a BSD-style license that can be |     2 // Use of this source code is governed by a BSD-style license that can be | 
|     3 // found in the LICENSE file. |     3 // found in the LICENSE file. | 
|     4  |     4  | 
|     5 #include "src/base/atomic-utils.h" |     5 #include "src/base/atomic-utils.h" | 
|     6 #include "src/macro-assembler.h" |     6 #include "src/macro-assembler.h" | 
|     7 #include "src/objects.h" |     7 #include "src/objects.h" | 
|     8 #include "src/property-descriptor.h" |     8 #include "src/property-descriptor.h" | 
|     9 #include "src/v8.h" |     9 #include "src/v8.h" | 
|    10  |    10  | 
| (...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   135     } |   135     } | 
|   136     return function_code_[index]; |   136     return function_code_[index]; | 
|   137   } |   137   } | 
|   138  |   138  | 
|   139   void Finish(uint32_t index, Handle<Code> code) { |   139   void Finish(uint32_t index, Handle<Code> code) { | 
|   140     DCHECK(index < function_code_.size()); |   140     DCHECK(index < function_code_.size()); | 
|   141     function_code_[index] = code; |   141     function_code_[index] = code; | 
|   142   } |   142   } | 
|   143  |   143  | 
|   144   void Link(Handle<FixedArray> function_table, |   144   void Link(Handle<FixedArray> function_table, | 
|   145             std::vector<uint16_t>& functions) { |   145             const std::vector<uint16_t>& functions) { | 
|   146     for (size_t i = 0; i < function_code_.size(); i++) { |   146     for (size_t i = 0; i < function_code_.size(); i++) { | 
|   147       LinkFunction(function_code_[i]); |   147       LinkFunction(function_code_[i]); | 
|   148     } |   148     } | 
|   149     if (!function_table.is_null()) { |   149     if (!function_table.is_null()) { | 
|   150       int table_size = static_cast<int>(functions.size()); |   150       int table_size = static_cast<int>(functions.size()); | 
|   151       DCHECK_EQ(function_table->length(), table_size * 2); |   151       DCHECK_EQ(function_table->length(), table_size * 2); | 
|   152       for (int i = 0; i < table_size; i++) { |   152       for (int i = 0; i < table_size; i++) { | 
|   153         function_table->set(i + table_size, *function_code_[functions[i]]); |   153         function_table->set(i + table_size, *function_code_[functions[i]]); | 
|   154       } |   154       } | 
|   155     } |   155     } | 
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   196  |   196  | 
|   197 namespace { |   197 namespace { | 
|   198 // Internal constants for the layout of the module object. |   198 // Internal constants for the layout of the module object. | 
|   199 const int kWasmModuleInternalFieldCount = 5; |   199 const int kWasmModuleInternalFieldCount = 5; | 
|   200 const int kWasmModuleFunctionTable = 0; |   200 const int kWasmModuleFunctionTable = 0; | 
|   201 const int kWasmModuleCodeTable = 1; |   201 const int kWasmModuleCodeTable = 1; | 
|   202 const int kWasmMemArrayBuffer = 2; |   202 const int kWasmMemArrayBuffer = 2; | 
|   203 const int kWasmGlobalsArrayBuffer = 3; |   203 const int kWasmGlobalsArrayBuffer = 3; | 
|   204 const int kWasmFunctionNamesArray = 4; |   204 const int kWasmFunctionNamesArray = 4; | 
|   205  |   205  | 
|   206 size_t AllocateGlobalsOffsets(std::vector<WasmGlobal>& globals) { |   206 void LoadDataSegments(const WasmModule* module, byte* mem_addr, | 
|   207   uint32_t offset = 0; |   207                       size_t mem_size) { | 
|   208   if (globals.size() == 0) return 0; |  | 
|   209   for (WasmGlobal& global : globals) { |  | 
|   210     byte size = WasmOpcodes::MemSize(global.type); |  | 
|   211     offset = (offset + size - 1) & ~(size - 1);  // align |  | 
|   212     global.offset = offset; |  | 
|   213     offset += size; |  | 
|   214   } |  | 
|   215   return offset; |  | 
|   216 } |  | 
|   217  |  | 
|   218 void LoadDataSegments(WasmModule* module, byte* mem_addr, size_t mem_size) { |  | 
|   219   for (const WasmDataSegment& segment : module->data_segments) { |   208   for (const WasmDataSegment& segment : module->data_segments) { | 
|   220     if (!segment.init) continue; |   209     if (!segment.init) continue; | 
|   221     if (!segment.source_size) continue; |   210     if (!segment.source_size) continue; | 
|   222     CHECK_LT(segment.dest_addr, mem_size); |   211     CHECK_LT(segment.dest_addr, mem_size); | 
|   223     CHECK_LE(segment.source_size, mem_size); |   212     CHECK_LE(segment.source_size, mem_size); | 
|   224     CHECK_LE(segment.dest_addr + segment.source_size, mem_size); |   213     CHECK_LE(segment.dest_addr + segment.source_size, mem_size); | 
|   225     byte* addr = mem_addr + segment.dest_addr; |   214     byte* addr = mem_addr + segment.dest_addr; | 
|   226     memcpy(addr, module->module_start + segment.source_offset, |   215     memcpy(addr, module->module_start + segment.source_offset, | 
|   227            segment.source_size); |   216            segment.source_size); | 
|   228   } |   217   } | 
|   229 } |   218 } | 
|   230  |   219  | 
|   231 Handle<FixedArray> BuildFunctionTable(Isolate* isolate, WasmModule* module) { |   220 Handle<FixedArray> BuildFunctionTable(Isolate* isolate, | 
 |   221                                       const WasmModule* module) { | 
|   232   if (module->function_table.size() == 0) { |   222   if (module->function_table.size() == 0) { | 
|   233     return Handle<FixedArray>::null(); |   223     return Handle<FixedArray>::null(); | 
|   234   } |   224   } | 
|   235   int table_size = static_cast<int>(module->function_table.size()); |   225   int table_size = static_cast<int>(module->function_table.size()); | 
|   236   Handle<FixedArray> fixed = isolate->factory()->NewFixedArray(2 * table_size); |   226   Handle<FixedArray> fixed = isolate->factory()->NewFixedArray(2 * table_size); | 
|   237   for (int i = 0; i < table_size; i++) { |   227   for (int i = 0; i < table_size; i++) { | 
|   238     WasmFunction* function = &module->functions[module->function_table[i]]; |   228     const WasmFunction* function = | 
 |   229         &module->functions[module->function_table[i]]; | 
|   239     fixed->set(i, Smi::FromInt(function->sig_index)); |   230     fixed->set(i, Smi::FromInt(function->sig_index)); | 
|   240   } |   231   } | 
|   241   return fixed; |   232   return fixed; | 
|   242 } |   233 } | 
|   243  |   234  | 
|   244 Handle<JSArrayBuffer> NewArrayBuffer(Isolate* isolate, size_t size, |   235 Handle<JSArrayBuffer> NewArrayBuffer(Isolate* isolate, size_t size, | 
|   245                                      byte** backing_store) { |   236                                      byte** backing_store) { | 
|   246   if (size > (WasmModule::kMaxMemPages * WasmModule::kPageSize)) { |   237   if (size > (WasmModule::kMaxMemPages * WasmModule::kPageSize)) { | 
|   247     // TODO(titzer): lift restriction on maximum memory allocated here. |   238     // TODO(titzer): lift restriction on maximum memory allocated here. | 
|   248     *backing_store = nullptr; |   239     *backing_store = nullptr; | 
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   295   if (!instance->mem_start) { |   286   if (!instance->mem_start) { | 
|   296     thrower->Error("Out of memory: wasm memory"); |   287     thrower->Error("Out of memory: wasm memory"); | 
|   297     instance->mem_size = 0; |   288     instance->mem_size = 0; | 
|   298     return false; |   289     return false; | 
|   299   } |   290   } | 
|   300   return true; |   291   return true; | 
|   301 } |   292 } | 
|   302  |   293  | 
|   303 bool AllocateGlobals(ErrorThrower* thrower, Isolate* isolate, |   294 bool AllocateGlobals(ErrorThrower* thrower, Isolate* isolate, | 
|   304                      WasmModuleInstance* instance) { |   295                      WasmModuleInstance* instance) { | 
|   305   instance->globals_size = AllocateGlobalsOffsets(instance->module->globals); |   296   uint32_t globals_size = instance->module->globals_size; | 
|   306  |   297   if (globals_size > 0) { | 
|   307   if (instance->globals_size > 0) { |   298     instance->globals_buffer = | 
|   308     instance->globals_buffer = NewArrayBuffer(isolate, instance->globals_size, |   299         NewArrayBuffer(isolate, globals_size, &instance->globals_start); | 
|   309                                               &instance->globals_start); |  | 
|   310     if (!instance->globals_start) { |   300     if (!instance->globals_start) { | 
|   311       // Not enough space for backing store of globals. |   301       // Not enough space for backing store of globals. | 
|   312       thrower->Error("Out of memory: wasm globals"); |   302       thrower->Error("Out of memory: wasm globals"); | 
|   313       return false; |   303       return false; | 
|   314     } |   304     } | 
|   315   } |   305   } | 
|   316   return true; |   306   return true; | 
|   317 } |   307 } | 
|   318 }  // namespace |   308 }  // namespace | 
|   319  |   309  | 
| (...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   466   } |   456   } | 
|   467  |   457  | 
|   468   inline void Report() { |   458   inline void Report() { | 
|   469     if (FLAG_print_wasm_code_size) { |   459     if (FLAG_print_wasm_code_size) { | 
|   470       PrintF("Total generated wasm code: %zu bytes\n", code_size); |   460       PrintF("Total generated wasm code: %zu bytes\n", code_size); | 
|   471       PrintF("Total generated wasm reloc: %zu bytes\n", reloc_size); |   461       PrintF("Total generated wasm reloc: %zu bytes\n", reloc_size); | 
|   472     } |   462     } | 
|   473   } |   463   } | 
|   474 }; |   464 }; | 
|   475  |   465  | 
|   476 bool CompileWrappersToImportedFunctions(Isolate* isolate, WasmModule* module, |   466 bool CompileWrappersToImportedFunctions( | 
|   477                                         const Handle<JSReceiver> ffi, |   467     Isolate* isolate, const WasmModule* module, const Handle<JSReceiver> ffi, | 
|   478                                         WasmModuleInstance* instance, |   468     WasmModuleInstance* instance, ErrorThrower* thrower, Factory* factory, | 
|   479                                         ErrorThrower* thrower, Factory* factory, |   469     ModuleEnv* module_env, CodeStats& code_stats) { | 
|   480                                         ModuleEnv* module_env, |  | 
|   481                                         CodeStats& code_stats) { |  | 
|   482   uint32_t index = 0; |   470   uint32_t index = 0; | 
|   483   if (module->import_table.size() > 0) { |   471   if (module->import_table.size() > 0) { | 
|   484     instance->import_code.reserve(module->import_table.size()); |   472     instance->import_code.reserve(module->import_table.size()); | 
|   485     for (const WasmImport& import : module->import_table) { |   473     for (const WasmImport& import : module->import_table) { | 
|   486       WasmName module_name = module->GetNameOrNull(import.module_name_offset, |   474       WasmName module_name = module->GetNameOrNull(import.module_name_offset, | 
|   487                                                    import.module_name_length); |   475                                                    import.module_name_length); | 
|   488       WasmName function_name = module->GetNameOrNull( |   476       WasmName function_name = module->GetNameOrNull( | 
|   489           import.function_name_offset, import.function_name_length); |   477           import.function_name_offset, import.function_name_length); | 
|   490       MaybeHandle<JSFunction> function = LookupFunction( |   478       MaybeHandle<JSFunction> function = LookupFunction( | 
|   491           *thrower, factory, ffi, index, module_name, function_name); |   479           *thrower, factory, ffi, index, module_name, function_name); | 
|   492       if (function.is_null()) return false; |   480       if (function.is_null()) return false; | 
|   493  |   481  | 
|   494       Handle<Code> code = compiler::CompileWasmToJSWrapper( |   482       Handle<Code> code = compiler::CompileWasmToJSWrapper( | 
|   495           isolate, module_env, function.ToHandleChecked(), import.sig, |   483           isolate, module_env, function.ToHandleChecked(), import.sig, | 
|   496           module_name, function_name); |   484           module_name, function_name); | 
|   497       instance->import_code.push_back(code); |   485       instance->import_code.push_back(code); | 
|   498       code_stats.Record(*code); |   486       code_stats.Record(*code); | 
|   499       index++; |   487       index++; | 
|   500     } |   488     } | 
|   501   } |   489   } | 
|   502   return true; |   490   return true; | 
|   503 } |   491 } | 
|   504  |   492  | 
|   505 void InitializeParallelCompilation( |   493 void InitializeParallelCompilation( | 
|   506     Isolate* isolate, std::vector<WasmFunction>& functions, |   494     Isolate* isolate, const std::vector<WasmFunction>& functions, | 
|   507     std::vector<compiler::WasmCompilationUnit*>& compilation_units, |   495     std::vector<compiler::WasmCompilationUnit*>& compilation_units, | 
|   508     ModuleEnv& module_env, ErrorThrower& thrower) { |   496     ModuleEnv& module_env, ErrorThrower& thrower) { | 
|   509   // Create a placeholder code object for all functions. |   497   // Create a placeholder code object for all functions. | 
|   510   // TODO(ahaas): Maybe we could skip this for external functions. |   498   // TODO(ahaas): Maybe we could skip this for external functions. | 
|   511   for (uint32_t i = 0; i < functions.size(); i++) { |   499   for (uint32_t i = 0; i < functions.size(); i++) { | 
|   512     module_env.linker->GetFunctionCode(i); |   500     module_env.linker->GetFunctionCode(i); | 
|   513   } |   501   } | 
|   514  |   502  | 
|   515   for (uint32_t i = FLAG_skip_compiling_wasm_funcs; i < functions.size(); i++) { |   503   for (uint32_t i = FLAG_skip_compiling_wasm_funcs; i < functions.size(); i++) { | 
|   516     compilation_units[i] = new compiler::WasmCompilationUnit( |   504     compilation_units[i] = new compiler::WasmCompilationUnit( | 
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   548   for (size_t i = 0; i < num_tasks; i++) { |   536   for (size_t i = 0; i < num_tasks; i++) { | 
|   549     // If the task has not started yet, then we abort it. Otherwise we wait for |   537     // If the task has not started yet, then we abort it. Otherwise we wait for | 
|   550     // it to finish. |   538     // it to finish. | 
|   551     if (!isolate->cancelable_task_manager()->TryAbort(task_ids[i])) { |   539     if (!isolate->cancelable_task_manager()->TryAbort(task_ids[i])) { | 
|   552       pending_tasks->Wait(); |   540       pending_tasks->Wait(); | 
|   553     } |   541     } | 
|   554   } |   542   } | 
|   555 } |   543 } | 
|   556  |   544  | 
|   557 void FinishCompilationUnits( |   545 void FinishCompilationUnits( | 
|   558     WasmModule* module, |  | 
|   559     std::queue<compiler::WasmCompilationUnit*>& executed_units, |   546     std::queue<compiler::WasmCompilationUnit*>& executed_units, | 
|   560     std::vector<Handle<Code>>& results, base::Mutex& result_mutex) { |   547     std::vector<Handle<Code>>& results, base::Mutex& result_mutex) { | 
|   561   while (true) { |   548   while (true) { | 
|   562     compiler::WasmCompilationUnit* unit = nullptr; |   549     compiler::WasmCompilationUnit* unit = nullptr; | 
|   563     { |   550     { | 
|   564       base::LockGuard<base::Mutex> guard(&result_mutex); |   551       base::LockGuard<base::Mutex> guard(&result_mutex); | 
|   565       if (executed_units.empty()) { |   552       if (executed_units.empty()) { | 
|   566         break; |   553         break; | 
|   567       } |   554       } | 
|   568       unit = executed_units.front(); |   555       unit = executed_units.front(); | 
|   569       executed_units.pop(); |   556       executed_units.pop(); | 
|   570     } |   557     } | 
|   571     int j = unit->index(); |   558     int j = unit->index(); | 
|   572     results[j] = unit->FinishCompilation(); |   559     results[j] = unit->FinishCompilation(); | 
|   573     delete unit; |   560     delete unit; | 
|   574   } |   561   } | 
|   575 } |   562 } | 
|   576  |   563  | 
|   577 bool FinishCompilation(Isolate* isolate, WasmModule* module, |   564 bool FinishCompilation(Isolate* isolate, const WasmModule* module, | 
|   578                        const Handle<JSReceiver> ffi, |   565                        const Handle<JSReceiver> ffi, | 
|   579                        const std::vector<Handle<Code>>& results, |   566                        const std::vector<Handle<Code>>& results, | 
|   580                        const WasmModuleInstance& instance, |   567                        const WasmModuleInstance& instance, | 
|   581                        const Handle<FixedArray>& code_table, |   568                        const Handle<FixedArray>& code_table, | 
|   582                        ErrorThrower& thrower, Factory* factory, |   569                        ErrorThrower& thrower, Factory* factory, | 
|   583                        ModuleEnv& module_env, CodeStats& code_stats, |   570                        ModuleEnv& module_env, CodeStats& code_stats, | 
|   584                        PropertyDescriptor& desc) { |   571                        PropertyDescriptor& desc) { | 
|   585   for (uint32_t i = FLAG_skip_compiling_wasm_funcs; |   572   for (uint32_t i = FLAG_skip_compiling_wasm_funcs; | 
|   586        i < module->functions.size(); i++) { |   573        i < module->functions.size(); i++) { | 
|   587     const WasmFunction& func = module->functions[i]; |   574     const WasmFunction& func = module->functions[i]; | 
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   629   } |   616   } | 
|   630   return true; |   617   return true; | 
|   631 } |   618 } | 
|   632 }  // namespace |   619 }  // namespace | 
|   633  |   620  | 
|   634 // Instantiates a wasm module as a JSObject. |   621 // Instantiates a wasm module as a JSObject. | 
|   635 //  * allocates a backing store of {mem_size} bytes. |   622 //  * allocates a backing store of {mem_size} bytes. | 
|   636 //  * installs a named property "memory" for that buffer if exported |   623 //  * installs a named property "memory" for that buffer if exported | 
|   637 //  * installs named properties on the object for exported functions |   624 //  * installs named properties on the object for exported functions | 
|   638 //  * compiles wasm code to machine code |   625 //  * compiles wasm code to machine code | 
|   639 MaybeHandle<JSObject> WasmModule::Instantiate(Isolate* isolate, |   626 MaybeHandle<JSObject> WasmModule::Instantiate( | 
|   640                                               Handle<JSReceiver> ffi, |   627     Isolate* isolate, Handle<JSReceiver> ffi, | 
|   641                                               Handle<JSArrayBuffer> memory) { |   628     Handle<JSArrayBuffer> memory) const { | 
|   642   HistogramTimerScope wasm_instantiate_module_time_scope( |   629   HistogramTimerScope wasm_instantiate_module_time_scope( | 
|   643       isolate->counters()->wasm_instantiate_module_time()); |   630       isolate->counters()->wasm_instantiate_module_time()); | 
|   644   ErrorThrower thrower(isolate, "WasmModule::Instantiate()"); |   631   ErrorThrower thrower(isolate, "WasmModule::Instantiate()"); | 
|   645   Factory* factory = isolate->factory(); |   632   Factory* factory = isolate->factory(); | 
|   646  |   633  | 
|   647   PropertyDescriptor desc; |   634   PropertyDescriptor desc; | 
|   648   desc.set_writable(false); |   635   desc.set_writable(false); | 
|   649  |   636  | 
|   650   // If FLAG_print_wasm_code_size is set, this aggregates the sum of all code |   637   // If FLAG_print_wasm_code_size is set, this aggregates the sum of all code | 
|   651   // objects created for this module. |   638   // objects created for this module. | 
| (...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   768       //      unit at a time and execute the parallel phase of the compilation |   755       //      unit at a time and execute the parallel phase of the compilation | 
|   769       //      unit. After finishing the execution of the parallel phase, the |   756       //      unit. After finishing the execution of the parallel phase, the | 
|   770       //      result is enqueued in {executed_units}. |   757       //      result is enqueued in {executed_units}. | 
|   771       while (FetchAndExecuteCompilationUnit(isolate, &compilation_units, |   758       while (FetchAndExecuteCompilationUnit(isolate, &compilation_units, | 
|   772                                             &executed_units, &result_mutex, |   759                                             &executed_units, &result_mutex, | 
|   773                                             &next_unit)) { |   760                                             &next_unit)) { | 
|   774         // 3.b) If {executed_units} contains a compilation unit, the main thread |   761         // 3.b) If {executed_units} contains a compilation unit, the main thread | 
|   775         //      dequeues it and finishes the compilation unit. Compilation units |   762         //      dequeues it and finishes the compilation unit. Compilation units | 
|   776         //      are finished concurrently to the background threads to save |   763         //      are finished concurrently to the background threads to save | 
|   777         //      memory. |   764         //      memory. | 
|   778         FinishCompilationUnits(this, executed_units, results, result_mutex); |   765         FinishCompilationUnits(executed_units, results, result_mutex); | 
|   779       } |   766       } | 
|   780       // 4) After the parallel phase of all compilation units has started, the |   767       // 4) After the parallel phase of all compilation units has started, the | 
|   781       //    main thread waits for all {WasmCompilationTask} instances to finish. |   768       //    main thread waits for all {WasmCompilationTask} instances to finish. | 
|   782       WaitForCompilationTasks(isolate, task_ids.get(), pending_tasks); |   769       WaitForCompilationTasks(isolate, task_ids.get(), pending_tasks); | 
|   783       // Finish the compilation of the remaining compilation units. |   770       // Finish the compilation of the remaining compilation units. | 
|   784       FinishCompilationUnits(this, executed_units, results, result_mutex); |   771       FinishCompilationUnits(executed_units, results, result_mutex); | 
|   785     } |   772     } | 
|   786     // 5) The main thread finishes the compilation. |   773     // 5) The main thread finishes the compilation. | 
|   787     if (!FinishCompilation(isolate, this, ffi, results, instance, code_table, |   774     if (!FinishCompilation(isolate, this, ffi, results, instance, code_table, | 
|   788                            thrower, factory, module_env, code_stats, desc)) { |   775                            thrower, factory, module_env, code_stats, desc)) { | 
|   789       instance.js_object = Handle<JSObject>::null(); |   776       instance.js_object = Handle<JSObject>::null(); | 
|   790     } |   777     } | 
|   791  |   778  | 
|   792     // Patch all direct call sites. |   779     // Patch all direct call sites. | 
|   793     linker.Link(instance.function_table, this->function_table); |   780     linker.Link(instance.function_table, this->function_table); | 
|   794     instance.js_object->SetInternalField(kWasmModuleFunctionTable, |   781     instance.js_object->SetInternalField(kWasmModuleFunctionTable, | 
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   874 Handle<Code> ModuleEnv::GetImportCode(uint32_t index) { |   861 Handle<Code> ModuleEnv::GetImportCode(uint32_t index) { | 
|   875   DCHECK(IsValidImport(index)); |   862   DCHECK(IsValidImport(index)); | 
|   876   return instance ? instance->import_code[index] : Handle<Code>::null(); |   863   return instance ? instance->import_code[index] : Handle<Code>::null(); | 
|   877 } |   864 } | 
|   878  |   865  | 
|   879 compiler::CallDescriptor* ModuleEnv::GetCallDescriptor(Zone* zone, |   866 compiler::CallDescriptor* ModuleEnv::GetCallDescriptor(Zone* zone, | 
|   880                                                        uint32_t index) { |   867                                                        uint32_t index) { | 
|   881   DCHECK(IsValidFunction(index)); |   868   DCHECK(IsValidFunction(index)); | 
|   882   // Always make a direct call to whatever is in the table at that location. |   869   // Always make a direct call to whatever is in the table at that location. | 
|   883   // A wrapper will be generated for FFI calls. |   870   // A wrapper will be generated for FFI calls. | 
|   884   WasmFunction* function = &module->functions[index]; |   871   const WasmFunction* function = &module->functions[index]; | 
|   885   return GetWasmCallDescriptor(zone, function->sig); |   872   return GetWasmCallDescriptor(zone, function->sig); | 
|   886 } |   873 } | 
|   887  |   874  | 
|   888 int32_t CompileAndRunWasmModule(Isolate* isolate, const byte* module_start, |   875 int32_t CompileAndRunWasmModule(Isolate* isolate, const byte* module_start, | 
|   889                                 const byte* module_end, bool asm_js) { |   876                                 const byte* module_end, bool asm_js) { | 
|   890   HandleScope scope(isolate); |   877   HandleScope scope(isolate); | 
|   891   Zone zone(isolate->allocator()); |   878   Zone zone(isolate->allocator()); | 
|   892   // Decode the module, but don't verify function bodies, since we'll |   879   // Decode the module, but don't verify function bodies, since we'll | 
|   893   // be compiling them anyway. |   880   // be compiling them anyway. | 
|   894   ModuleResult result = DecodeWasmModule(isolate, &zone, module_start, |   881   ModuleResult result = DecodeWasmModule(isolate, &zone, module_start, | 
|   895                                          module_end, false, kWasmOrigin); |   882                                          module_end, false, kWasmOrigin); | 
|   896   if (result.failed()) { |   883   if (result.failed()) { | 
|   897     if (result.val) { |   884     if (result.val) { | 
|   898       delete result.val; |   885       delete result.val; | 
|   899     } |   886     } | 
|   900     // Module verification failed. throw. |   887     // Module verification failed. throw. | 
|   901     std::ostringstream str; |   888     std::ostringstream str; | 
|   902     str << "WASM.compileRun() failed: " << result; |   889     str << "WASM.compileRun() failed: " << result; | 
|   903     isolate->Throw( |   890     isolate->Throw( | 
|   904         *isolate->factory()->NewStringFromAsciiChecked(str.str().c_str())); |   891         *isolate->factory()->NewStringFromAsciiChecked(str.str().c_str())); | 
|   905     return -1; |   892     return -1; | 
|   906   } |   893   } | 
|   907  |   894  | 
|   908   int32_t retval = CompileAndRunWasmModule(isolate, result.val); |   895   int32_t retval = CompileAndRunWasmModule(isolate, result.val); | 
|   909   delete result.val; |   896   delete result.val; | 
|   910   return retval; |   897   return retval; | 
|   911 } |   898 } | 
|   912  |   899  | 
|   913 int32_t CompileAndRunWasmModule(Isolate* isolate, WasmModule* module) { |   900 int32_t CompileAndRunWasmModule(Isolate* isolate, const WasmModule* module) { | 
|   914   ErrorThrower thrower(isolate, "CompileAndRunWasmModule"); |   901   ErrorThrower thrower(isolate, "CompileAndRunWasmModule"); | 
|   915   WasmModuleInstance instance(module); |   902   WasmModuleInstance instance(module); | 
|   916  |   903  | 
|   917   // Allocate and initialize the linear memory. |   904   // Allocate and initialize the linear memory. | 
|   918   if (!AllocateMemory(&thrower, isolate, &instance)) { |   905   if (!AllocateMemory(&thrower, isolate, &instance)) { | 
|   919     return -1; |   906     return -1; | 
|   920   } |   907   } | 
|   921   LoadDataSegments(module, instance.mem_start, instance.mem_size); |   908   LoadDataSegments(module, instance.mem_start, instance.mem_size); | 
|   922  |   909  | 
|   923   // Allocate the globals area if necessary. |   910   // Allocate the globals area if necessary. | 
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   994                                         uint32_t func_index) { |   981                                         uint32_t func_index) { | 
|   995   Object* func_names_arr_obj = wasm->GetInternalField(kWasmFunctionNamesArray); |   982   Object* func_names_arr_obj = wasm->GetInternalField(kWasmFunctionNamesArray); | 
|   996   if (func_names_arr_obj->IsUndefined()) return Handle<String>::null(); |   983   if (func_names_arr_obj->IsUndefined()) return Handle<String>::null(); | 
|   997   return GetWasmFunctionNameFromTable( |   984   return GetWasmFunctionNameFromTable( | 
|   998       handle(ByteArray::cast(func_names_arr_obj)), func_index); |   985       handle(ByteArray::cast(func_names_arr_obj)), func_index); | 
|   999 } |   986 } | 
|  1000  |   987  | 
|  1001 }  // namespace wasm |   988 }  // namespace wasm | 
|  1002 }  // namespace internal |   989 }  // namespace internal | 
|  1003 }  // namespace v8 |   990 }  // namespace v8 | 
| OLD | NEW |