@@ -513,8 +513,9 @@ SlicedArguments::SlicedArguments(
513513template <typename T, size_t S>
514514ArrayBufferViewContents<T, S>::ArrayBufferViewContents(
515515 v8::Local<v8::Value> value) {
516- CHECK (value->IsArrayBufferView ());
517- Read (value.As <v8::ArrayBufferView>());
516+ DCHECK (value->IsArrayBufferView () || value->IsSharedArrayBuffer () ||
517+ value->IsArrayBuffer ());
518+ ReadValue (value);
518519}
519520
520521template <typename T, size_t S>
@@ -542,6 +543,26 @@ void ArrayBufferViewContents<T, S>::Read(v8::Local<v8::ArrayBufferView> abv) {
542543 }
543544}
544545
546+ template <typename T, size_t S>
547+ void ArrayBufferViewContents<T, S>::ReadValue(v8::Local<v8::Value> buf) {
548+ static_assert (sizeof (T) == 1 , " Only supports one-byte data at the moment" );
549+ DCHECK (buf->IsArrayBufferView () || buf->IsSharedArrayBuffer () ||
550+ buf->IsArrayBuffer ());
551+
552+ if (buf->IsArrayBufferView ()) {
553+ Read (buf.As <v8::ArrayBufferView>());
554+ } else if (buf->IsArrayBuffer ()) {
555+ auto ab = buf.As <v8::ArrayBuffer>();
556+ length_ = ab->ByteLength ();
557+ data_ = static_cast <T*>(ab->Data ());
558+ } else {
559+ CHECK (buf->IsSharedArrayBuffer ());
560+ auto sab = buf.As <v8::SharedArrayBuffer>();
561+ length_ = sab->ByteLength ();
562+ data_ = static_cast <T*>(sab->Data ());
563+ }
564+ }
565+
545566// ECMA262 20.1.2.5
546567inline bool IsSafeJsInt (v8::Local<v8::Value> v) {
547568 if (!v->IsNumber ()) return false ;
0 commit comments