| 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 <memory> | 5 #include <memory> |
| 6 | 6 |
| 7 #include "src/base/atomic-utils.h" | 7 #include "src/base/atomic-utils.h" |
| 8 #include "src/code-stubs.h" | 8 #include "src/code-stubs.h" |
| 9 | 9 |
| 10 #include "src/macro-assembler.h" | 10 #include "src/macro-assembler.h" |
| 11 #include "src/objects.h" | 11 #include "src/objects.h" |
| 12 #include "src/property-descriptor.h" | 12 #include "src/property-descriptor.h" |
| 13 #include "src/simulator.h" | 13 #include "src/simulator.h" |
| 14 #include "src/snapshot/snapshot.h" | 14 #include "src/snapshot/snapshot.h" |
| 15 #include "src/v8.h" | 15 #include "src/v8.h" |
| 16 | 16 |
| 17 #include "src/wasm/ast-decoder.h" | 17 #include "src/wasm/ast-decoder.h" |
| 18 #include "src/wasm/module-decoder.h" | 18 #include "src/wasm/module-decoder.h" |
| 19 #include "src/wasm/wasm-js.h" | 19 #include "src/wasm/wasm-js.h" |
| 20 #include "src/wasm/wasm-limits.h" |
| 20 #include "src/wasm/wasm-module.h" | 21 #include "src/wasm/wasm-module.h" |
| 21 #include "src/wasm/wasm-objects.h" | 22 #include "src/wasm/wasm-objects.h" |
| 22 #include "src/wasm/wasm-result.h" | 23 #include "src/wasm/wasm-result.h" |
| 23 | 24 |
| 24 #include "src/compiler/wasm-compiler.h" | 25 #include "src/compiler/wasm-compiler.h" |
| 25 | 26 |
| 26 using namespace v8::internal; | 27 using namespace v8::internal; |
| 27 using namespace v8::internal::wasm; | 28 using namespace v8::internal::wasm; |
| 28 namespace base = v8::base; | 29 namespace base = v8::base; |
| 29 | 30 |
| (...skipping 650 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 680 } | 681 } |
| 681 WasmFunction& func = module->functions[func_index]; | 682 WasmFunction& func = module->functions[func_index]; |
| 682 return {static_cast<int>(func.code_start_offset), | 683 return {static_cast<int>(func.code_start_offset), |
| 683 static_cast<int>(func.code_end_offset - func.code_start_offset)}; | 684 static_cast<int>(func.code_end_offset - func.code_start_offset)}; |
| 684 } | 685 } |
| 685 | 686 |
| 686 } // namespace | 687 } // namespace |
| 687 | 688 |
| 688 Handle<JSArrayBuffer> wasm::NewArrayBuffer(Isolate* isolate, size_t size, | 689 Handle<JSArrayBuffer> wasm::NewArrayBuffer(Isolate* isolate, size_t size, |
| 689 bool enable_guard_regions) { | 690 bool enable_guard_regions) { |
| 690 if (size > (WasmModule::kV8MaxPages * WasmModule::kPageSize)) { | 691 if (size > (kV8MaxWasmMemoryPages * WasmModule::kPageSize)) { |
| 691 // TODO(titzer): lift restriction on maximum memory allocated here. | 692 // TODO(titzer): lift restriction on maximum memory allocated here. |
| 692 return Handle<JSArrayBuffer>::null(); | 693 return Handle<JSArrayBuffer>::null(); |
| 693 } | 694 } |
| 694 | 695 |
| 695 enable_guard_regions = enable_guard_regions && kGuardRegionsSupported; | 696 enable_guard_regions = enable_guard_regions && kGuardRegionsSupported; |
| 696 | 697 |
| 697 bool is_external; // Set by TryAllocateBackingStore | 698 bool is_external; // Set by TryAllocateBackingStore |
| 698 void* memory = | 699 void* memory = |
| 699 TryAllocateBackingStore(isolate, size, enable_guard_regions, is_external); | 700 TryAllocateBackingStore(isolate, size, enable_guard_regions, is_external); |
| 700 | 701 |
| (...skipping 982 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1683 break; | 1684 break; |
| 1684 default: | 1685 default: |
| 1685 UNREACHABLE(); | 1686 UNREACHABLE(); |
| 1686 break; | 1687 break; |
| 1687 } | 1688 } |
| 1688 } | 1689 } |
| 1689 } | 1690 } |
| 1690 | 1691 |
| 1691 // Allocate memory for a module instance as a new JSArrayBuffer. | 1692 // Allocate memory for a module instance as a new JSArrayBuffer. |
| 1692 Handle<JSArrayBuffer> AllocateMemory(uint32_t min_mem_pages) { | 1693 Handle<JSArrayBuffer> AllocateMemory(uint32_t min_mem_pages) { |
| 1693 if (min_mem_pages > WasmModule::kV8MaxPages) { | 1694 if (min_mem_pages > kV8MaxWasmMemoryPages) { |
| 1694 thrower_->RangeError("Out of memory: wasm memory too large"); | 1695 thrower_->RangeError("Out of memory: wasm memory too large"); |
| 1695 return Handle<JSArrayBuffer>::null(); | 1696 return Handle<JSArrayBuffer>::null(); |
| 1696 } | 1697 } |
| 1697 const bool enable_guard_regions = EnableGuardRegions(); | 1698 const bool enable_guard_regions = EnableGuardRegions(); |
| 1698 Handle<JSArrayBuffer> mem_buffer = NewArrayBuffer( | 1699 Handle<JSArrayBuffer> mem_buffer = NewArrayBuffer( |
| 1699 isolate_, min_mem_pages * WasmModule::kPageSize, enable_guard_regions); | 1700 isolate_, min_mem_pages * WasmModule::kPageSize, enable_guard_regions); |
| 1700 | 1701 |
| 1701 if (mem_buffer.is_null()) { | 1702 if (mem_buffer.is_null()) { |
| 1702 thrower_->RangeError("Out of memory: wasm memory"); | 1703 thrower_->RangeError("Out of memory: wasm memory"); |
| 1703 } | 1704 } |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1770 export_index++; | 1771 export_index++; |
| 1771 break; | 1772 break; |
| 1772 } | 1773 } |
| 1773 case kExternalTable: { | 1774 case kExternalTable: { |
| 1774 // Export a table as a WebAssembly.Table object. | 1775 // Export a table as a WebAssembly.Table object. |
| 1775 TableInstance& table_instance = table_instances_[exp.index]; | 1776 TableInstance& table_instance = table_instances_[exp.index]; |
| 1776 WasmIndirectFunctionTable& table = | 1777 WasmIndirectFunctionTable& table = |
| 1777 module_->function_tables[exp.index]; | 1778 module_->function_tables[exp.index]; |
| 1778 if (table_instance.table_object.is_null()) { | 1779 if (table_instance.table_object.is_null()) { |
| 1779 uint32_t maximum = | 1780 uint32_t maximum = |
| 1780 table.has_max ? table.max_size : WasmModule::kV8MaxTableSize; | 1781 table.has_max ? table.max_size : kV8MaxWasmTableSize; |
| 1781 table_instance.table_object = WasmTableObject::New( | 1782 table_instance.table_object = WasmTableObject::New( |
| 1782 isolate_, table.min_size, maximum, &table_instance.js_wrappers); | 1783 isolate_, table.min_size, maximum, &table_instance.js_wrappers); |
| 1783 } | 1784 } |
| 1784 desc.set_value(table_instance.table_object); | 1785 desc.set_value(table_instance.table_object); |
| 1785 break; | 1786 break; |
| 1786 } | 1787 } |
| 1787 case kExternalMemory: { | 1788 case kExternalMemory: { |
| 1788 // Export the memory as a WebAssembly.Memory object. | 1789 // Export the memory as a WebAssembly.Memory object. |
| 1789 Handle<WasmMemoryObject> memory_object; | 1790 Handle<WasmMemoryObject> memory_object; |
| 1790 if (!instance->has_memory_object()) { | 1791 if (!instance->has_memory_object()) { |
| (...skipping 347 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2138 isolate); | 2139 isolate); |
| 2139 | 2140 |
| 2140 int maximum = memory_object->maximum_pages(); | 2141 int maximum = memory_object->maximum_pages(); |
| 2141 if (maximum > 0) return static_cast<uint32_t>(maximum); | 2142 if (maximum > 0) return static_cast<uint32_t>(maximum); |
| 2142 } | 2143 } |
| 2143 uint32_t compiled_max_pages = | 2144 uint32_t compiled_max_pages = |
| 2144 instance->get_compiled_module()->max_mem_pages(); | 2145 instance->get_compiled_module()->max_mem_pages(); |
| 2145 isolate->counters()->wasm_max_mem_pages_count()->AddSample( | 2146 isolate->counters()->wasm_max_mem_pages_count()->AddSample( |
| 2146 compiled_max_pages); | 2147 compiled_max_pages); |
| 2147 if (compiled_max_pages != 0) return compiled_max_pages; | 2148 if (compiled_max_pages != 0) return compiled_max_pages; |
| 2148 return WasmModule::kV8MaxPages; | 2149 return kV8MaxWasmMemoryPages; |
| 2149 } | 2150 } |
| 2150 | 2151 |
| 2151 Handle<JSArrayBuffer> GrowMemoryBuffer(Isolate* isolate, | 2152 Handle<JSArrayBuffer> GrowMemoryBuffer(Isolate* isolate, |
| 2152 MaybeHandle<JSArrayBuffer> buffer, | 2153 MaybeHandle<JSArrayBuffer> buffer, |
| 2153 uint32_t pages, uint32_t max_pages) { | 2154 uint32_t pages, uint32_t max_pages) { |
| 2154 Handle<JSArrayBuffer> old_buffer; | 2155 Handle<JSArrayBuffer> old_buffer; |
| 2155 Address old_mem_start = nullptr; | 2156 Address old_mem_start = nullptr; |
| 2156 uint32_t old_size = 0; | 2157 uint32_t old_size = 0; |
| 2157 if (buffer.ToHandle(&old_buffer) && old_buffer->backing_store() != nullptr) { | 2158 if (buffer.ToHandle(&old_buffer) && old_buffer->backing_store() != nullptr) { |
| 2158 old_mem_start = static_cast<Address>(old_buffer->backing_store()); | 2159 old_mem_start = static_cast<Address>(old_buffer->backing_store()); |
| 2159 DCHECK_NOT_NULL(old_mem_start); | 2160 DCHECK_NOT_NULL(old_mem_start); |
| 2160 old_size = old_buffer->byte_length()->Number(); | 2161 old_size = old_buffer->byte_length()->Number(); |
| 2161 } | 2162 } |
| 2162 DCHECK(old_size + pages * WasmModule::kPageSize <= | 2163 DCHECK(old_size + pages * WasmModule::kPageSize <= |
| 2163 std::numeric_limits<uint32_t>::max()); | 2164 std::numeric_limits<uint32_t>::max()); |
| 2164 uint32_t new_size = old_size + pages * WasmModule::kPageSize; | 2165 uint32_t new_size = old_size + pages * WasmModule::kPageSize; |
| 2165 if (new_size <= old_size || max_pages * WasmModule::kPageSize < new_size || | 2166 if (new_size <= old_size || max_pages * WasmModule::kPageSize < new_size || |
| 2166 WasmModule::kV8MaxPages * WasmModule::kPageSize < new_size) { | 2167 kV8MaxWasmMemoryPages * WasmModule::kPageSize < new_size) { |
| 2167 return Handle<JSArrayBuffer>::null(); | 2168 return Handle<JSArrayBuffer>::null(); |
| 2168 } | 2169 } |
| 2169 | 2170 |
| 2170 Handle<JSArrayBuffer> new_buffer; | 2171 Handle<JSArrayBuffer> new_buffer; |
| 2171 if (!old_buffer.is_null() && old_buffer->has_guard_region()) { | 2172 if (!old_buffer.is_null() && old_buffer->has_guard_region()) { |
| 2172 // We don't move the backing store, we simply change the protection to make | 2173 // We don't move the backing store, we simply change the protection to make |
| 2173 // more of it accessible. | 2174 // more of it accessible. |
| 2174 base::OS::Unprotect(old_buffer->backing_store(), new_size); | 2175 base::OS::Unprotect(old_buffer->backing_store(), new_size); |
| 2175 reinterpret_cast<v8::Isolate*>(isolate) | 2176 reinterpret_cast<v8::Isolate*>(isolate) |
| 2176 ->AdjustAmountOfExternalAllocatedMemory(pages * WasmModule::kPageSize); | 2177 ->AdjustAmountOfExternalAllocatedMemory(pages * WasmModule::kPageSize); |
| (...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2357 MaybeHandle<String> WasmCompiledModule::GetFunctionName( | 2358 MaybeHandle<String> WasmCompiledModule::GetFunctionName( |
| 2358 Handle<WasmCompiledModule> compiled_module, uint32_t func_index) { | 2359 Handle<WasmCompiledModule> compiled_module, uint32_t func_index) { |
| 2359 DCHECK_LT(func_index, compiled_module->module()->functions.size()); | 2360 DCHECK_LT(func_index, compiled_module->module()->functions.size()); |
| 2360 WasmFunction& function = compiled_module->module()->functions[func_index]; | 2361 WasmFunction& function = compiled_module->module()->functions[func_index]; |
| 2361 Isolate* isolate = compiled_module->GetIsolate(); | 2362 Isolate* isolate = compiled_module->GetIsolate(); |
| 2362 MaybeHandle<String> string = ExtractStringFromModuleBytes( | 2363 MaybeHandle<String> string = ExtractStringFromModuleBytes( |
| 2363 isolate, compiled_module, function.name_offset, function.name_length); | 2364 isolate, compiled_module, function.name_offset, function.name_length); |
| 2364 if (!string.is_null()) return string.ToHandleChecked(); | 2365 if (!string.is_null()) return string.ToHandleChecked(); |
| 2365 return {}; | 2366 return {}; |
| 2366 } | 2367 } |
| OLD | NEW |