@@ -513,8 +513,9 @@ SlicedArguments::SlicedArguments(
513
513
template <typename T, size_t S>
514
514
ArrayBufferViewContents<T, S>::ArrayBufferViewContents(
515
515
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);
518
519
}
519
520
520
521
template <typename T, size_t S>
@@ -542,6 +543,26 @@ void ArrayBufferViewContents<T, S>::Read(v8::Local<v8::ArrayBufferView> abv) {
542
543
}
543
544
}
544
545
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
+
545
566
// ECMA262 20.1.2.5
546
567
inline bool IsSafeJsInt (v8::Local<v8::Value> v) {
547
568
if (!v->IsNumber ()) return false ;
0 commit comments