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 995 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1006 Handle<JSArrayBuffer> memory = Handle<JSArrayBuffer>( | 1006 Handle<JSArrayBuffer> memory = Handle<JSArrayBuffer>( |
1007 JSArrayBuffer::cast(instance->GetInternalField(kWasmMemArrayBuffer))); | 1007 JSArrayBuffer::cast(instance->GetInternalField(kWasmMemArrayBuffer))); |
1008 JSObject::AddProperty(exports_object, name, memory, READ_ONLY); | 1008 JSObject::AddProperty(exports_object, name, memory, READ_ONLY); |
1009 } | 1009 } |
1010 } | 1010 } |
1011 return true; | 1011 return true; |
1012 } | 1012 } |
1013 | 1013 |
1014 } // namespace | 1014 } // namespace |
1015 | 1015 |
1016 MaybeHandle<FixedArray> WasmModule::CompileFunctions(Isolate* isolate) const { | 1016 MaybeHandle<FixedArray> WasmModule::CompileFunctions( |
| 1017 Isolate* isolate, ErrorThrower* thrower) const { |
1017 Factory* factory = isolate->factory(); | 1018 Factory* factory = isolate->factory(); |
1018 ErrorThrower thrower(isolate, "WasmModule::CompileFunctions()"); | |
1019 | 1019 |
1020 MaybeHandle<FixedArray> nothing; | 1020 MaybeHandle<FixedArray> nothing; |
1021 | 1021 |
1022 WasmModuleInstance temp_instance_for_compilation(this); | 1022 WasmModuleInstance temp_instance_for_compilation(this); |
1023 temp_instance_for_compilation.context = isolate->native_context(); | 1023 temp_instance_for_compilation.context = isolate->native_context(); |
1024 temp_instance_for_compilation.mem_size = GetMinModuleMemSize(this); | 1024 temp_instance_for_compilation.mem_size = GetMinModuleMemSize(this); |
1025 temp_instance_for_compilation.mem_start = nullptr; | 1025 temp_instance_for_compilation.mem_start = nullptr; |
1026 temp_instance_for_compilation.globals_start = nullptr; | 1026 temp_instance_for_compilation.globals_start = nullptr; |
1027 | 1027 |
1028 MaybeHandle<FixedArray> indirect_table = BuildFunctionTable(isolate, this); | 1028 MaybeHandle<FixedArray> indirect_table = BuildFunctionTable(isolate, this); |
(...skipping 16 matching lines...) Expand all Loading... |
1045 | 1045 |
1046 temp_instance_for_compilation.import_code.resize(import_table.size()); | 1046 temp_instance_for_compilation.import_code.resize(import_table.size()); |
1047 for (uint32_t i = 0; i < import_table.size(); ++i) { | 1047 for (uint32_t i = 0; i < import_table.size(); ++i) { |
1048 temp_instance_for_compilation.import_code[i] = | 1048 temp_instance_for_compilation.import_code[i] = |
1049 CreatePlaceholder(factory, i, Code::WASM_TO_JS_FUNCTION); | 1049 CreatePlaceholder(factory, i, Code::WASM_TO_JS_FUNCTION); |
1050 } | 1050 } |
1051 isolate->counters()->wasm_functions_per_module()->AddSample( | 1051 isolate->counters()->wasm_functions_per_module()->AddSample( |
1052 static_cast<int>(functions.size())); | 1052 static_cast<int>(functions.size())); |
1053 if (FLAG_wasm_num_compilation_tasks != 0) { | 1053 if (FLAG_wasm_num_compilation_tasks != 0) { |
1054 CompileInParallel(isolate, this, | 1054 CompileInParallel(isolate, this, |
1055 temp_instance_for_compilation.function_code, &thrower, | 1055 temp_instance_for_compilation.function_code, thrower, |
1056 &module_env); | 1056 &module_env); |
1057 } else { | 1057 } else { |
1058 CompileSequentially(isolate, this, | 1058 CompileSequentially(isolate, this, |
1059 temp_instance_for_compilation.function_code, &thrower, | 1059 temp_instance_for_compilation.function_code, thrower, |
1060 &module_env); | 1060 &module_env); |
1061 } | 1061 } |
1062 if (thrower.error()) return nothing; | 1062 if (thrower->error()) return nothing; |
1063 | 1063 |
1064 // At this point, compilation has completed. Update the code table. | 1064 // At this point, compilation has completed. Update the code table. |
1065 for (size_t i = FLAG_skip_compiling_wasm_funcs; | 1065 for (size_t i = FLAG_skip_compiling_wasm_funcs; |
1066 i < temp_instance_for_compilation.function_code.size(); ++i) { | 1066 i < temp_instance_for_compilation.function_code.size(); ++i) { |
1067 Code* code = *temp_instance_for_compilation.function_code[i]; | 1067 Code* code = *temp_instance_for_compilation.function_code[i]; |
1068 compiled_functions->set(static_cast<int>(i), code); | 1068 compiled_functions->set(static_cast<int>(i), code); |
1069 } | 1069 } |
1070 | 1070 |
1071 // Create the compiled module object, and populate with compiled functions | 1071 // Create the compiled module object, and populate with compiled functions |
1072 // and information needed at instantiation time. This object needs to be | 1072 // and information needed at instantiation time. This object needs to be |
(...skipping 19 matching lines...) Expand all Loading... |
1092 for (int i = 0; i < export_size; ++i) { | 1092 for (int i = 0; i < export_size; ++i) { |
1093 Handle<FixedArray> export_metadata = | 1093 Handle<FixedArray> export_metadata = |
1094 factory->NewFixedArray(kWasmExportMetadataTableSize, TENURED); | 1094 factory->NewFixedArray(kWasmExportMetadataTableSize, TENURED); |
1095 const WasmExport& exp = export_table[i]; | 1095 const WasmExport& exp = export_table[i]; |
1096 WasmName str = GetName(exp.name_offset, exp.name_length); | 1096 WasmName str = GetName(exp.name_offset, exp.name_length); |
1097 Handle<String> name = factory->InternalizeUtf8String(str); | 1097 Handle<String> name = factory->InternalizeUtf8String(str); |
1098 Handle<Code> code = | 1098 Handle<Code> code = |
1099 temp_instance_for_compilation.function_code[exp.func_index]; | 1099 temp_instance_for_compilation.function_code[exp.func_index]; |
1100 Handle<Code> export_code = compiler::CompileJSToWasmWrapper( | 1100 Handle<Code> export_code = compiler::CompileJSToWasmWrapper( |
1101 isolate, &module_env, code, exp.func_index); | 1101 isolate, &module_env, code, exp.func_index); |
1102 if (thrower.error()) return nothing; | 1102 if (thrower->error()) return nothing; |
1103 export_metadata->set(kExportCode, *export_code); | 1103 export_metadata->set(kExportCode, *export_code); |
1104 export_metadata->set(kExportName, *name); | 1104 export_metadata->set(kExportName, *name); |
1105 export_metadata->set( | 1105 export_metadata->set( |
1106 kExportArity, Smi::FromInt(static_cast<int>( | 1106 kExportArity, Smi::FromInt(static_cast<int>( |
1107 functions[exp.func_index].sig->parameter_count()))); | 1107 functions[exp.func_index].sig->parameter_count()))); |
1108 export_metadata->set(kExportedFunctionIndex, | 1108 export_metadata->set(kExportedFunctionIndex, |
1109 Smi::FromInt(static_cast<int>(exp.func_index))); | 1109 Smi::FromInt(static_cast<int>(exp.func_index))); |
1110 exports->set(i, *export_metadata); | 1110 exports->set(i, *export_metadata); |
1111 if (exp.func_index == start_function_index) { | 1111 if (exp.func_index == start_function_index) { |
1112 startup_fct = export_code; | 1112 startup_fct = export_code; |
(...skipping 389 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1502 } | 1502 } |
1503 | 1503 |
1504 if (module->import_table.size() > 0) { | 1504 if (module->import_table.size() > 0) { |
1505 thrower.Error("Not supported: module has imports."); | 1505 thrower.Error("Not supported: module has imports."); |
1506 } | 1506 } |
1507 if (module->export_table.size() == 0) { | 1507 if (module->export_table.size() == 0) { |
1508 thrower.Error("Not supported: module has no exports."); | 1508 thrower.Error("Not supported: module has no exports."); |
1509 } | 1509 } |
1510 | 1510 |
1511 if (thrower.error()) return -1; | 1511 if (thrower.error()) return -1; |
1512 MaybeHandle<FixedArray> compiled_module = module->CompileFunctions(isolate); | 1512 MaybeHandle<FixedArray> compiled_module = |
| 1513 module->CompileFunctions(isolate, &thrower); |
1513 | 1514 |
1514 if (compiled_module.is_null()) return -1; | 1515 if (compiled_module.is_null()) return -1; |
1515 Handle<JSObject> instance = | 1516 Handle<JSObject> instance = |
1516 WasmModule::Instantiate(isolate, compiled_module.ToHandleChecked(), | 1517 WasmModule::Instantiate(isolate, compiled_module.ToHandleChecked(), |
1517 Handle<JSReceiver>::null(), | 1518 Handle<JSReceiver>::null(), |
1518 Handle<JSArrayBuffer>::null()) | 1519 Handle<JSArrayBuffer>::null()) |
1519 .ToHandleChecked(); | 1520 .ToHandleChecked(); |
1520 | 1521 |
1521 Handle<Name> exports = isolate->factory()->InternalizeUtf8String("exports"); | 1522 Handle<Name> exports = isolate->factory()->InternalizeUtf8String("exports"); |
1522 Handle<JSObject> exports_object = Handle<JSObject>::cast( | 1523 Handle<JSObject> exports_object = Handle<JSObject>::cast( |
(...skipping 24 matching lines...) Expand all Loading... |
1547 return static_cast<int32_t>(HeapNumber::cast(*result)->value()); | 1548 return static_cast<int32_t>(HeapNumber::cast(*result)->value()); |
1548 } | 1549 } |
1549 thrower.Error("WASM.compileRun() failed: Return value should be number"); | 1550 thrower.Error("WASM.compileRun() failed: Return value should be number"); |
1550 return -1; | 1551 return -1; |
1551 } | 1552 } |
1552 | 1553 |
1553 } // namespace testing | 1554 } // namespace testing |
1554 } // namespace wasm | 1555 } // namespace wasm |
1555 } // namespace internal | 1556 } // namespace internal |
1556 } // namespace v8 | 1557 } // namespace v8 |
OLD | NEW |