Skip to content

Commit 7219a13

Browse files
addaleaxevanlucas
authored andcommitted
src: introduce internal buffer slice constructor
Add a C++ variant of `Buffer.from(arrayBuffer, offset, length)`. PR-URL: #18030 Reviewed-By: James M Snell <[email protected]>
1 parent f25cba3 commit 7219a13

File tree

2 files changed

+32
-29
lines changed

2 files changed

+32
-29
lines changed

src/node_buffer.cc

+19-29
Original file line numberDiff line numberDiff line change
@@ -303,15 +303,14 @@ MaybeLocal<Object> New(Environment* env, size_t length) {
303303
data,
304304
length,
305305
ArrayBufferCreationMode::kInternalized);
306-
Local<Uint8Array> ui = Uint8Array::New(ab, 0, length);
307-
Maybe<bool> mb =
308-
ui->SetPrototype(env->context(), env->buffer_prototype_object());
309-
if (mb.FromMaybe(false))
310-
return scope.Escape(ui);
306+
MaybeLocal<Uint8Array> ui = Buffer::New(env, ab, 0, length);
311307

312-
// Object failed to be created. Clean up resources.
313-
free(data);
314-
return Local<Object>();
308+
if (ui.IsEmpty()) {
309+
// Object failed to be created. Clean up resources.
310+
free(data);
311+
}
312+
313+
return scope.Escape(ui.FromMaybe(Local<Uint8Array>()));
315314
}
316315

317316

@@ -349,15 +348,14 @@ MaybeLocal<Object> Copy(Environment* env, const char* data, size_t length) {
349348
new_data,
350349
length,
351350
ArrayBufferCreationMode::kInternalized);
352-
Local<Uint8Array> ui = Uint8Array::New(ab, 0, length);
353-
Maybe<bool> mb =
354-
ui->SetPrototype(env->context(), env->buffer_prototype_object());
355-
if (mb.FromMaybe(false))
356-
return scope.Escape(ui);
351+
MaybeLocal<Uint8Array> ui = Buffer::New(env, ab, 0, length);
357352

358-
// Object failed to be created. Clean up resources.
359-
free(new_data);
360-
return Local<Object>();
353+
if (ui.IsEmpty()) {
354+
// Object failed to be created. Clean up resources.
355+
free(new_data);
356+
}
357+
358+
return scope.Escape(ui.FromMaybe(Local<Uint8Array>()));
361359
}
362360

363361

@@ -392,15 +390,14 @@ MaybeLocal<Object> New(Environment* env,
392390
// correct.
393391
if (data == nullptr)
394392
ab->Neuter();
395-
Local<Uint8Array> ui = Uint8Array::New(ab, 0, length);
396-
Maybe<bool> mb =
397-
ui->SetPrototype(env->context(), env->buffer_prototype_object());
393+
MaybeLocal<Uint8Array> ui = Buffer::New(env, ab, 0, length);
398394

399-
if (!mb.FromMaybe(false))
395+
if (ui.IsEmpty()) {
400396
return Local<Object>();
397+
}
401398

402399
CallbackInfo::New(env->isolate(), ab, callback, data, hint);
403-
return scope.Escape(ui);
400+
return scope.Escape(ui.ToLocalChecked());
404401
}
405402

406403

@@ -415,8 +412,6 @@ MaybeLocal<Object> New(Isolate* isolate, char* data, size_t length) {
415412

416413

417414
MaybeLocal<Object> New(Environment* env, char* data, size_t length) {
418-
EscapableHandleScope scope(env->isolate());
419-
420415
if (length > 0) {
421416
CHECK_NE(data, nullptr);
422417
CHECK(length <= kMaxLength);
@@ -427,12 +422,7 @@ MaybeLocal<Object> New(Environment* env, char* data, size_t length) {
427422
data,
428423
length,
429424
ArrayBufferCreationMode::kInternalized);
430-
Local<Uint8Array> ui = Uint8Array::New(ab, 0, length);
431-
Maybe<bool> mb =
432-
ui->SetPrototype(env->context(), env->buffer_prototype_object());
433-
if (mb.FromMaybe(false))
434-
return scope.Escape(ui);
435-
return Local<Object>();
425+
return Buffer::New(env, ab, 0, length).FromMaybe(Local<Object>());
436426
}
437427

438428
namespace {

src/node_internals.h

+13
Original file line numberDiff line numberDiff line change
@@ -357,6 +357,19 @@ v8::MaybeLocal<v8::Object> New(Environment* env,
357357
// Mixing operator new and free() is undefined behavior so don't do that.
358358
v8::MaybeLocal<v8::Object> New(Environment* env, char* data, size_t length);
359359

360+
inline
361+
v8::MaybeLocal<v8::Uint8Array> New(Environment* env,
362+
v8::Local<v8::ArrayBuffer> ab,
363+
size_t byte_offset,
364+
size_t length) {
365+
v8::Local<v8::Uint8Array> ui = v8::Uint8Array::New(ab, byte_offset, length);
366+
v8::Maybe<bool> mb =
367+
ui->SetPrototype(env->context(), env->buffer_prototype_object());
368+
if (mb.IsNothing())
369+
return v8::MaybeLocal<v8::Uint8Array>();
370+
return ui;
371+
}
372+
360373
// Construct a Buffer from a MaybeStackBuffer (and also its subclasses like
361374
// Utf8Value and TwoByteValue).
362375
// If |buf| is invalidated, an empty MaybeLocal is returned, and nothing is

0 commit comments

Comments
 (0)