summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libdeno/binding.cc9
-rw-r--r--libdeno/internal.h3
-rw-r--r--libdeno/libdeno_test.cc13
-rw-r--r--libdeno/libdeno_test.js3
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);