From 0bf5bba7dc3802509154cd2f8a6ac4aab2fd71ff Mon Sep 17 00:00:00 2001 From: Darshan Sen Date: Mon, 30 Aug 2021 13:15:49 +0530 Subject: [PATCH] src: remove usage of AllocatedBuffer from src/node_buffer.cc Since AllocatedBuffer is just a thin wrapper around v8::BackingStore, we should prefer using v8::BackingStore directly. Refs: https://github.com/nodejs/node/blob/52abf271c563ddffdc93b444ea05e5347a7f2784/src/allocated_buffer.h#L30-L31 Signed-off-by: Darshan Sen PR-URL: https://github.com/nodejs/node/pull/39941 Reviewed-By: Anna Henningsen Reviewed-By: James M Snell --- src/node_buffer.cc | 74 +++++++++++++++++++++++++++++++++++----------- 1 file changed, 57 insertions(+), 17 deletions(-) diff --git a/src/node_buffer.cc b/src/node_buffer.cc index 962a4a11aab8e6..0546e7a53fae90 100644 --- a/src/node_buffer.cc +++ b/src/node_buffer.cc @@ -352,16 +352,31 @@ MaybeLocal New(Isolate* isolate, size_t length) { MaybeLocal New(Environment* env, size_t length) { - EscapableHandleScope scope(env->isolate()); + Isolate* isolate(env->isolate()); + EscapableHandleScope scope(isolate); // V8 currently only allows a maximum Typed Array index of max Smi. if (length > kMaxLength) { - env->isolate()->ThrowException(ERR_BUFFER_TOO_LARGE(env->isolate())); + isolate->ThrowException(ERR_BUFFER_TOO_LARGE(isolate)); return Local(); } - return scope.EscapeMaybe( - AllocatedBuffer::AllocateManaged(env, length).ToBuffer()); + Local ab; + { + NoArrayBufferZeroFillScope no_zero_fill_scope(env->isolate_data()); + std::unique_ptr bs = + ArrayBuffer::NewBackingStore(isolate, length); + + CHECK(bs); + + ab = ArrayBuffer::New(isolate, std::move(bs)); + } + + MaybeLocal obj = + New(env, ab, 0, ab->ByteLength()) + .FromMaybe(Local()); + + return scope.EscapeMaybe(obj); } @@ -380,20 +395,33 @@ MaybeLocal Copy(Isolate* isolate, const char* data, size_t length) { MaybeLocal Copy(Environment* env, const char* data, size_t length) { - EscapableHandleScope scope(env->isolate()); + Isolate* isolate(env->isolate()); + EscapableHandleScope scope(isolate); // V8 currently only allows a maximum Typed Array index of max Smi. if (length > kMaxLength) { - env->isolate()->ThrowException(ERR_BUFFER_TOO_LARGE(env->isolate())); + isolate->ThrowException(ERR_BUFFER_TOO_LARGE(isolate)); return Local(); } - AllocatedBuffer ret = AllocatedBuffer::AllocateManaged(env, length); - if (length > 0) { - memcpy(ret.data(), data, length); + Local ab; + { + NoArrayBufferZeroFillScope no_zero_fill_scope(env->isolate_data()); + std::unique_ptr bs = + ArrayBuffer::NewBackingStore(isolate, length); + + CHECK(bs); + + memcpy(bs->Data(), data, length); + + ab = ArrayBuffer::New(isolate, std::move(bs)); } - return scope.EscapeMaybe(ret.ToBuffer()); + MaybeLocal obj = + New(env, ab, 0, ab->ByteLength()) + .FromMaybe(Local()); + + return scope.EscapeMaybe(obj); } @@ -1077,13 +1105,25 @@ static void EncodeUtf8String(const FunctionCallbackInfo& args) { Local str = args[0].As(); size_t length = str->Utf8Length(isolate); - AllocatedBuffer buf = AllocatedBuffer::AllocateManaged(env, length); - str->WriteUtf8(isolate, - buf.data(), - -1, // We are certain that `data` is sufficiently large - nullptr, - String::NO_NULL_TERMINATION | String::REPLACE_INVALID_UTF8); - auto array = Uint8Array::New(buf.ToArrayBuffer(), 0, length); + + Local ab; + { + NoArrayBufferZeroFillScope no_zero_fill_scope(env->isolate_data()); + std::unique_ptr bs = + ArrayBuffer::NewBackingStore(isolate, length); + + CHECK(bs); + + str->WriteUtf8(isolate, + static_cast(bs->Data()), + -1, // We are certain that `data` is sufficiently large + nullptr, + String::NO_NULL_TERMINATION | String::REPLACE_INVALID_UTF8); + + ab = ArrayBuffer::New(isolate, std::move(bs)); + } + + auto array = Uint8Array::New(ab, 0, length); args.GetReturnValue().Set(array); }