From 5b8b92176e752314b282963abf7e0fc109b78c7e Mon Sep 17 00:00:00 2001 From: Yagiz Nizipli Date: Fri, 18 Nov 2022 04:46:49 -0500 Subject: [PATCH] deps: V8: cherry-pick 9df5ef70ff18 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Original commit message: Add an `v8::ArrayBuffer::WasDetached` method to the C++ API V8's C++ API does not give a way to tell whether an ArrayBuffer has been detached from the `v8::ArrayBuffer` class. In fact, as far as can be told from the C++ API without running JS code, detached ArrayBuffers behave the same as zero-sized ArrayBuffers and there is no way to observe the difference. However, this difference can be observed in JS because constructing a TypedArray from a detached ArrayBuffer will throw. This change adds a `WasDetached` method to the `v8::ArrayBuffer` class to give embedders access to this information without having to run JS code. Bug: v8:13159 Change-Id: I2bb1e380cee1cecd31f6d48ec3d9f28c03a8a673 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3810345 Commit-Queue: Toon Verwaest Reviewed-by: Toon Verwaest Cr-Commit-Position: refs/heads/main@{#83963} Refs: https://github.com/v8/v8/commit/9df5ef70ff18977b157028fc55ced5af4bcee535 PR-URL: https://github.com/nodejs/node/pull/45474 Reviewed-By: Michaƫl Zasso Reviewed-By: Joyee Cheung Reviewed-By: Luigi Pinca Reviewed-By: Daeyeon Jeong Reviewed-By: Rich Trott Reviewed-By: Jiawen Geng Reviewed-By: James M Snell --- common.gypi | 2 +- deps/v8/AUTHORS | 1 + deps/v8/include/v8-array-buffer.h | 8 +++++ deps/v8/src/api/api.cc | 4 +++ deps/v8/test/cctest/cctest.status | 1 + deps/v8/test/cctest/test-api-array-buffer.cc | 31 ++++++++++++++++++++ 6 files changed, 46 insertions(+), 1 deletion(-) diff --git a/common.gypi b/common.gypi index da2e7b0462d..96d7ebe61ac 100644 --- a/common.gypi +++ b/common.gypi @@ -36,7 +36,7 @@ # Reset this number to 0 on major V8 upgrades. # Increment by one for each non-official patch applied to deps/v8. - 'v8_embedder_string': '-node.19', + 'v8_embedder_string': '-node.20', ##### V8 defaults for Node.js ##### diff --git a/deps/v8/AUTHORS b/deps/v8/AUTHORS index 3ef613e0f37..74d6f3b07ff 100644 --- a/deps/v8/AUTHORS +++ b/deps/v8/AUTHORS @@ -60,6 +60,7 @@ Allan Sandfeld Jensen Amos Lim Andreas Anyuru Andrei Kashcha +Andreu Botella Andrew Paprocki Anna Henningsen Antoine du Hamel diff --git a/deps/v8/include/v8-array-buffer.h b/deps/v8/include/v8-array-buffer.h index bab840f82c1..cc5d2d43230 100644 --- a/deps/v8/include/v8-array-buffer.h +++ b/deps/v8/include/v8-array-buffer.h @@ -240,6 +240,11 @@ class V8_EXPORT ArrayBuffer : public Object { */ bool IsDetachable() const; + /** + * Returns true if this ArrayBuffer has been detached. + */ + bool WasDetached() const; + /** * Detaches this ArrayBuffer and all its views (typed arrays). * Detaching sets the byte length of the buffer and all typed arrays to zero, @@ -253,6 +258,9 @@ class V8_EXPORT ArrayBuffer : public Object { * pointer coordinates the lifetime management of the internal storage * with any live ArrayBuffers on the heap, even across isolates. The embedder * should not attempt to manage lifetime of the storage through other means. + * + * The returned shared pointer will not be empty, even if the ArrayBuffer has + * been detached. Use |WasDetached| to tell if it has been detached instead. */ std::shared_ptr GetBackingStore(); diff --git a/deps/v8/src/api/api.cc b/deps/v8/src/api/api.cc index cf755cafc2c..b54e5542173 100644 --- a/deps/v8/src/api/api.cc +++ b/deps/v8/src/api/api.cc @@ -8064,6 +8064,10 @@ bool v8::ArrayBuffer::IsDetachable() const { return Utils::OpenHandle(this)->is_detachable(); } +bool v8::ArrayBuffer::WasDetached() const { + return Utils::OpenHandle(this)->was_detached(); +} + namespace { std::shared_ptr ToInternal( std::shared_ptr backing_store) { diff --git a/deps/v8/test/cctest/cctest.status b/deps/v8/test/cctest/cctest.status index 7bfa3867d63..b225460be09 100644 --- a/deps/v8/test/cctest/cctest.status +++ b/deps/v8/test/cctest/cctest.status @@ -516,6 +516,7 @@ 'test-api/WasmI32AtomicWaitCallback': [SKIP], 'test-api/WasmI64AtomicWaitCallback': [SKIP], 'test-api/WasmSetJitCodeEventHandler': [SKIP], + 'test-api-array-buffer/ArrayBuffer_NonDetachableWasDetached': [SKIP], 'test-backing-store/Run_WasmModule_Buffer_Externalized_Regression_UseAfterFree': [SKIP], 'test-c-wasm-entry/*': [SKIP], 'test-compilation-cache/*': [SKIP], diff --git a/deps/v8/test/cctest/test-api-array-buffer.cc b/deps/v8/test/cctest/test-api-array-buffer.cc index b087274b311..dff69296908 100644 --- a/deps/v8/test/cctest/test-api-array-buffer.cc +++ b/deps/v8/test/cctest/test-api-array-buffer.cc @@ -245,6 +245,37 @@ THREADED_TEST(ArrayBuffer_DetachingScript) { CheckDataViewIsDetached(dv); } +THREADED_TEST(ArrayBuffer_WasDetached) { + LocalContext env; + v8::Isolate* isolate = env->GetIsolate(); + v8::HandleScope handle_scope(isolate); + + Local ab = v8::ArrayBuffer::New(isolate, 0); + CHECK(!ab->WasDetached()); + + ab->Detach(); + CHECK(ab->WasDetached()); +} + +THREADED_TEST(ArrayBuffer_NonDetachableWasDetached) { + LocalContext env; + v8::Isolate* isolate = env->GetIsolate(); + v8::HandleScope handle_scope(isolate); + + CompileRun(R"JS( + var wasmMemory = new WebAssembly.Memory({initial: 1, maximum: 2}); + )JS"); + + Local non_detachable = + CompileRun("wasmMemory.buffer").As(); + CHECK(!non_detachable->IsDetachable()); + CHECK(!non_detachable->WasDetached()); + + CompileRun("wasmMemory.grow(1)"); + CHECK(!non_detachable->IsDetachable()); + CHECK(non_detachable->WasDetached()); +} + THREADED_TEST(ArrayBuffer_ExternalizeEmpty) { LocalContext env; v8::Isolate* isolate = env->GetIsolate();