Skip to content

Commit 7cc96b2

Browse files
RaisinTenjasnell
authored andcommitted
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: #39941 Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: James M Snell <jasnell@gmail.com>
1 parent 9fdb726 commit 7cc96b2

File tree

1 file changed

+57
-17
lines changed

1 file changed

+57
-17
lines changed

src/node_buffer.cc

Lines changed: 57 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -352,16 +352,31 @@ MaybeLocal<Object> New(Isolate* isolate, size_t length) {
352352

353353

354354
MaybeLocal<Object> New(Environment* env, size_t length) {
355-
EscapableHandleScope scope(env->isolate());
355+
Isolate* isolate(env->isolate());
356+
EscapableHandleScope scope(isolate);
356357

357358
// V8 currently only allows a maximum Typed Array index of max Smi.
358359
if (length > kMaxLength) {
359-
env->isolate()->ThrowException(ERR_BUFFER_TOO_LARGE(env->isolate()));
360+
isolate->ThrowException(ERR_BUFFER_TOO_LARGE(isolate));
360361
return Local<Object>();
361362
}
362363

363-
return scope.EscapeMaybe(
364-
AllocatedBuffer::AllocateManaged(env, length).ToBuffer());
364+
Local<ArrayBuffer> ab;
365+
{
366+
NoArrayBufferZeroFillScope no_zero_fill_scope(env->isolate_data());
367+
std::unique_ptr<BackingStore> bs =
368+
ArrayBuffer::NewBackingStore(isolate, length);
369+
370+
CHECK(bs);
371+
372+
ab = ArrayBuffer::New(isolate, std::move(bs));
373+
}
374+
375+
MaybeLocal<Object> obj =
376+
New(env, ab, 0, ab->ByteLength())
377+
.FromMaybe(Local<Uint8Array>());
378+
379+
return scope.EscapeMaybe(obj);
365380
}
366381

367382

@@ -380,20 +395,33 @@ MaybeLocal<Object> Copy(Isolate* isolate, const char* data, size_t length) {
380395

381396

382397
MaybeLocal<Object> Copy(Environment* env, const char* data, size_t length) {
383-
EscapableHandleScope scope(env->isolate());
398+
Isolate* isolate(env->isolate());
399+
EscapableHandleScope scope(isolate);
384400

385401
// V8 currently only allows a maximum Typed Array index of max Smi.
386402
if (length > kMaxLength) {
387-
env->isolate()->ThrowException(ERR_BUFFER_TOO_LARGE(env->isolate()));
403+
isolate->ThrowException(ERR_BUFFER_TOO_LARGE(isolate));
388404
return Local<Object>();
389405
}
390406

391-
AllocatedBuffer ret = AllocatedBuffer::AllocateManaged(env, length);
392-
if (length > 0) {
393-
memcpy(ret.data(), data, length);
407+
Local<ArrayBuffer> ab;
408+
{
409+
NoArrayBufferZeroFillScope no_zero_fill_scope(env->isolate_data());
410+
std::unique_ptr<BackingStore> bs =
411+
ArrayBuffer::NewBackingStore(isolate, length);
412+
413+
CHECK(bs);
414+
415+
memcpy(bs->Data(), data, length);
416+
417+
ab = ArrayBuffer::New(isolate, std::move(bs));
394418
}
395419

396-
return scope.EscapeMaybe(ret.ToBuffer());
420+
MaybeLocal<Object> obj =
421+
New(env, ab, 0, ab->ByteLength())
422+
.FromMaybe(Local<Uint8Array>());
423+
424+
return scope.EscapeMaybe(obj);
397425
}
398426

399427

@@ -1077,13 +1105,25 @@ static void EncodeUtf8String(const FunctionCallbackInfo<Value>& args) {
10771105

10781106
Local<String> str = args[0].As<String>();
10791107
size_t length = str->Utf8Length(isolate);
1080-
AllocatedBuffer buf = AllocatedBuffer::AllocateManaged(env, length);
1081-
str->WriteUtf8(isolate,
1082-
buf.data(),
1083-
-1, // We are certain that `data` is sufficiently large
1084-
nullptr,
1085-
String::NO_NULL_TERMINATION | String::REPLACE_INVALID_UTF8);
1086-
auto array = Uint8Array::New(buf.ToArrayBuffer(), 0, length);
1108+
1109+
Local<ArrayBuffer> ab;
1110+
{
1111+
NoArrayBufferZeroFillScope no_zero_fill_scope(env->isolate_data());
1112+
std::unique_ptr<BackingStore> bs =
1113+
ArrayBuffer::NewBackingStore(isolate, length);
1114+
1115+
CHECK(bs);
1116+
1117+
str->WriteUtf8(isolate,
1118+
static_cast<char*>(bs->Data()),
1119+
-1, // We are certain that `data` is sufficiently large
1120+
nullptr,
1121+
String::NO_NULL_TERMINATION | String::REPLACE_INVALID_UTF8);
1122+
1123+
ab = ArrayBuffer::New(isolate, std::move(bs));
1124+
}
1125+
1126+
auto array = Uint8Array::New(ab, 0, length);
10871127
args.GetReturnValue().Set(array);
10881128
}
10891129

0 commit comments

Comments
 (0)