From 234d5ea780d8621866da87097c78ec10167cbdc5 Mon Sep 17 00:00:00 2001 From: Ryan Dahl Date: Wed, 19 Sep 2018 08:24:34 -0700 Subject: libdeno.send(): Use GetContents instead of Externalize Fixes #744. --- libdeno/binding.cc | 22 ++++------------------ 1 file changed, 4 insertions(+), 18 deletions(-) (limited to 'libdeno/binding.cc') 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 ImportBuf(v8::Isolate* isolate, deno_buf buf) { } } -static deno_buf ExportBuf(v8::Isolate* isolate, - v8::Local view) { +static deno_buf GetContents(v8::Isolate* isolate, + v8::Local view) { auto ab = view->Buffer(); - auto contents = ab->Externalize(); - + auto contents = ab->GetContents(); deno_buf buf; buf.alloc_ptr = reinterpret_cast(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& args) { v8::Isolate* isolate = args.GetIsolate(); @@ -218,20 +211,13 @@ void Send(const v8::FunctionCallbackInfo& args) { CHECK_EQ(args.Length(), 1); v8::Local ab_v = args[0]; CHECK(ab_v->IsArrayBufferView()); - auto buf = ExportBuf(isolate, v8::Local::Cast(ab_v)); + auto buf = GetContents(isolate, v8::Local::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; } -- cgit v1.2.3