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 |