buffer: construct Uint8Array in JS · nodejs/node@7df018a
@@ -68,6 +68,7 @@ using v8::Object;
6868using v8::Persistent;
6969using v8::String;
7070using v8::Uint32;
71+using v8::Uint32Array;
7172using v8::Uint8Array;
7273using v8::Value;
7374using 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-432396void CreateFromString(const FunctionCallbackInfo<Value>& args) {
433397CHECK(args[0]->IsString());
434398CHECK(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