diff --git a/lib/internal/encoding.js b/lib/internal/encoding.js index 2ab85d9d9acb06..40c87a0a8719ff 100644 --- a/lib/internal/encoding.js +++ b/lib/internal/encoding.js @@ -411,15 +411,7 @@ function makeTextDecoderICU() { decode(input = empty, options = kEmptyObject) { validateDecoder(this); - if (isAnyArrayBuffer(input)) { - try { - input = lazyBuffer().from(input); - } catch { - // If the buffer is detached, - // use an empty Uint8Array to avoid TypeError - input = empty; - } - } else if (!isArrayBufferView(input)) { + if (!isAnyArrayBuffer(input) && !isArrayBufferView(input)) { throw new ERR_INVALID_ARG_TYPE('input', ['ArrayBuffer', 'ArrayBufferView'], input); diff --git a/src/util-inl.h b/src/util-inl.h index bdf9732e853485..18f829d2775f0d 100644 --- a/src/util-inl.h +++ b/src/util-inl.h @@ -513,8 +513,9 @@ SlicedArguments::SlicedArguments( template ArrayBufferViewContents::ArrayBufferViewContents( v8::Local value) { - CHECK(value->IsArrayBufferView()); - Read(value.As()); + DCHECK(value->IsArrayBufferView() || value->IsSharedArrayBuffer() || + value->IsArrayBuffer()); + ReadValue(value); } template @@ -542,6 +543,26 @@ void ArrayBufferViewContents::Read(v8::Local abv) { } } +template +void ArrayBufferViewContents::ReadValue(v8::Local buf) { + static_assert(sizeof(T) == 1, "Only supports one-byte data at the moment"); + DCHECK(buf->IsArrayBufferView() || buf->IsSharedArrayBuffer() || + buf->IsArrayBuffer()); + + if (buf->IsArrayBufferView()) { + Read(buf.As()); + } else if (buf->IsArrayBuffer()) { + auto ab = buf.As(); + length_ = ab->ByteLength(); + data_ = static_cast(ab->Data()); + } else { + CHECK(buf->IsSharedArrayBuffer()); + auto sab = buf.As(); + length_ = sab->ByteLength(); + data_ = static_cast(sab->Data()); + } +} + // ECMA262 20.1.2.5 inline bool IsSafeJsInt(v8::Local v) { if (!v->IsNumber()) return false; diff --git a/src/util.h b/src/util.h index 0fe821e9fa97ce..7e02c232de4f1b 100644 --- a/src/util.h +++ b/src/util.h @@ -505,6 +505,7 @@ class ArrayBufferViewContents { explicit inline ArrayBufferViewContents(v8::Local value); explicit inline ArrayBufferViewContents(v8::Local abv); inline void Read(v8::Local abv); + inline void ReadValue(v8::Local buf); inline const T* data() const { return data_; } inline size_t length() const { return length_; }