src: introduce internal buffer slice constructor

Add a C++ variant of `Buffer.from(arrayBuffer, offset, length)`.

PR-URL: https://github.com/nodejs/node/pull/18030
Reviewed-By: James M Snell <jasnell@gmail.com>
This commit is contained in:
Anna Henningsen 2018-01-08 01:52:17 +01:00
parent 0c417821a0
commit da3078835a
No known key found for this signature in database
GPG Key ID: 9C63F3A6CD2AD8F9
2 changed files with 32 additions and 29 deletions

View File

@ -303,15 +303,14 @@ MaybeLocal<Object> New(Environment* env, size_t length) {
data,
length,
ArrayBufferCreationMode::kInternalized);
Local<Uint8Array> ui = Uint8Array::New(ab, 0, length);
Maybe<bool> mb =
ui->SetPrototype(env->context(), env->buffer_prototype_object());
if (mb.FromMaybe(false))
return scope.Escape(ui);
MaybeLocal<Uint8Array> ui = Buffer::New(env, ab, 0, length);
// Object failed to be created. Clean up resources.
free(data);
return Local<Object>();
if (ui.IsEmpty()) {
// Object failed to be created. Clean up resources.
free(data);
}
return scope.Escape(ui.FromMaybe(Local<Uint8Array>()));
}
@ -349,15 +348,14 @@ MaybeLocal<Object> Copy(Environment* env, const char* data, size_t length) {
new_data,
length,
ArrayBufferCreationMode::kInternalized);
Local<Uint8Array> ui = Uint8Array::New(ab, 0, length);
Maybe<bool> mb =
ui->SetPrototype(env->context(), env->buffer_prototype_object());
if (mb.FromMaybe(false))
return scope.Escape(ui);
MaybeLocal<Uint8Array> ui = Buffer::New(env, ab, 0, length);
// Object failed to be created. Clean up resources.
free(new_data);
return Local<Object>();
if (ui.IsEmpty()) {
// Object failed to be created. Clean up resources.
free(new_data);
}
return scope.Escape(ui.FromMaybe(Local<Uint8Array>()));
}
@ -392,15 +390,14 @@ MaybeLocal<Object> New(Environment* env,
// correct.
if (data == nullptr)
ab->Neuter();
Local<Uint8Array> ui = Uint8Array::New(ab, 0, length);
Maybe<bool> mb =
ui->SetPrototype(env->context(), env->buffer_prototype_object());
MaybeLocal<Uint8Array> ui = Buffer::New(env, ab, 0, length);
if (!mb.FromMaybe(false))
if (ui.IsEmpty()) {
return Local<Object>();
}
CallbackInfo::New(env->isolate(), ab, callback, data, hint);
return scope.Escape(ui);
return scope.Escape(ui.ToLocalChecked());
}
@ -415,8 +412,6 @@ MaybeLocal<Object> New(Isolate* isolate, char* data, size_t length) {
MaybeLocal<Object> New(Environment* env, char* data, size_t length) {
EscapableHandleScope scope(env->isolate());
if (length > 0) {
CHECK_NE(data, nullptr);
CHECK(length <= kMaxLength);
@ -427,12 +422,7 @@ MaybeLocal<Object> New(Environment* env, char* data, size_t length) {
data,
length,
ArrayBufferCreationMode::kInternalized);
Local<Uint8Array> ui = Uint8Array::New(ab, 0, length);
Maybe<bool> mb =
ui->SetPrototype(env->context(), env->buffer_prototype_object());
if (mb.FromMaybe(false))
return scope.Escape(ui);
return Local<Object>();
return Buffer::New(env, ab, 0, length).FromMaybe(Local<Object>());
}
namespace {

View File

@ -357,6 +357,19 @@ v8::MaybeLocal<v8::Object> New(Environment* env,
// Mixing operator new and free() is undefined behavior so don't do that.
v8::MaybeLocal<v8::Object> New(Environment* env, char* data, size_t length);
inline
v8::MaybeLocal<v8::Uint8Array> New(Environment* env,
v8::Local<v8::ArrayBuffer> ab,
size_t byte_offset,
size_t length) {
v8::Local<v8::Uint8Array> ui = v8::Uint8Array::New(ab, byte_offset, length);
v8::Maybe<bool> mb =
ui->SetPrototype(env->context(), env->buffer_prototype_object());
if (mb.IsNothing())
return v8::MaybeLocal<v8::Uint8Array>();
return ui;
}
// Construct a Buffer from a MaybeStackBuffer (and also its subclasses like
// Utf8Value and TwoByteValue).
// If |buf| is invalidated, an empty MaybeLocal is returned, and nothing is