diff options
author | Keyhan Vakil <kvakil@sylph.kvakil.me> | 2022-07-27 01:38:16 +0300 |
---|---|---|
committer | Ruy Adorno <ruyadorno@google.com> | 2022-08-23 02:37:08 +0300 |
commit | a0c57837c4d79b9bf45a65ee547043d46794b017 (patch) | |
tree | 7aa187164852510fd14acc702311b0f7593cffc5 /deps | |
parent | d964b308ae25b292f155cb4b29aacf2abe094c3d (diff) |
deps: cherry-pick 00704f5a from V8 upstream
Original commit message:
Add more efficient API for accesssing ArrayBuffer raw data
Raw data access is already possible via GetBackingStore()->GetData().
This API exposes a more efficient way for accessing
JSArrayBuffer::backing_store (which, despite the confusing name, is no
the BackingStore but its raw data pointer).
Bug: v8:10343
Change-Id: I695cea91e2c3de75ce6c86bac6e413ce6617958b
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3764341
Reviewed-by: Camillo Bruni <cbruni@chromium.org>
Commit-Queue: Marja Hölttä <marja@chromium.org>
Cr-Commit-Position: refs/heads/main@{#81745}
Refs: https://github.com/v8/v8/commit/00704f5a03d9db02c14c4f4c35188effc46e82ab
Refs: https://github.com/nodejs/node/issues/32226
PR-URL: https://github.com/nodejs/node/pull/43921
Reviewed-By: Jiawen Geng <technicalcute@gmail.com>
Reviewed-By: Michaël Zasso <targos@protonmail.com>
Reviewed-By: Feng Yu <F3n67u@outlook.com>
Diffstat (limited to 'deps')
-rw-r--r-- | deps/v8/include/v8-array-buffer.h | 12 | ||||
-rw-r--r-- | deps/v8/src/api/api.cc | 10 | ||||
-rw-r--r-- | deps/v8/test/cctest/test-api-array-buffer.cc | 5 |
3 files changed, 26 insertions, 1 deletions
diff --git a/deps/v8/include/v8-array-buffer.h b/deps/v8/include/v8-array-buffer.h index e9047b79ce3..bab840f82c1 100644 --- a/deps/v8/include/v8-array-buffer.h +++ b/deps/v8/include/v8-array-buffer.h @@ -256,6 +256,12 @@ class V8_EXPORT ArrayBuffer : public Object { */ std::shared_ptr<BackingStore> GetBackingStore(); + /** + * More efficient shortcut for GetBackingStore()->Data(). The returned pointer + * is valid as long as the ArrayBuffer is alive. + */ + void* Data() const; + V8_INLINE static ArrayBuffer* Cast(Value* value) { #ifdef V8_ENABLE_CHECKS CheckCast(value); @@ -414,6 +420,12 @@ class V8_EXPORT SharedArrayBuffer : public Object { */ std::shared_ptr<BackingStore> GetBackingStore(); + /** + * More efficient shortcut for GetBackingStore()->Data(). The returned pointer + * is valid as long as the ArrayBuffer is alive. + */ + void* Data() const; + V8_INLINE static SharedArrayBuffer* Cast(Value* value) { #ifdef V8_ENABLE_CHECKS CheckCast(value); diff --git a/deps/v8/src/api/api.cc b/deps/v8/src/api/api.cc index 393f5471914..580ba47f1a7 100644 --- a/deps/v8/src/api/api.cc +++ b/deps/v8/src/api/api.cc @@ -4038,6 +4038,11 @@ std::shared_ptr<v8::BackingStore> v8::ArrayBuffer::GetBackingStore() { return std::static_pointer_cast<v8::BackingStore>(bs_base); } +void* v8::ArrayBuffer::Data() const { + i::Handle<i::JSArrayBuffer> self = Utils::OpenHandle(this); + return self->backing_store(); +} + std::shared_ptr<v8::BackingStore> v8::SharedArrayBuffer::GetBackingStore() { i::Handle<i::JSArrayBuffer> self = Utils::OpenHandle(this); std::shared_ptr<i::BackingStore> backing_store = self->GetBackingStore(); @@ -4048,6 +4053,11 @@ std::shared_ptr<v8::BackingStore> v8::SharedArrayBuffer::GetBackingStore() { return std::static_pointer_cast<v8::BackingStore>(bs_base); } +void* v8::SharedArrayBuffer::Data() const { + i::Handle<i::JSArrayBuffer> self = Utils::OpenHandle(this); + return self->backing_store(); +} + void v8::ArrayBuffer::CheckCast(Value* that) { i::Handle<i::Object> obj = Utils::OpenHandle(that); Utils::ApiCheck( diff --git a/deps/v8/test/cctest/test-api-array-buffer.cc b/deps/v8/test/cctest/test-api-array-buffer.cc index d472ebcf320..b087274b311 100644 --- a/deps/v8/test/cctest/test-api-array-buffer.cc +++ b/deps/v8/test/cctest/test-api-array-buffer.cc @@ -366,6 +366,7 @@ THREADED_TEST(SkipArrayBufferBackingStoreDuringGC) { // Should not move the pointer CHECK_EQ(ab->GetBackingStore()->Data(), store_ptr); + CHECK_EQ(ab->Data(), store_ptr); CcTest::array_buffer_allocator()->Free(buffer, 100); } @@ -394,8 +395,8 @@ THREADED_TEST(SkipArrayBufferDuringScavenge) { CcTest::CollectGarbage(i::NEW_SPACE); // in survivor space now CcTest::CollectGarbage(i::NEW_SPACE); // in old gen now - // Use `ab` to silence compiler warning CHECK_EQ(ab->GetBackingStore()->Data(), store_ptr); + CHECK_EQ(ab->Data(), store_ptr); } THREADED_TEST(Regress1006600) { @@ -418,6 +419,7 @@ THREADED_TEST(ArrayBuffer_NewBackingStore) { CHECK(!backing_store->IsShared()); Local<v8::ArrayBuffer> ab = v8::ArrayBuffer::New(isolate, backing_store); CHECK_EQ(backing_store.get(), ab->GetBackingStore().get()); + CHECK_EQ(backing_store->Data(), ab->Data()); } THREADED_TEST(SharedArrayBuffer_NewBackingStore) { @@ -430,6 +432,7 @@ THREADED_TEST(SharedArrayBuffer_NewBackingStore) { Local<v8::SharedArrayBuffer> ab = v8::SharedArrayBuffer::New(isolate, backing_store); CHECK_EQ(backing_store.get(), ab->GetBackingStore().get()); + CHECK_EQ(backing_store->Data(), ab->Data()); } static void* backing_store_custom_data = nullptr; |