diff options
-rw-r--r-- | libdeno/binding.cc | 9 | ||||
-rw-r--r-- | libdeno/internal.h | 3 | ||||
-rw-r--r-- | libdeno/libdeno_test.cc | 13 | ||||
-rw-r--r-- | libdeno/libdeno_test.js | 3 |
4 files changed, 22 insertions, 6 deletions
diff --git a/libdeno/binding.cc b/libdeno/binding.cc index 961fd1797..78e4cad29 100644 --- a/libdeno/binding.cc +++ b/libdeno/binding.cc @@ -316,14 +316,15 @@ void Shared(v8::Local<v8::Name> property, if (d->shared_.data_ptr == nullptr) { return; } - v8::Local<v8::ArrayBuffer> ab; + v8::Local<v8::SharedArrayBuffer> ab; if (d->shared_ab_.IsEmpty()) { // Lazily initialize the persistent external ArrayBuffer. - ab = v8::ArrayBuffer::New(isolate, d->shared_.data_ptr, d->shared_.data_len, - v8::ArrayBufferCreationMode::kExternalized); + ab = v8::SharedArrayBuffer::New(isolate, d->shared_.data_ptr, + d->shared_.data_len, + v8::ArrayBufferCreationMode::kExternalized); d->shared_ab_.Reset(isolate, ab); } - info.GetReturnValue().Set(ab); + info.GetReturnValue().Set(d->shared_ab_); } void DenoIsolate::ClearModules() { diff --git a/libdeno/internal.h b/libdeno/internal.h index 14a9cd43f..0cd50162c 100644 --- a/libdeno/internal.h +++ b/libdeno/internal.h @@ -46,6 +46,7 @@ class DenoIsolate { } ~DenoIsolate() { + shared_ab_.Reset(); if (snapshot_creator_) { delete snapshot_creator_; } else { @@ -98,7 +99,7 @@ class DenoIsolate { v8::Persistent<v8::Function> recv_; v8::StartupData snapshot_; v8::Persistent<v8::ArrayBuffer> global_import_buf_; - v8::Persistent<v8::ArrayBuffer> shared_ab_; + v8::Persistent<v8::SharedArrayBuffer> shared_ab_; }; class UserDataScope { diff --git a/libdeno/libdeno_test.cc b/libdeno/libdeno_test.cc index b14b4758b..0936c53b4 100644 --- a/libdeno/libdeno_test.cc +++ b/libdeno/libdeno_test.cc @@ -289,3 +289,16 @@ TEST(LibDenoTest, Utf8Bug) { EXPECT_EQ(nullptr, deno_last_exception(d)); deno_delete(d); } + +TEST(LibDenoTest, SharedAtomics) { + int32_t s[] = {0, 1, 2}; + deno_buf shared = {nullptr, 0, reinterpret_cast<uint8_t*>(s), sizeof s}; + Deno* d = deno_new(deno_config{0, empty, shared, nullptr}); + deno_execute(d, nullptr, "a.js", + "Atomics.add(new Int32Array(libdeno.shared), 0, 1)"); + EXPECT_EQ(nullptr, deno_last_exception(d)); + EXPECT_EQ(s[0], 1); + EXPECT_EQ(s[1], 1); + EXPECT_EQ(s[2], 2); + deno_delete(d); +} diff --git a/libdeno/libdeno_test.js b/libdeno/libdeno_test.js index 5e1430d9e..50f5c03d4 100644 --- a/libdeno/libdeno_test.js +++ b/libdeno/libdeno_test.js @@ -136,7 +136,8 @@ global.CheckPromiseErrors = () => { global.Shared = () => { const ab = libdeno.shared; - assert(ab instanceof ArrayBuffer); + assert(ab instanceof SharedArrayBuffer); + assert(libdeno.shared != undefined); assert(ab.byteLength === 3); const ui8 = new Uint8Array(ab); assert(ui8[0] === 0); |