Commit 00704f5a authored by Marja Hölttä's avatar Marja Hölttä Committed by V8 LUCI CQ

[api] 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/+/3764341Reviewed-by: 's avatarCamillo Bruni <cbruni@chromium.org>
Commit-Queue: Marja Hölttä <marja@chromium.org>
Cr-Commit-Position: refs/heads/main@{#81745}
parent dc0ef86b
...@@ -256,6 +256,12 @@ class V8_EXPORT ArrayBuffer : public Object { ...@@ -256,6 +256,12 @@ class V8_EXPORT ArrayBuffer : public Object {
*/ */
std::shared_ptr<BackingStore> GetBackingStore(); 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) { V8_INLINE static ArrayBuffer* Cast(Value* value) {
#ifdef V8_ENABLE_CHECKS #ifdef V8_ENABLE_CHECKS
CheckCast(value); CheckCast(value);
...@@ -414,6 +420,12 @@ class V8_EXPORT SharedArrayBuffer : public Object { ...@@ -414,6 +420,12 @@ class V8_EXPORT SharedArrayBuffer : public Object {
*/ */
std::shared_ptr<BackingStore> GetBackingStore(); 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) { V8_INLINE static SharedArrayBuffer* Cast(Value* value) {
#ifdef V8_ENABLE_CHECKS #ifdef V8_ENABLE_CHECKS
CheckCast(value); CheckCast(value);
......
...@@ -4109,6 +4109,11 @@ std::shared_ptr<v8::BackingStore> v8::ArrayBuffer::GetBackingStore() { ...@@ -4109,6 +4109,11 @@ std::shared_ptr<v8::BackingStore> v8::ArrayBuffer::GetBackingStore() {
return std::static_pointer_cast<v8::BackingStore>(bs_base); 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() { std::shared_ptr<v8::BackingStore> v8::SharedArrayBuffer::GetBackingStore() {
i::Handle<i::JSArrayBuffer> self = Utils::OpenHandle(this); i::Handle<i::JSArrayBuffer> self = Utils::OpenHandle(this);
std::shared_ptr<i::BackingStore> backing_store = self->GetBackingStore(); std::shared_ptr<i::BackingStore> backing_store = self->GetBackingStore();
...@@ -4119,6 +4124,11 @@ std::shared_ptr<v8::BackingStore> v8::SharedArrayBuffer::GetBackingStore() { ...@@ -4119,6 +4124,11 @@ std::shared_ptr<v8::BackingStore> v8::SharedArrayBuffer::GetBackingStore() {
return std::static_pointer_cast<v8::BackingStore>(bs_base); 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) { void v8::ArrayBuffer::CheckCast(Value* that) {
i::Handle<i::Object> obj = Utils::OpenHandle(that); i::Handle<i::Object> obj = Utils::OpenHandle(that);
Utils::ApiCheck( Utils::ApiCheck(
......
...@@ -366,6 +366,7 @@ THREADED_TEST(SkipArrayBufferBackingStoreDuringGC) { ...@@ -366,6 +366,7 @@ THREADED_TEST(SkipArrayBufferBackingStoreDuringGC) {
// Should not move the pointer // Should not move the pointer
CHECK_EQ(ab->GetBackingStore()->Data(), store_ptr); CHECK_EQ(ab->GetBackingStore()->Data(), store_ptr);
CHECK_EQ(ab->Data(), store_ptr);
CcTest::array_buffer_allocator()->Free(buffer, 100); CcTest::array_buffer_allocator()->Free(buffer, 100);
} }
...@@ -394,8 +395,8 @@ THREADED_TEST(SkipArrayBufferDuringScavenge) { ...@@ -394,8 +395,8 @@ THREADED_TEST(SkipArrayBufferDuringScavenge) {
CcTest::CollectGarbage(i::NEW_SPACE); // in survivor space now CcTest::CollectGarbage(i::NEW_SPACE); // in survivor space now
CcTest::CollectGarbage(i::NEW_SPACE); // in old gen 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->GetBackingStore()->Data(), store_ptr);
CHECK_EQ(ab->Data(), store_ptr);
} }
THREADED_TEST(Regress1006600) { THREADED_TEST(Regress1006600) {
...@@ -418,6 +419,7 @@ THREADED_TEST(ArrayBuffer_NewBackingStore) { ...@@ -418,6 +419,7 @@ THREADED_TEST(ArrayBuffer_NewBackingStore) {
CHECK(!backing_store->IsShared()); CHECK(!backing_store->IsShared());
Local<v8::ArrayBuffer> ab = v8::ArrayBuffer::New(isolate, backing_store); Local<v8::ArrayBuffer> ab = v8::ArrayBuffer::New(isolate, backing_store);
CHECK_EQ(backing_store.get(), ab->GetBackingStore().get()); CHECK_EQ(backing_store.get(), ab->GetBackingStore().get());
CHECK_EQ(backing_store->Data(), ab->Data());
} }
THREADED_TEST(SharedArrayBuffer_NewBackingStore) { THREADED_TEST(SharedArrayBuffer_NewBackingStore) {
...@@ -430,6 +432,7 @@ THREADED_TEST(SharedArrayBuffer_NewBackingStore) { ...@@ -430,6 +432,7 @@ THREADED_TEST(SharedArrayBuffer_NewBackingStore) {
Local<v8::SharedArrayBuffer> ab = Local<v8::SharedArrayBuffer> ab =
v8::SharedArrayBuffer::New(isolate, backing_store); v8::SharedArrayBuffer::New(isolate, backing_store);
CHECK_EQ(backing_store.get(), ab->GetBackingStore().get()); CHECK_EQ(backing_store.get(), ab->GetBackingStore().get());
CHECK_EQ(backing_store->Data(), ab->Data());
} }
static void* backing_store_custom_data = nullptr; static void* backing_store_custom_data = nullptr;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment