src: add internal binding for constructing SharedArrayBuffers · nodejs/node@fdff838

@@ -10,6 +10,7 @@ namespace util {

10101111

using v8::ALL_PROPERTIES;

1212

using v8::Array;

13+

using v8::ArrayBuffer;

1314

using v8::ArrayBufferView;

1415

using v8::BigInt;

1516

using v8::Boolean;

@@ -34,6 +35,7 @@ using v8::ONLY_WRITABLE;

3435

using v8::Promise;

3536

using v8::PropertyFilter;

3637

using v8::Proxy;

38+

using v8::SharedArrayBuffer;

3739

using v8::SKIP_STRINGS;

3840

using v8::SKIP_SYMBOLS;

3941

using v8::StackFrame;

@@ -438,6 +440,30 @@ static void DefineLazyProperties(const FunctionCallbackInfo<Value>& args) {

438440

}

439441

}

440442443+

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

444+

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

445+

int64_t length;

446+

// Note: IntegerValue() clamps its output, so excessively large input values

447+

// will not overflow

448+

if (!args[0]->IntegerValue(env->context()).To(&length)) {

449+

return;

450+

}

451+

if (length < 0 ||

452+

static_cast<uint64_t>(length) > ArrayBuffer::kMaxByteLength) {

453+

env->ThrowRangeError("Invalid array buffer length");

454+

return;

455+

}

456+

Local<SharedArrayBuffer> sab;

457+

if (!SharedArrayBuffer::MaybeNew(env->isolate(), static_cast<size_t>(length))

458+

.ToLocal(&sab)) {

459+

// Note: SharedArrayBuffer::MaybeNew doesn't schedule an exception if it

460+

// fails

461+

env->ThrowRangeError("Array buffer allocation failed");

462+

return;

463+

}

464+

args.GetReturnValue().Set(sab);

465+

}

466+441467

void RegisterExternalReferences(ExternalReferenceRegistry* registry) {

442468

registry->Register(GetPromiseDetails);

443469

registry->Register(GetProxyDetails);

@@ -455,6 +481,7 @@ void RegisterExternalReferences(ExternalReferenceRegistry* registry) {

455481

registry->Register(IsInsideNodeModules);

456482

registry->Register(DefineLazyProperties);

457483

registry->Register(DefineLazyPropertiesGetter);

484+

registry->Register(ConstructSharedArrayBuffer);

458485

}

459486460487

void Initialize(Local<Object> target,

@@ -554,9 +581,12 @@ void Initialize(Local<Object> target,

554581

SetMethodNoSideEffect(context, target, "getCallSites", GetCallSites);

555582

SetMethod(context, target, "sleep", Sleep);

556583

SetMethod(context, target, "parseEnv", ParseEnv);

557-558584

SetMethod(

559585

context, target, "arrayBufferViewHasBuffer", ArrayBufferViewHasBuffer);

586+

SetMethod(context,

587+

target,

588+

"constructSharedArrayBuffer",

589+

ConstructSharedArrayBuffer);

560590561591

Local<String> should_abort_on_uncaught_toggle =

562592

FIXED_ONE_BYTE_STRING(env->isolate(), "shouldAbortOnUncaughtToggle");