buffer: construct Uint8Array in JS · nodejs/node@7df018a

@@ -68,6 +68,7 @@ using v8::Object;

6868

using v8::Persistent;

6969

using v8::String;

7070

using v8::Uint32;

71+

using v8::Uint32Array;

7172

using v8::Uint8Array;

7273

using v8::Value;

7374

using v8::WeakCallbackData;

@@ -392,43 +393,6 @@ MaybeLocal<Object> New(Environment* env, char* data, size_t length) {

392393

}

393394394395395-

void Create(const FunctionCallbackInfo<Value>& args) {

396-

Isolate* isolate = args.GetIsolate();

397-

Environment* env = Environment::GetCurrent(args);

398-399-

CHECK(args[0]->IsNumber());

400-401-

int64_t length = args[0]->IntegerValue();

402-403-

if (length < 0 || length > kMaxLength) {

404-

return env->ThrowRangeError("invalid Buffer length");

405-

}

406-407-

void* data;

408-

if (length > 0) {

409-

data = malloc(length);

410-

if (data == nullptr) {

411-

return env->ThrowRangeError(

412-

"Buffer allocation failed - process out of memory");

413-

}

414-

} else {

415-

data = nullptr;

416-

}

417-418-

Local<ArrayBuffer> ab =

419-

ArrayBuffer::New(isolate,

420-

data,

421-

length,

422-

ArrayBufferCreationMode::kInternalized);

423-

Local<Uint8Array> ui = Uint8Array::New(ab, 0, length);

424-

Maybe<bool> mb =

425-

ui->SetPrototype(env->context(), env->buffer_prototype_object());

426-

if (!mb.FromMaybe(false))

427-

return env->ThrowError("Unable to set Object prototype");

428-

args.GetReturnValue().Set(ui);

429-

}

430-431-432396

void CreateFromString(const FunctionCallbackInfo<Value>& args) {

433397

CHECK(args[0]->IsString());

434398

CHECK(args[1]->IsString());

@@ -966,6 +930,19 @@ void SetupBufferJS(const FunctionCallbackInfo<Value>& args) {

966930

env->SetMethod(proto, "utf8Write", Utf8Write);

967931968932

env->SetMethod(proto, "copy", Copy);

933+934+

CHECK(args[1]->IsObject());

935+

Local<Object> bObj = args[1].As<Object>();

936+937+

uint32_t* const fields = env->array_buffer_allocator_info()->fields();

938+

uint32_t const fields_count =

939+

env->array_buffer_allocator_info()->fields_count();

940+941+

Local<ArrayBuffer> array_buffer =

942+

ArrayBuffer::New(env->isolate(), fields, sizeof(*fields) * fields_count);

943+944+

bObj->Set(String::NewFromUtf8(env->isolate(), "flags"),

945+

Uint32Array::New(array_buffer, 0, fields_count));

969946

}

970947971948

@@ -975,7 +952,6 @@ void Initialize(Local<Object> target,

975952

Environment* env = Environment::GetCurrent(context);

976953977954

env->SetMethod(target, "setupBufferJS", SetupBufferJS);

978-

env->SetMethod(target, "create", Create);

979955

env->SetMethod(target, "createFromString", CreateFromString);

980956

env->SetMethod(target, "createFromArrayBuffer", CreateFromArrayBuffer);

981957