From 2d939105da34bcc398c76efd97c3e2d3f1255f4c 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
---
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);
}