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 |