| 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/assembler-inl.h" | 7 #include "src/assembler-inl.h" |
| 8 #include "src/base/adapters.h" | 8 #include "src/base/adapters.h" |
| 9 #include "src/base/atomic-utils.h" | 9 #include "src/base/atomic-utils.h" |
| 10 #include "src/code-stubs.h" | 10 #include "src/code-stubs.h" |
| (...skipping 727 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 738 Vector<const uint8_t>(reinterpret_cast<uint8_t*>(buffer), name_chars), | 738 Vector<const uint8_t>(reinterpret_cast<uint8_t*>(buffer), name_chars), |
| 739 TENURED); | 739 TENURED); |
| 740 script->set_name(*name_str.ToHandleChecked()); | 740 script->set_name(*name_str.ToHandleChecked()); |
| 741 | 741 |
| 742 return script; | 742 return script; |
| 743 } | 743 } |
| 744 } // namespace | 744 } // namespace |
| 745 | 745 |
| 746 Handle<JSArrayBuffer> wasm::NewArrayBuffer(Isolate* isolate, size_t size, | 746 Handle<JSArrayBuffer> wasm::NewArrayBuffer(Isolate* isolate, size_t size, |
| 747 bool enable_guard_regions) { | 747 bool enable_guard_regions) { |
| 748 if (size > (kV8MaxWasmMemoryPages * WasmModule::kPageSize)) { | 748 if (size > (static_cast<uint32_t>(FLAG_wasm_max_mem_pages) * |
| 749 WasmModule::kPageSize)) { |
| 749 // TODO(titzer): lift restriction on maximum memory allocated here. | 750 // TODO(titzer): lift restriction on maximum memory allocated here. |
| 750 return Handle<JSArrayBuffer>::null(); | 751 return Handle<JSArrayBuffer>::null(); |
| 751 } | 752 } |
| 752 | 753 |
| 753 enable_guard_regions = enable_guard_regions && kGuardRegionsSupported; | 754 enable_guard_regions = enable_guard_regions && kGuardRegionsSupported; |
| 754 | 755 |
| 755 bool is_external; // Set by TryAllocateBackingStore | 756 bool is_external; // Set by TryAllocateBackingStore |
| 756 void* memory = | 757 void* memory = |
| 757 TryAllocateBackingStore(isolate, size, enable_guard_regions, is_external); | 758 TryAllocateBackingStore(isolate, size, enable_guard_regions, is_external); |
| 758 | 759 |
| (...skipping 1001 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1760 break; | 1761 break; |
| 1761 default: | 1762 default: |
| 1762 UNREACHABLE(); | 1763 UNREACHABLE(); |
| 1763 break; | 1764 break; |
| 1764 } | 1765 } |
| 1765 } | 1766 } |
| 1766 } | 1767 } |
| 1767 | 1768 |
| 1768 // Allocate memory for a module instance as a new JSArrayBuffer. | 1769 // Allocate memory for a module instance as a new JSArrayBuffer. |
| 1769 Handle<JSArrayBuffer> AllocateMemory(uint32_t min_mem_pages) { | 1770 Handle<JSArrayBuffer> AllocateMemory(uint32_t min_mem_pages) { |
| 1770 if (min_mem_pages > kV8MaxWasmMemoryPages) { | 1771 if (min_mem_pages > static_cast<uint32_t>(FLAG_wasm_max_mem_pages)) { |
| 1771 thrower_->RangeError("Out of memory: wasm memory too large"); | 1772 thrower_->RangeError("Out of memory: wasm memory too large"); |
| 1772 return Handle<JSArrayBuffer>::null(); | 1773 return Handle<JSArrayBuffer>::null(); |
| 1773 } | 1774 } |
| 1774 const bool enable_guard_regions = EnableGuardRegions(); | 1775 const bool enable_guard_regions = EnableGuardRegions(); |
| 1775 Handle<JSArrayBuffer> mem_buffer = NewArrayBuffer( | 1776 Handle<JSArrayBuffer> mem_buffer = NewArrayBuffer( |
| 1776 isolate_, min_mem_pages * WasmModule::kPageSize, enable_guard_regions); | 1777 isolate_, min_mem_pages * WasmModule::kPageSize, enable_guard_regions); |
| 1777 | 1778 |
| 1778 if (mem_buffer.is_null()) { | 1779 if (mem_buffer.is_null()) { |
| 1779 thrower_->RangeError("Out of memory: wasm memory"); | 1780 thrower_->RangeError("Out of memory: wasm memory"); |
| 1780 } | 1781 } |
| (...skipping 410 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2191 if (instance->has_memory_object()) { | 2192 if (instance->has_memory_object()) { |
| 2192 Handle<WasmMemoryObject> memory_object(instance->memory_object(), isolate); | 2193 Handle<WasmMemoryObject> memory_object(instance->memory_object(), isolate); |
| 2193 | 2194 |
| 2194 int maximum = memory_object->maximum_pages(); | 2195 int maximum = memory_object->maximum_pages(); |
| 2195 if (maximum > 0) return static_cast<uint32_t>(maximum); | 2196 if (maximum > 0) return static_cast<uint32_t>(maximum); |
| 2196 } | 2197 } |
| 2197 uint32_t compiled_max_pages = instance->compiled_module()->max_mem_pages(); | 2198 uint32_t compiled_max_pages = instance->compiled_module()->max_mem_pages(); |
| 2198 isolate->counters()->wasm_max_mem_pages_count()->AddSample( | 2199 isolate->counters()->wasm_max_mem_pages_count()->AddSample( |
| 2199 compiled_max_pages); | 2200 compiled_max_pages); |
| 2200 if (compiled_max_pages != 0) return compiled_max_pages; | 2201 if (compiled_max_pages != 0) return compiled_max_pages; |
| 2201 return kV8MaxWasmMemoryPages; | 2202 return static_cast<uint32_t>(FLAG_wasm_max_mem_pages); |
| 2202 } | 2203 } |
| 2203 | 2204 |
| 2204 Handle<JSArrayBuffer> GrowMemoryBuffer(Isolate* isolate, | 2205 Handle<JSArrayBuffer> GrowMemoryBuffer(Isolate* isolate, |
| 2205 MaybeHandle<JSArrayBuffer> buffer, | 2206 MaybeHandle<JSArrayBuffer> buffer, |
| 2206 uint32_t pages, uint32_t max_pages) { | 2207 uint32_t pages, uint32_t max_pages) { |
| 2207 Handle<JSArrayBuffer> old_buffer; | 2208 Handle<JSArrayBuffer> old_buffer; |
| 2208 Address old_mem_start = nullptr; | 2209 Address old_mem_start = nullptr; |
| 2209 uint32_t old_size = 0; | 2210 uint32_t old_size = 0; |
| 2210 if (buffer.ToHandle(&old_buffer) && old_buffer->backing_store() != nullptr) { | 2211 if (buffer.ToHandle(&old_buffer) && old_buffer->backing_store() != nullptr) { |
| 2211 old_mem_start = static_cast<Address>(old_buffer->backing_store()); | 2212 old_mem_start = static_cast<Address>(old_buffer->backing_store()); |
| 2212 DCHECK_NOT_NULL(old_mem_start); | 2213 DCHECK_NOT_NULL(old_mem_start); |
| 2213 old_size = old_buffer->byte_length()->Number(); | 2214 old_size = old_buffer->byte_length()->Number(); |
| 2214 } | 2215 } |
| 2215 DCHECK(old_size + pages * WasmModule::kPageSize <= | 2216 DCHECK(old_size + pages * WasmModule::kPageSize <= |
| 2216 std::numeric_limits<uint32_t>::max()); | 2217 std::numeric_limits<uint32_t>::max()); |
| 2217 uint32_t new_size = old_size + pages * WasmModule::kPageSize; | 2218 uint32_t new_size = old_size + pages * WasmModule::kPageSize; |
| 2218 if (new_size <= old_size || max_pages * WasmModule::kPageSize < new_size || | 2219 if (new_size <= old_size || max_pages * WasmModule::kPageSize < new_size || |
| 2219 kV8MaxWasmMemoryPages * WasmModule::kPageSize < new_size) { | 2220 static_cast<uint32_t>(FLAG_wasm_max_mem_pages) * WasmModule::kPageSize < |
| 2221 new_size) { |
| 2220 return Handle<JSArrayBuffer>::null(); | 2222 return Handle<JSArrayBuffer>::null(); |
| 2221 } | 2223 } |
| 2222 | 2224 |
| 2223 Handle<JSArrayBuffer> new_buffer; | 2225 Handle<JSArrayBuffer> new_buffer; |
| 2224 if (!old_buffer.is_null() && old_buffer->has_guard_region()) { | 2226 if (!old_buffer.is_null() && old_buffer->has_guard_region()) { |
| 2225 // We don't move the backing store, we simply change the protection to make | 2227 // We don't move the backing store, we simply change the protection to make |
| 2226 // more of it accessible. | 2228 // more of it accessible. |
| 2227 base::OS::Unprotect(old_buffer->backing_store(), new_size); | 2229 base::OS::Unprotect(old_buffer->backing_store(), new_size); |
| 2228 reinterpret_cast<v8::Isolate*>(isolate) | 2230 reinterpret_cast<v8::Isolate*>(isolate) |
| 2229 ->AdjustAmountOfExternalAllocatedMemory(pages * WasmModule::kPageSize); | 2231 ->AdjustAmountOfExternalAllocatedMemory(pages * WasmModule::kPageSize); |
| (...skipping 272 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2502 | 2504 |
| 2503 JSObject::AddProperty(entry, name_string, export_name.ToHandleChecked(), | 2505 JSObject::AddProperty(entry, name_string, export_name.ToHandleChecked(), |
| 2504 NONE); | 2506 NONE); |
| 2505 JSObject::AddProperty(entry, kind_string, export_kind, NONE); | 2507 JSObject::AddProperty(entry, kind_string, export_kind, NONE); |
| 2506 | 2508 |
| 2507 storage->set(index, *entry); | 2509 storage->set(index, *entry); |
| 2508 } | 2510 } |
| 2509 | 2511 |
| 2510 return array_object; | 2512 return array_object; |
| 2511 } | 2513 } |
| OLD | NEW |