| 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 737 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 748 Vector<const uint8_t>(reinterpret_cast<uint8_t*>(buffer), name_chars), | 748 Vector<const uint8_t>(reinterpret_cast<uint8_t*>(buffer), name_chars), |
| 749 TENURED); | 749 TENURED); |
| 750 script->set_name(*name_str.ToHandleChecked()); | 750 script->set_name(*name_str.ToHandleChecked()); |
| 751 | 751 |
| 752 return script; | 752 return script; |
| 753 } | 753 } |
| 754 } // namespace | 754 } // namespace |
| 755 | 755 |
| 756 Handle<JSArrayBuffer> wasm::NewArrayBuffer(Isolate* isolate, size_t size, | 756 Handle<JSArrayBuffer> wasm::NewArrayBuffer(Isolate* isolate, size_t size, |
| 757 bool enable_guard_regions) { | 757 bool enable_guard_regions) { |
| 758 if (size > (kV8MaxWasmMemoryPages * WasmModule::kPageSize)) { | 758 if (size > (FLAG_wasm_max_mem_pages * WasmModule::kPageSize)) { |
| 759 // TODO(titzer): lift restriction on maximum memory allocated here. | 759 // TODO(titzer): lift restriction on maximum memory allocated here. |
| 760 return Handle<JSArrayBuffer>::null(); | 760 return Handle<JSArrayBuffer>::null(); |
| 761 } | 761 } |
| 762 | 762 |
| 763 enable_guard_regions = enable_guard_regions && kGuardRegionsSupported; | 763 enable_guard_regions = enable_guard_regions && kGuardRegionsSupported; |
| 764 | 764 |
| 765 bool is_external; // Set by TryAllocateBackingStore | 765 bool is_external; // Set by TryAllocateBackingStore |
| 766 void* memory = | 766 void* memory = |
| 767 TryAllocateBackingStore(isolate, size, enable_guard_regions, is_external); | 767 TryAllocateBackingStore(isolate, size, enable_guard_regions, is_external); |
| 768 | 768 |
| (...skipping 1056 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1825 break; | 1825 break; |
| 1826 default: | 1826 default: |
| 1827 UNREACHABLE(); | 1827 UNREACHABLE(); |
| 1828 break; | 1828 break; |
| 1829 } | 1829 } |
| 1830 } | 1830 } |
| 1831 } | 1831 } |
| 1832 | 1832 |
| 1833 // Allocate memory for a module instance as a new JSArrayBuffer. | 1833 // Allocate memory for a module instance as a new JSArrayBuffer. |
| 1834 Handle<JSArrayBuffer> AllocateMemory(uint32_t min_mem_pages) { | 1834 Handle<JSArrayBuffer> AllocateMemory(uint32_t min_mem_pages) { |
| 1835 if (min_mem_pages > kV8MaxWasmMemoryPages) { | 1835 if (min_mem_pages > FLAG_wasm_max_mem_pages) { |
| 1836 thrower_->RangeError("Out of memory: wasm memory too large"); | 1836 thrower_->RangeError("Out of memory: wasm memory too large"); |
| 1837 return Handle<JSArrayBuffer>::null(); | 1837 return Handle<JSArrayBuffer>::null(); |
| 1838 } | 1838 } |
| 1839 const bool enable_guard_regions = EnableGuardRegions(); | 1839 const bool enable_guard_regions = EnableGuardRegions(); |
| 1840 Handle<JSArrayBuffer> mem_buffer = NewArrayBuffer( | 1840 Handle<JSArrayBuffer> mem_buffer = NewArrayBuffer( |
| 1841 isolate_, min_mem_pages * WasmModule::kPageSize, enable_guard_regions); | 1841 isolate_, min_mem_pages * WasmModule::kPageSize, enable_guard_regions); |
| 1842 | 1842 |
| 1843 if (mem_buffer.is_null()) { | 1843 if (mem_buffer.is_null()) { |
| 1844 thrower_->RangeError("Out of memory: wasm memory"); | 1844 thrower_->RangeError("Out of memory: wasm memory"); |
| 1845 } | 1845 } |
| (...skipping 420 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2266 return buffer->byte_length()->Number() / WasmModule::kPageSize; | 2266 return buffer->byte_length()->Number() / WasmModule::kPageSize; |
| 2267 } | 2267 } |
| 2268 } | 2268 } |
| 2269 | 2269 |
| 2270 uint32_t GetMaxInstanceMemoryPages(Isolate* isolate, | 2270 uint32_t GetMaxInstanceMemoryPages(Isolate* isolate, |
| 2271 Handle<WasmInstanceObject> instance) { | 2271 Handle<WasmInstanceObject> instance) { |
| 2272 if (instance->has_memory_object()) { | 2272 if (instance->has_memory_object()) { |
| 2273 Handle<WasmMemoryObject> memory_object(instance->memory_object(), isolate); | 2273 Handle<WasmMemoryObject> memory_object(instance->memory_object(), isolate); |
| 2274 if (memory_object->has_maximum_pages()) { | 2274 if (memory_object->has_maximum_pages()) { |
| 2275 uint32_t maximum = static_cast<uint32_t>(memory_object->maximum_pages()); | 2275 uint32_t maximum = static_cast<uint32_t>(memory_object->maximum_pages()); |
| 2276 if (maximum < kV8MaxWasmMemoryPages) return maximum; | 2276 if (maximum < FLAG_wasm_max_mem_pages) return maximum; |
| 2277 } | 2277 } |
| 2278 } | 2278 } |
| 2279 uint32_t compiled_max_pages = instance->compiled_module()->max_mem_pages(); | 2279 uint32_t compiled_max_pages = instance->compiled_module()->max_mem_pages(); |
| 2280 isolate->counters()->wasm_max_mem_pages_count()->AddSample( | 2280 isolate->counters()->wasm_max_mem_pages_count()->AddSample( |
| 2281 compiled_max_pages); | 2281 compiled_max_pages); |
| 2282 if (compiled_max_pages != 0) return compiled_max_pages; | 2282 if (compiled_max_pages != 0) return compiled_max_pages; |
| 2283 return kV8MaxWasmMemoryPages; | 2283 return FLAG_wasm_max_mem_pages; |
| 2284 } | 2284 } |
| 2285 | 2285 |
| 2286 Handle<JSArrayBuffer> GrowMemoryBuffer(Isolate* isolate, | 2286 Handle<JSArrayBuffer> GrowMemoryBuffer(Isolate* isolate, |
| 2287 MaybeHandle<JSArrayBuffer> buffer, | 2287 MaybeHandle<JSArrayBuffer> buffer, |
| 2288 uint32_t pages, uint32_t max_pages) { | 2288 uint32_t pages, uint32_t max_pages) { |
| 2289 Handle<JSArrayBuffer> old_buffer; | 2289 Handle<JSArrayBuffer> old_buffer; |
| 2290 Address old_mem_start = nullptr; | 2290 Address old_mem_start = nullptr; |
| 2291 uint32_t old_size = 0; | 2291 uint32_t old_size = 0; |
| 2292 if (buffer.ToHandle(&old_buffer) && old_buffer->backing_store() != nullptr) { | 2292 if (buffer.ToHandle(&old_buffer) && old_buffer->backing_store() != nullptr) { |
| 2293 old_mem_start = static_cast<Address>(old_buffer->backing_store()); | 2293 old_mem_start = static_cast<Address>(old_buffer->backing_store()); |
| 2294 DCHECK_NOT_NULL(old_mem_start); | 2294 DCHECK_NOT_NULL(old_mem_start); |
| 2295 old_size = old_buffer->byte_length()->Number(); | 2295 old_size = old_buffer->byte_length()->Number(); |
| 2296 } | 2296 } |
| 2297 DCHECK(old_size + pages * WasmModule::kPageSize <= | 2297 DCHECK(old_size + pages * WasmModule::kPageSize <= |
| 2298 std::numeric_limits<uint32_t>::max()); | 2298 std::numeric_limits<uint32_t>::max()); |
| 2299 uint32_t new_size = old_size + pages * WasmModule::kPageSize; | 2299 uint32_t new_size = old_size + pages * WasmModule::kPageSize; |
| 2300 if (new_size <= old_size || max_pages * WasmModule::kPageSize < new_size || | 2300 if (new_size <= old_size || max_pages * WasmModule::kPageSize < new_size || |
| 2301 kV8MaxWasmMemoryPages * WasmModule::kPageSize < new_size) { | 2301 FLAG_wasm_max_mem_pages * WasmModule::kPageSize < new_size) { |
| 2302 return Handle<JSArrayBuffer>::null(); | 2302 return Handle<JSArrayBuffer>::null(); |
| 2303 } | 2303 } |
| 2304 | 2304 |
| 2305 Handle<JSArrayBuffer> new_buffer; | 2305 Handle<JSArrayBuffer> new_buffer; |
| 2306 if (!old_buffer.is_null() && old_buffer->has_guard_region()) { | 2306 if (!old_buffer.is_null() && old_buffer->has_guard_region()) { |
| 2307 // We don't move the backing store, we simply change the protection to make | 2307 // We don't move the backing store, we simply change the protection to make |
| 2308 // more of it accessible. | 2308 // more of it accessible. |
| 2309 base::OS::Unprotect(old_buffer->backing_store(), new_size); | 2309 base::OS::Unprotect(old_buffer->backing_store(), new_size); |
| 2310 reinterpret_cast<v8::Isolate*>(isolate) | 2310 reinterpret_cast<v8::Isolate*>(isolate) |
| 2311 ->AdjustAmountOfExternalAllocatedMemory(pages * WasmModule::kPageSize); | 2311 ->AdjustAmountOfExternalAllocatedMemory(pages * WasmModule::kPageSize); |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2358 if (pages == 0) { | 2358 if (pages == 0) { |
| 2359 DCHECK(old_size % WasmModule::kPageSize == 0); | 2359 DCHECK(old_size % WasmModule::kPageSize == 0); |
| 2360 return (old_size / WasmModule::kPageSize); | 2360 return (old_size / WasmModule::kPageSize); |
| 2361 } | 2361 } |
| 2362 Handle<JSArrayBuffer> new_buffer; | 2362 Handle<JSArrayBuffer> new_buffer; |
| 2363 if (!memory_object->has_instances_link()) { | 2363 if (!memory_object->has_instances_link()) { |
| 2364 // Memory object does not have an instance associated with it, just grow | 2364 // Memory object does not have an instance associated with it, just grow |
| 2365 uint32_t max_pages; | 2365 uint32_t max_pages; |
| 2366 if (memory_object->has_maximum_pages()) { | 2366 if (memory_object->has_maximum_pages()) { |
| 2367 max_pages = static_cast<uint32_t>(memory_object->maximum_pages()); | 2367 max_pages = static_cast<uint32_t>(memory_object->maximum_pages()); |
| 2368 if (kV8MaxWasmMemoryPages < max_pages) return -1; | 2368 if (FLAG_wasm_max_mem_pages < max_pages) return -1; |
| 2369 } else { | 2369 } else { |
| 2370 max_pages = kV8MaxWasmMemoryPages; | 2370 max_pages = FLAG_wasm_max_mem_pages; |
| 2371 } | 2371 } |
| 2372 new_buffer = GrowMemoryBuffer(isolate, memory_buffer, pages, max_pages); | 2372 new_buffer = GrowMemoryBuffer(isolate, memory_buffer, pages, max_pages); |
| 2373 if (new_buffer.is_null()) return -1; | 2373 if (new_buffer.is_null()) return -1; |
| 2374 } else { | 2374 } else { |
| 2375 Handle<WasmInstanceWrapper> instance_wrapper( | 2375 Handle<WasmInstanceWrapper> instance_wrapper( |
| 2376 memory_object->instances_link()); | 2376 memory_object->instances_link()); |
| 2377 DCHECK(WasmInstanceWrapper::IsWasmInstanceWrapper(*instance_wrapper)); | 2377 DCHECK(WasmInstanceWrapper::IsWasmInstanceWrapper(*instance_wrapper)); |
| 2378 DCHECK(instance_wrapper->has_instance()); | 2378 DCHECK(instance_wrapper->has_instance()); |
| 2379 Handle<WasmInstanceObject> instance = instance_wrapper->instance_object(); | 2379 Handle<WasmInstanceObject> instance = instance_wrapper->instance_object(); |
| 2380 DCHECK(IsWasmInstance(*instance)); | 2380 DCHECK(IsWasmInstance(*instance)); |
| (...skipping 258 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2639 | 2639 |
| 2640 JSObject::AddProperty(entry, name_string, export_name.ToHandleChecked(), | 2640 JSObject::AddProperty(entry, name_string, export_name.ToHandleChecked(), |
| 2641 NONE); | 2641 NONE); |
| 2642 JSObject::AddProperty(entry, kind_string, export_kind, NONE); | 2642 JSObject::AddProperty(entry, kind_string, export_kind, NONE); |
| 2643 | 2643 |
| 2644 storage->set(index, *entry); | 2644 storage->set(index, *entry); |
| 2645 } | 2645 } |
| 2646 | 2646 |
| 2647 return array_object; | 2647 return array_object; |
| 2648 } | 2648 } |
| OLD | NEW |