| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
1 parent 28ca44c commit ebef1b2
7 files changed
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -39,7 +39,7 @@ | |||
| 39 | 39 | ||
| 40 | 40 | # Reset this number to 0 on major V8 upgrades. | |
| 41 | 41 | # Increment by one for each non-official patch applied to deps/v8. | |
| 42 | - 'v8_embedder_string': '-node.11', | ||
| 42 | + 'v8_embedder_string': '-node.12', | ||
| 43 | 43 | ||
| 44 | 44 | ##### V8 defaults for Node.js ##### | |
| 45 | 45 | ||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -4849,6 +4849,14 @@ class V8_EXPORT BackingStore : public v8::internal::BackingStoreBase { | |||
| 4849 | 4849 | BackingStore(); | |
| 4850 | 4850 | }; | |
| 4851 | 4851 | ||
| 4852 | + /** | ||
| 4853 | + * This callback is used only if the memory block for this backing store cannot | ||
| 4854 | + * be allocated with an ArrayBuffer::Allocator. In such cases the destructor | ||
| 4855 | + * of this backing store object invokes the callback to free the memory block. | ||
| 4856 | + */ | ||
| 4857 | + using BackingStoreDeleterCallback = void (*)(void* data, size_t length, | ||
| 4858 | + void* deleter_data); | ||
| 4859 | + | ||
| 4852 | 4860 | /** | |
| 4853 | 4861 | * An instance of the built-in ArrayBuffer constructor (ES6 draft 15.13.5). | |
| 4854 | 4862 | */ | |
@@ -4999,6 +5007,29 @@ class V8_EXPORT ArrayBuffer : public Object { | |||
| 4999 | 5007 | static Local<ArrayBuffer> New(Isolate* isolate, | |
| 5000 | 5008 | std::shared_ptr<BackingStore> backing_store); | |
| 5001 | 5009 | ||
| 5010 | + /** | ||
| 5011 | + * Returns a new standalone BackingStore that is allocated using the array | ||
| 5012 | + * buffer allocator of the isolate. The result can be later passed to | ||
| 5013 | + * ArrayBuffer::New. | ||
| 5014 | + * | ||
| 5015 | + * If the allocator returns nullptr, then the function may cause GCs in the | ||
| 5016 | + * given isolate and re-try the allocation. If GCs do not help, then the | ||
| 5017 | + * function will crash with an out-of-memory error. | ||
| 5018 | + */ | ||
| 5019 | + static std::unique_ptr<BackingStore> NewBackingStore(Isolate* isolate, | ||
| 5020 | + size_t byte_length); | ||
| 5021 | + /** | ||
| 5022 | + * Returns a new standalone BackingStore that takes over the ownership of | ||
| 5023 | + * the given buffer. The destructor of the BackingStore invokes the given | ||
| 5024 | + * deleter callback. | ||
| 5025 | + * | ||
| 5026 | + * The result can be later passed to ArrayBuffer::New. The raw pointer | ||
| 5027 | + * to the buffer must not be passed again to any V8 API function. | ||
| 5028 | + */ | ||
| 5029 | + static std::unique_ptr<BackingStore> NewBackingStore( | ||
| 5030 | + void* data, size_t byte_length, BackingStoreDeleterCallback deleter, | ||
| 5031 | + void* deleter_data); | ||
| 5032 | + | ||
| 5002 | 5033 | /** | |
| 5003 | 5034 | * Returns true if ArrayBuffer is externalized, that is, does not | |
| 5004 | 5035 | * own its memory block. | |
@@ -5449,6 +5480,29 @@ class V8_EXPORT SharedArrayBuffer : public Object { | |||
| 5449 | 5480 | static Local<SharedArrayBuffer> New( | |
| 5450 | 5481 | Isolate* isolate, std::shared_ptr<BackingStore> backing_store); | |
| 5451 | 5482 | ||
| 5483 | + /** | ||
| 5484 | + * Returns a new standalone BackingStore that is allocated using the array | ||
| 5485 | + * buffer allocator of the isolate. The result can be later passed to | ||
| 5486 | + * SharedArrayBuffer::New. | ||
| 5487 | + * | ||
| 5488 | + * If the allocator returns nullptr, then the function may cause GCs in the | ||
| 5489 | + * given isolate and re-try the allocation. If GCs do not help, then the | ||
| 5490 | + * function will crash with an out-of-memory error. | ||
| 5491 | + */ | ||
| 5492 | + static std::unique_ptr<BackingStore> NewBackingStore(Isolate* isolate, | ||
| 5493 | + size_t byte_length); | ||
| 5494 | + /** | ||
| 5495 | + * Returns a new standalone BackingStore that takes over the ownership of | ||
| 5496 | + * the given buffer. The destructor of the BackingStore invokes the given | ||
| 5497 | + * deleter callback. | ||
| 5498 | + * | ||
| 5499 | + * The result can be later passed to SharedArrayBuffer::New. The raw pointer | ||
| 5500 | + * to the buffer must not be passed again to any V8 functions. | ||
| 5501 | + */ | ||
| 5502 | + static std::unique_ptr<BackingStore> NewBackingStore( | ||
| 5503 | + void* data, size_t byte_length, BackingStoreDeleterCallback deleter, | ||
| 5504 | + void* deleter_data); | ||
| 5505 | + | ||
| 5452 | 5506 | /** | |
| 5453 | 5507 | * Create a new SharedArrayBuffer over an existing memory block. Propagate | |
| 5454 | 5508 | * flags to indicate whether the underlying buffer can be grown. | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -7452,6 +7452,32 @@ Local<ArrayBuffer> v8::ArrayBuffer::New( | |||
| 7452 | 7452 | return Utils::ToLocal(obj); | |
| 7453 | 7453 | } | |
| 7454 | 7454 | ||
| 7455 | + std::unique_ptr<v8::BackingStore> v8::ArrayBuffer::NewBackingStore( | ||
| 7456 | + Isolate* isolate, size_t byte_length) { | ||
| 7457 | + i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); | ||
| 7458 | + LOG_API(i_isolate, ArrayBuffer, NewBackingStore); | ||
| 7459 | + ENTER_V8_NO_SCRIPT_NO_EXCEPTION(i_isolate); | ||
| 7460 | + std::unique_ptr<i::BackingStoreBase> backing_store = | ||
| 7461 | + i::BackingStore::Allocate(i_isolate, byte_length, | ||
| 7462 | + i::SharedFlag::kNotShared, | ||
| 7463 | + i::InitializedFlag::kZeroInitialized); | ||
| 7464 | + if (!backing_store) { | ||
| 7465 | + i::FatalProcessOutOfMemory(i_isolate, "v8::ArrayBuffer::NewBackingStore"); | ||
| 7466 | + } | ||
| 7467 | + return std::unique_ptr<v8::BackingStore>( | ||
| 7468 | + static_cast<v8::BackingStore*>(backing_store.release())); | ||
| 7469 | + } | ||
| 7470 | + | ||
| 7471 | + std::unique_ptr<v8::BackingStore> v8::ArrayBuffer::NewBackingStore( | ||
| 7472 | + void* data, size_t byte_length, BackingStoreDeleterCallback deleter, | ||
| 7473 | + void* deleter_data) { | ||
| 7474 | + std::unique_ptr<i::BackingStoreBase> backing_store = | ||
| 7475 | + i::BackingStore::WrapAllocation(data, byte_length, deleter, deleter_data, | ||
| 7476 | + i::SharedFlag::kNotShared); | ||
| 7477 | + return std::unique_ptr<v8::BackingStore>( | ||
| 7478 | + static_cast<v8::BackingStore*>(backing_store.release())); | ||
| 7479 | + } | ||
| 7480 | + | ||
| 7455 | 7481 | Local<ArrayBuffer> v8::ArrayBufferView::Buffer() { | |
| 7456 | 7482 | i::Handle<i::JSArrayBufferView> obj = Utils::OpenHandle(this); | |
| 7457 | 7483 | i::Handle<i::JSArrayBuffer> buffer; | |
@@ -7753,6 +7779,32 @@ Local<SharedArrayBuffer> v8::SharedArrayBuffer::New( | |||
| 7753 | 7779 | return Utils::ToLocalShared(buffer); | |
| 7754 | 7780 | } | |
| 7755 | 7781 | ||
| 7782 | + std::unique_ptr<v8::BackingStore> v8::SharedArrayBuffer::NewBackingStore( | ||
| 7783 | + Isolate* isolate, size_t byte_length) { | ||
| 7784 | + i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); | ||
| 7785 | + LOG_API(i_isolate, SharedArrayBuffer, NewBackingStore); | ||
| 7786 | + ENTER_V8_NO_SCRIPT_NO_EXCEPTION(i_isolate); | ||
| 7787 | + std::unique_ptr<i::BackingStoreBase> backing_store = | ||
| 7788 | + i::BackingStore::Allocate(i_isolate, byte_length, i::SharedFlag::kShared, | ||
| 7789 | + i::InitializedFlag::kZeroInitialized); | ||
| 7790 | + if (!backing_store) { | ||
| 7791 | + i::FatalProcessOutOfMemory(i_isolate, | ||
| 7792 | + "v8::SharedArrayBuffer::NewBackingStore"); | ||
| 7793 | + } | ||
| 7794 | + return std::unique_ptr<v8::BackingStore>( | ||
| 7795 | + static_cast<v8::BackingStore*>(backing_store.release())); | ||
| 7796 | + } | ||
| 7797 | + | ||
| 7798 | + std::unique_ptr<v8::BackingStore> v8::SharedArrayBuffer::NewBackingStore( | ||
| 7799 | + void* data, size_t byte_length, BackingStoreDeleterCallback deleter, | ||
| 7800 | + void* deleter_data) { | ||
| 7801 | + std::unique_ptr<i::BackingStoreBase> backing_store = | ||
| 7802 | + i::BackingStore::WrapAllocation(data, byte_length, deleter, deleter_data, | ||
| 7803 | + i::SharedFlag::kShared); | ||
| 7804 | + return std::unique_ptr<v8::BackingStore>( | ||
| 7805 | + static_cast<v8::BackingStore*>(backing_store.release())); | ||
| 7806 | + } | ||
| 7807 | + | ||
| 7756 | 7808 | Local<Symbol> v8::Symbol::New(Isolate* isolate, Local<String> name) { | |
| 7757 | 7809 | i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); | |
| 7758 | 7810 | LOG_API(i_isolate, Symbol, New); | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -733,6 +733,7 @@ class RuntimeCallTimer final { | |||
| 733 | 733 | V(ArrayBuffer_Cast) \ | |
| 734 | 734 | V(ArrayBuffer_Detach) \ | |
| 735 | 735 | V(ArrayBuffer_New) \ | |
| 736 | + V(ArrayBuffer_NewBackingStore) \ | ||
| 736 | 737 | V(Array_CloneElementAt) \ | |
| 737 | 738 | V(Array_New) \ | |
| 738 | 739 | V(BigInt64Array_New) \ | |
@@ -850,6 +851,7 @@ class RuntimeCallTimer final { | |||
| 850 | 851 | V(Set_Has) \ | |
| 851 | 852 | V(Set_New) \ | |
| 852 | 853 | V(SharedArrayBuffer_New) \ | |
| 854 | + V(SharedArrayBuffer_NewBackingStore) \ | ||
| 853 | 855 | V(String_Concat) \ | |
| 854 | 856 | V(String_NewExternalOneByte) \ | |
| 855 | 857 | V(String_NewExternalTwoByte) \ | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -124,6 +124,7 @@ BackingStore::~BackingStore() { | |||
| 124 | 124 | ||
| 125 | 125 | if (is_wasm_memory_) { | |
| 126 | 126 | DCHECK(free_on_destruct_); | |
| 127 | + DCHECK(!custom_deleter_); | ||
| 127 | 128 | TRACE_BS("BSw:free bs=%p mem=%p (length=%zu, capacity=%zu)\n", this, | |
| 128 | 129 | buffer_start_, byte_length(), byte_capacity_); | |
| 129 | 130 | if (is_shared_) { | |
@@ -149,6 +150,14 @@ BackingStore::~BackingStore() { | |||
| 149 | 150 | Clear(); | |
| 150 | 151 | return; | |
| 151 | 152 | } | |
| 153 | + if (custom_deleter_) { | ||
| 154 | + DCHECK(free_on_destruct_); | ||
| 155 | + TRACE_BS("BS:custome deleter bs=%p mem=%p (length=%zu, capacity=%zu)\n", | ||
| 156 | + this, buffer_start_, byte_length(), byte_capacity_); | ||
| 157 | + type_specific_data_.deleter(buffer_start_, byte_length_, deleter_data_); | ||
| 158 | + Clear(); | ||
| 159 | + return; | ||
| 160 | + } | ||
| 152 | 161 | if (free_on_destruct_) { | |
| 153 | 162 | // JSArrayBuffer backing store. Deallocate through the embedder's allocator. | |
| 154 | 163 | auto allocator = reinterpret_cast<v8::ArrayBuffer::Allocator*>( | |
@@ -210,7 +219,8 @@ std::unique_ptr<BackingStore> BackingStore::Allocate( | |||
| 210 | 219 | shared, // shared | |
| 211 | 220 | false, // is_wasm_memory | |
| 212 | 221 | true, // free_on_destruct | |
| 213 | - false); // has_guard_regions | ||
| 222 | + false, // has_guard_regions | ||
| 223 | + false); // custom_deleter | ||
| 214 | 224 | ||
| 215 | 225 | TRACE_BS("BS:alloc bs=%p mem=%p (length=%zu)\n", result, | |
| 216 | 226 | result->buffer_start(), byte_length); | |
@@ -321,7 +331,8 @@ std::unique_ptr<BackingStore> BackingStore::TryAllocateWasmMemory( | |||
| 321 | 331 | shared, // shared | |
| 322 | 332 | true, // is_wasm_memory | |
| 323 | 333 | true, // free_on_destruct | |
| 324 | - guards); // has_guard_regions | ||
| 334 | + guards, // has_guard_regions | ||
| 335 | + false); // custom_deleter | ||
| 325 | 336 | ||
| 326 | 337 | TRACE_BS("BSw:alloc bs=%p mem=%p (length=%zu, capacity=%zu)\n", result, | |
| 327 | 338 | result->buffer_start(), byte_length, byte_capacity); | |
@@ -451,16 +462,40 @@ void BackingStore::UpdateSharedWasmMemoryObjects(Isolate* isolate) { | |||
| 451 | 462 | std::unique_ptr<BackingStore> BackingStore::WrapAllocation( | |
| 452 | 463 | Isolate* isolate, void* allocation_base, size_t allocation_length, | |
| 453 | 464 | SharedFlag shared, bool free_on_destruct) { | |
| 454 | - auto result = | ||
| 455 | - new BackingStore(allocation_base, allocation_length, allocation_length, | ||
| 456 | - shared, false, free_on_destruct, false); | ||
| 465 | + auto result = new BackingStore(allocation_base, // start | ||
| 466 | + allocation_length, // length | ||
| 467 | + allocation_length, // capacity | ||
| 468 | + shared, // shared | ||
| 469 | + false, // is_wasm_memory | ||
| 470 | + free_on_destruct, // free_on_destruct | ||
| 471 | + false, // has_guard_regions | ||
| 472 | + false); // custom_deleter | ||
| 457 | 473 | result->type_specific_data_.v8_api_array_buffer_allocator = | |
| 458 | 474 | isolate->array_buffer_allocator(); | |
| 459 | 475 | TRACE_BS("BS:wrap bs=%p mem=%p (length=%zu)\n", result, | |
| 460 | 476 | result->buffer_start(), result->byte_length()); | |
| 461 | 477 | return std::unique_ptr<BackingStore>(result); | |
| 462 | 478 | } | |
| 463 | 479 | ||
| 480 | + std::unique_ptr<BackingStore> BackingStore::WrapAllocation( | ||
| 481 | + void* allocation_base, size_t allocation_length, | ||
| 482 | + v8::BackingStoreDeleterCallback deleter, void* deleter_data, | ||
| 483 | + SharedFlag shared) { | ||
| 484 | + auto result = new BackingStore(allocation_base, // start | ||
| 485 | + allocation_length, // length | ||
| 486 | + allocation_length, // capacity | ||
| 487 | + shared, // shared | ||
| 488 | + false, // is_wasm_memory | ||
| 489 | + true, // free_on_destruct | ||
| 490 | + false, // has_guard_regions | ||
| 491 | + true); // custom_deleter | ||
| 492 | + result->type_specific_data_.deleter = deleter; | ||
| 493 | + result->deleter_data_ = deleter_data; | ||
| 494 | + TRACE_BS("BS:wrap bs=%p mem=%p (length=%zu)\n", result, | ||
| 495 | + result->buffer_start(), result->byte_length()); | ||
| 496 | + return std::unique_ptr<BackingStore>(result); | ||
| 497 | + } | ||
| 498 | + | ||
| 464 | 499 | std::unique_ptr<BackingStore> BackingStore::EmptyBackingStore( | |
| 465 | 500 | SharedFlag shared) { | |
| 466 | 501 | auto result = new BackingStore(nullptr, // start | |
@@ -469,7 +504,8 @@ std::unique_ptr<BackingStore> BackingStore::EmptyBackingStore( | |||
| 469 | 504 | shared, // shared | |
| 470 | 505 | false, // is_wasm_memory | |
| 471 | 506 | false, // free_on_destruct | |
| 472 | - false); // has_guard_regions | ||
| 507 | + false, // has_guard_regions | ||
| 508 | + false); // custom_deleter | ||
| 473 | 509 | ||
| 474 | 510 | return std::unique_ptr<BackingStore>(result); | |
| 475 | 511 | } | |
@@ -512,6 +548,9 @@ void GlobalBackingStoreRegistry::Register( | |||
| 512 | 548 | // then we don't have to guarantee that there is single unique | |
| 513 | 549 | // BackingStore per buffer_start() because the destructor of | |
| 514 | 550 | // of the BackingStore will be a no-op in that case. | |
| 551 | + | ||
| 552 | + // All WASM memory has to be registered. | ||
| 553 | + CHECK(!backing_store->is_wasm_memory()); | ||
| 515 | 554 | return; | |
| 516 | 555 | } | |
| 517 | 556 | ||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -8,6 +8,7 @@ | |||
| 8 | 8 | #include <memory> | |
| 9 | 9 | ||
| 10 | 10 | #include "include/v8-internal.h" | |
| 11 | + #include "include/v8.h" | ||
| 11 | 12 | #include "src/handles/handles.h" | |
| 12 | 13 | ||
| 13 | 14 | namespace v8 { | |
@@ -63,6 +64,11 @@ class V8_EXPORT_PRIVATE BackingStore : public BackingStoreBase { | |||
| 63 | 64 | SharedFlag shared, | |
| 64 | 65 | bool free_on_destruct); | |
| 65 | 66 | ||
| 67 | + static std::unique_ptr<BackingStore> WrapAllocation( | ||
| 68 | + void* allocation_base, size_t allocation_length, | ||
| 69 | + v8::BackingStoreDeleterCallback deleter, void* deleter_data, | ||
| 70 | + SharedFlag shared); | ||
| 71 | + | ||
| 66 | 72 | // Create an empty backing store. | |
| 67 | 73 | static std::unique_ptr<BackingStore> EmptyBackingStore(SharedFlag shared); | |
| 68 | 74 | ||
@@ -116,27 +122,23 @@ class V8_EXPORT_PRIVATE BackingStore : public BackingStoreBase { | |||
| 116 | 122 | ||
| 117 | 123 | BackingStore(void* buffer_start, size_t byte_length, size_t byte_capacity, | |
| 118 | 124 | SharedFlag shared, bool is_wasm_memory, bool free_on_destruct, | |
| 119 | - bool has_guard_regions) | ||
| 125 | + bool has_guard_regions, bool custom_deleter) | ||
| 120 | 126 | : buffer_start_(buffer_start), | |
| 121 | 127 | byte_length_(byte_length), | |
| 122 | 128 | byte_capacity_(byte_capacity), | |
| 123 | 129 | is_shared_(shared == SharedFlag::kShared), | |
| 124 | 130 | is_wasm_memory_(is_wasm_memory), | |
| 125 | 131 | free_on_destruct_(free_on_destruct), | |
| 126 | 132 | has_guard_regions_(has_guard_regions), | |
| 127 | - globally_registered_(false) { | ||
| 133 | + globally_registered_(false), | ||
| 134 | + custom_deleter_(custom_deleter) { | ||
| 128 | 135 | type_specific_data_.v8_api_array_buffer_allocator = nullptr; | |
| 136 | + deleter_data_ = nullptr; | ||
| 129 | 137 | } | |
| 130 | 138 | ||
| 131 | 139 | void* buffer_start_ = nullptr; | |
| 132 | 140 | std::atomic<size_t> byte_length_{0}; | |
| 133 | 141 | size_t byte_capacity_ = 0; | |
| 134 | - bool is_shared_ : 1; | ||
| 135 | - bool is_wasm_memory_ : 1; | ||
| 136 | - bool free_on_destruct_ : 1; | ||
| 137 | - bool has_guard_regions_ : 1; | ||
| 138 | - bool globally_registered_ : 1; | ||
| 139 | - | ||
| 140 | 142 | union { | |
| 141 | 143 | // If this backing store was allocated through the ArrayBufferAllocator API, | |
| 142 | 144 | // this is a direct pointer to the API object for freeing the backing | |
@@ -148,8 +150,21 @@ class V8_EXPORT_PRIVATE BackingStore : public BackingStoreBase { | |||
| 148 | 150 | // For shared Wasm memories, this is a list of all the attached memory | |
| 149 | 151 | // objects, which is needed to grow shared backing stores. | |
| 150 | 152 | SharedWasmMemoryData* shared_wasm_memory_data; | |
| 153 | + | ||
| 154 | + // Custom deleter for the backing stores that wrap memory blocks that are | ||
| 155 | + // allocated with a custom allocator. | ||
| 156 | + v8::BackingStoreDeleterCallback deleter; | ||
| 151 | 157 | } type_specific_data_; | |
| 152 | 158 | ||
| 159 | + void* deleter_data_; | ||
| 160 | + | ||
| 161 | + bool is_shared_ : 1; | ||
| 162 | + bool is_wasm_memory_ : 1; | ||
| 163 | + bool free_on_destruct_ : 1; | ||
| 164 | + bool has_guard_regions_ : 1; | ||
| 165 | + bool globally_registered_ : 1; | ||
| 166 | + bool custom_deleter_ : 1; | ||
| 167 | + | ||
| 153 | 168 | // Accessors for type-specific data. | |
| 154 | 169 | void* get_v8_api_array_buffer_allocator(); | |
| 155 | 170 | SharedWasmMemoryData* get_shared_wasm_memory_data(); | |
| Back | FazBrowse Home | New Git URL |
0 commit comments