| 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 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 137 CHECK_LE(segment.source_size, mem_size); | 137 CHECK_LE(segment.source_size, mem_size); |
| 138 CHECK_LE(segment.dest_addr + segment.source_size, mem_size); | 138 CHECK_LE(segment.dest_addr + segment.source_size, mem_size); |
| 139 byte* addr = mem_addr + segment.dest_addr; | 139 byte* addr = mem_addr + segment.dest_addr; |
| 140 memcpy(addr, module->module_start + segment.source_offset, | 140 memcpy(addr, module->module_start + segment.source_offset, |
| 141 segment.source_size); | 141 segment.source_size); |
| 142 } | 142 } |
| 143 } | 143 } |
| 144 | 144 |
| 145 Handle<FixedArray> BuildFunctionTable(Isolate* isolate, | 145 Handle<FixedArray> BuildFunctionTable(Isolate* isolate, |
| 146 const WasmModule* module) { | 146 const WasmModule* module) { |
| 147 if (module->function_table.size() == 0) { | 147 // Compute the size of the indirect function table |
| 148 uint32_t table_size = module->FunctionTableSize(); |
| 149 if (table_size == 0) { |
| 148 return Handle<FixedArray>::null(); | 150 return Handle<FixedArray>::null(); |
| 149 } | 151 } |
| 150 int table_size = static_cast<int>(module->function_table.size()); | 152 |
| 151 Handle<FixedArray> fixed = isolate->factory()->NewFixedArray(2 * table_size); | 153 Handle<FixedArray> fixed = isolate->factory()->NewFixedArray(2 * table_size); |
| 152 for (int i = 0; i < table_size; i++) { | 154 for (uint32_t i = 0; |
| 155 i < static_cast<uint32_t>(module->function_table.size()); |
| 156 ++i) { |
| 153 const WasmFunction* function = | 157 const WasmFunction* function = |
| 154 &module->functions[module->function_table[i]]; | 158 &module->functions[module->function_table[i]]; |
| 155 fixed->set(i, Smi::FromInt(function->sig_index)); | 159 fixed->set(i, Smi::FromInt(function->sig_index)); |
| 156 } | 160 } |
| 157 return fixed; | 161 return fixed; |
| 158 } | 162 } |
| 159 | 163 |
| 160 Handle<JSArrayBuffer> NewArrayBuffer(Isolate* isolate, size_t size, | 164 Handle<JSArrayBuffer> NewArrayBuffer(Isolate* isolate, size_t size, |
| 161 byte** backing_store) { | 165 byte** backing_store) { |
| 162 *backing_store = nullptr; | 166 *backing_store = nullptr; |
| (...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 335 } // namespace | 339 } // namespace |
| 336 | 340 |
| 337 WasmModule::WasmModule() | 341 WasmModule::WasmModule() |
| 338 : module_start(nullptr), | 342 : module_start(nullptr), |
| 339 module_end(nullptr), | 343 module_end(nullptr), |
| 340 min_mem_pages(0), | 344 min_mem_pages(0), |
| 341 max_mem_pages(0), | 345 max_mem_pages(0), |
| 342 mem_export(false), | 346 mem_export(false), |
| 343 mem_external(false), | 347 mem_external(false), |
| 344 start_function_index(-1), | 348 start_function_index(-1), |
| 345 origin(kWasmOrigin) {} | 349 origin(kWasmOrigin), |
| 350 globals_size(0), |
| 351 indirect_table_size(0) {} |
| 346 | 352 |
| 347 static MaybeHandle<JSFunction> ReportFFIError(ErrorThrower& thrower, | 353 static MaybeHandle<JSFunction> ReportFFIError(ErrorThrower& thrower, |
| 348 const char* error, uint32_t index, | 354 const char* error, uint32_t index, |
| 349 wasm::WasmName module_name, | 355 wasm::WasmName module_name, |
| 350 wasm::WasmName function_name) { | 356 wasm::WasmName function_name) { |
| 351 if (!function_name.is_empty()) { | 357 if (!function_name.is_empty()) { |
| 352 thrower.Error("Import #%d module=\"%.*s\" function=\"%.*s\" error: %s", | 358 thrower.Error("Import #%d module=\"%.*s\" function=\"%.*s\" error: %s", |
| 353 index, module_name.length(), module_name.start(), | 359 index, module_name.length(), module_name.start(), |
| 354 function_name.length(), function_name.start(), error); | 360 function_name.length(), function_name.start(), error); |
| 355 } else { | 361 } else { |
| (...skipping 304 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 660 str.start()); | 666 str.start()); |
| 661 break; | 667 break; |
| 662 } | 668 } |
| 663 // Install the code into the linker table. | 669 // Install the code into the linker table. |
| 664 functions[i] = code; | 670 functions[i] = code; |
| 665 } | 671 } |
| 666 } | 672 } |
| 667 | 673 |
| 668 void PopulateFunctionTable(WasmModuleInstance* instance) { | 674 void PopulateFunctionTable(WasmModuleInstance* instance) { |
| 669 if (!instance->function_table.is_null()) { | 675 if (!instance->function_table.is_null()) { |
| 670 int table_size = static_cast<int>(instance->module->function_table.size()); | 676 uint32_t table_size = instance->module->FunctionTableSize(); |
| 671 DCHECK_EQ(instance->function_table->length(), table_size * 2); | 677 DCHECK_EQ(table_size * 2, instance->function_table->length()); |
| 672 for (int i = 0; i < table_size; i++) { | 678 uint32_t populated_table_size = |
| 673 instance->function_table->set( | 679 static_cast<uint32_t>(instance->module->function_table.size()); |
| 674 i + table_size, | 680 for (uint32_t i = 0; i < populated_table_size; ++i) { |
| 675 *instance->function_code[instance->module->function_table[i]]); | 681 instance->function_table->set( |
| 682 i + table_size, |
| 683 *instance->function_code[instance->module->function_table[i]]); |
| 676 } | 684 } |
| 677 } | 685 } |
| 678 } | 686 } |
| 679 } // namespace | 687 } // namespace |
| 680 | 688 |
| 681 void SetDeoptimizationData(Factory* factory, Handle<JSObject> js_object, | 689 void SetDeoptimizationData(Factory* factory, Handle<JSObject> js_object, |
| 682 std::vector<Handle<Code>>& functions) { | 690 std::vector<Handle<Code>>& functions) { |
| 683 for (size_t i = FLAG_skip_compiling_wasm_funcs; i < functions.size(); ++i) { | 691 for (size_t i = FLAG_skip_compiling_wasm_funcs; i < functions.size(); ++i) { |
| 684 Handle<Code> code = functions[i]; | 692 Handle<Code> code = functions[i]; |
| 685 DCHECK(code->deoptimization_data() == nullptr || | 693 DCHECK(code->deoptimization_data() == nullptr || |
| (...skipping 429 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1115 Object* info = wasm->GetInternalField(kWasmDebugInfo); | 1123 Object* info = wasm->GetInternalField(kWasmDebugInfo); |
| 1116 if (!info->IsUndefined(wasm->GetIsolate())) return WasmDebugInfo::cast(info); | 1124 if (!info->IsUndefined(wasm->GetIsolate())) return WasmDebugInfo::cast(info); |
| 1117 Handle<WasmDebugInfo> new_info = WasmDebugInfo::New(handle(wasm)); | 1125 Handle<WasmDebugInfo> new_info = WasmDebugInfo::New(handle(wasm)); |
| 1118 wasm->SetInternalField(kWasmDebugInfo, *new_info); | 1126 wasm->SetInternalField(kWasmDebugInfo, *new_info); |
| 1119 return *new_info; | 1127 return *new_info; |
| 1120 } | 1128 } |
| 1121 | 1129 |
| 1122 } // namespace wasm | 1130 } // namespace wasm |
| 1123 } // namespace internal | 1131 } // namespace internal |
| 1124 } // namespace v8 | 1132 } // namespace v8 |
| OLD | NEW |