diff options
author | Darshan Sen <darshan.sen@postman.com> | 2021-08-30 13:15:49 +0530 |
---|---|---|
committer | Michaƫl Zasso <targos@protonmail.com> | 2021-09-06 09:19:25 +0200 |
commit | 879dc4658e9fe09bb40e08fa1d62680306e3f434 (patch) | |
tree | 2a5f4b15123067dc2b03d7e4eabd8440b2233c02 /src | |
parent | 7857e9cc774e36f7e82e01518a3ec34037649afb (diff) | |
download | node-new-879dc4658e9fe09bb40e08fa1d62680306e3f434.tar.gz |
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 <darshan.sen@postman.com>
PR-URL: https://github.com/nodejs/node/pull/39941
Reviewed-By: Anna Henningsen <anna@addaleax.net>
Reviewed-By: James M Snell <jasnell@gmail.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/node_buffer.cc | 74 |
1 files changed, 57 insertions, 17 deletions
diff --git a/src/node_buffer.cc b/src/node_buffer.cc index 962a4a11aa..0546e7a53f 100644 --- a/src/node_buffer.cc +++ b/src/node_buffer.cc @@ -352,16 +352,31 @@ MaybeLocal<Object> New(Isolate* isolate, size_t length) { MaybeLocal<Object> 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<Object>(); } - return scope.EscapeMaybe( - AllocatedBuffer::AllocateManaged(env, length).ToBuffer()); + Local<ArrayBuffer> ab; + { + NoArrayBufferZeroFillScope no_zero_fill_scope(env->isolate_data()); + std::unique_ptr<BackingStore> bs = + ArrayBuffer::NewBackingStore(isolate, length); + + CHECK(bs); + + ab = ArrayBuffer::New(isolate, std::move(bs)); + } + + MaybeLocal<Object> obj = + New(env, ab, 0, ab->ByteLength()) + .FromMaybe(Local<Uint8Array>()); + + return scope.EscapeMaybe(obj); } @@ -380,20 +395,33 @@ MaybeLocal<Object> Copy(Isolate* isolate, const char* data, size_t length) { MaybeLocal<Object> 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<Object>(); } - AllocatedBuffer ret = AllocatedBuffer::AllocateManaged(env, length); - if (length > 0) { - memcpy(ret.data(), data, length); + Local<ArrayBuffer> ab; + { + NoArrayBufferZeroFillScope no_zero_fill_scope(env->isolate_data()); + std::unique_ptr<BackingStore> 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<Object> obj = + New(env, ab, 0, ab->ByteLength()) + .FromMaybe(Local<Uint8Array>()); + + return scope.EscapeMaybe(obj); } @@ -1077,13 +1105,25 @@ static void EncodeUtf8String(const FunctionCallbackInfo<Value>& args) { Local<String> str = args[0].As<String>(); 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<ArrayBuffer> ab; + { + NoArrayBufferZeroFillScope no_zero_fill_scope(env->isolate_data()); + std::unique_ptr<BackingStore> bs = + ArrayBuffer::NewBackingStore(isolate, length); + + CHECK(bs); + + str->WriteUtf8(isolate, + static_cast<char*>(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); } |