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