src: add internal binding for constructing SharedArrayBuffers · nodejs/node@fdff838
@@ -10,6 +10,7 @@ namespace util {
10101111using v8::ALL_PROPERTIES;
1212using v8::Array;
13+using v8::ArrayBuffer;
1314using v8::ArrayBufferView;
1415using v8::BigInt;
1516using v8::Boolean;
@@ -34,6 +35,7 @@ using v8::ONLY_WRITABLE;
3435using v8::Promise;
3536using v8::PropertyFilter;
3637using v8::Proxy;
38+using v8::SharedArrayBuffer;
3739using v8::SKIP_STRINGS;
3840using v8::SKIP_SYMBOLS;
3941using 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+441467void 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}
459486460487void Initialize(Local<Object> target,
@@ -554,9 +581,12 @@ void Initialize(Local<Object> target,
554581SetMethodNoSideEffect(context, target, "getCallSites", GetCallSites);
555582SetMethod(context, target, "sleep", Sleep);
556583SetMethod(context, target, "parseEnv", ParseEnv);
557-558584SetMethod(
559585 context, target, "arrayBufferViewHasBuffer", ArrayBufferViewHasBuffer);
586+SetMethod(context,
587+ target,
588+"constructSharedArrayBuffer",
589+ ConstructSharedArrayBuffer);
560590561591 Local<String> should_abort_on_uncaught_toggle =
562592FIXED_ONE_BYTE_STRING(env->isolate(), "shouldAbortOnUncaughtToggle");