@@ -10,6 +10,7 @@ namespace util {
1010
1111using 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}
440442
443+ 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 <unsigned >(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}
459486
460487void 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);
560590
561591 Local<String> should_abort_on_uncaught_toggle =
562592 FIXED_ONE_BYTE_STRING (env->isolate (), " shouldAbortOnUncaughtToggle" );
0 commit comments