summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libdeno/binding.cc22
-rw-r--r--libdeno/libdeno_test.cc12
-rw-r--r--libdeno/libdeno_test.js12
3 files changed, 4 insertions, 42 deletions
diff --git a/libdeno/binding.cc b/libdeno/binding.cc
index 6d88af360..bc155b6db 100644
--- a/libdeno/binding.cc
+++ b/libdeno/binding.cc
@@ -168,25 +168,18 @@ static v8::Local<v8::Uint8Array> ImportBuf(v8::Isolate* isolate, deno_buf buf) {
}
}
-static deno_buf ExportBuf(v8::Isolate* isolate,
- v8::Local<v8::ArrayBufferView> view) {
+static deno_buf GetContents(v8::Isolate* isolate,
+ v8::Local<v8::ArrayBufferView> view) {
auto ab = view->Buffer();
- auto contents = ab->Externalize();
-
+ auto contents = ab->GetContents();
deno_buf buf;
buf.alloc_ptr = reinterpret_cast<uint8_t*>(contents.Data());
buf.alloc_len = contents.ByteLength();
buf.data_ptr = buf.alloc_ptr + view->ByteOffset();
buf.data_len = view->ByteLength();
-
- // Prevent JS from modifying buffer contents after exporting.
- ab->Neuter();
-
return buf;
}
-static void FreeBuf(deno_buf buf) { free(buf.alloc_ptr); }
-
// Sets the recv callback.
void Recv(const v8::FunctionCallbackInfo<v8::Value>& args) {
v8::Isolate* isolate = args.GetIsolate();
@@ -218,20 +211,13 @@ void Send(const v8::FunctionCallbackInfo<v8::Value>& args) {
CHECK_EQ(args.Length(), 1);
v8::Local<v8::Value> ab_v = args[0];
CHECK(ab_v->IsArrayBufferView());
- auto buf = ExportBuf(isolate, v8::Local<v8::ArrayBufferView>::Cast(ab_v));
+ auto buf = GetContents(isolate, v8::Local<v8::ArrayBufferView>::Cast(ab_v));
DCHECK_EQ(d->currentArgs, nullptr);
d->currentArgs = &args;
d->cb(d, buf);
- // Buffer is only valid until the end of the callback.
- // TODO(piscisaureus):
- // It's possible that data in the buffer is needed after the callback
- // returns, e.g. when the handler offloads work to a thread pool, therefore
- // make the callback responsible for releasing the buffer.
- FreeBuf(buf);
-
d->currentArgs = nullptr;
}
diff --git a/libdeno/libdeno_test.cc b/libdeno/libdeno_test.cc
index d3650788f..c8b0adfd0 100644
--- a/libdeno/libdeno_test.cc
+++ b/libdeno/libdeno_test.cc
@@ -152,18 +152,6 @@ TEST(LibDenoTest, JSSendArrayBufferViewTypes) {
deno_delete(d);
}
-TEST(LibDenoTest, JSSendNeutersBuffer) {
- static int count = 0;
- Deno* d = deno_new(nullptr, [](auto _, auto buf) {
- count++;
- EXPECT_EQ(buf.data_len, 1u);
- EXPECT_EQ(buf.data_ptr[0], 42);
- });
- EXPECT_TRUE(deno_execute(d, "a.js", "JSSendNeutersBuffer()"));
- EXPECT_EQ(count, 1);
- deno_delete(d);
-}
-
TEST(LibDenoTest, TypedArraySnapshots) {
Deno* d = deno_new(nullptr, nullptr);
EXPECT_TRUE(deno_execute(d, "a.js", "TypedArraySnapshots()"));
diff --git a/libdeno/libdeno_test.js b/libdeno/libdeno_test.js
index d51973ef0..ec8e4c752 100644
--- a/libdeno/libdeno_test.js
+++ b/libdeno/libdeno_test.js
@@ -103,18 +103,6 @@ global.JSSendArrayBufferViewTypes = () => {
libdeno.send(dv);
};
-global.JSSendNeutersBuffer = () => {
- // Buffer should be neutered after transferring it to the native side.
- const u8 = new Uint8Array([42]);
- assert(u8.byteLength === 1);
- assert(u8.buffer.byteLength === 1);
- assert(u8[0] === 42);
- const r = libdeno.send(u8);
- assert(u8.byteLength === 0);
- assert(u8.buffer.byteLength === 0);
- assert(u8[0] === undefined);
-};
-
// The following join has caused SnapshotBug to segfault when using kKeep.
[].join("");