From 89390a6be22beacf7efa84a8ff960966dfcbd0c7 Mon Sep 17 00:00:00 2001 From: Yagiz Nizipli Date: Mon, 7 Nov 2022 09:07:34 -0500 Subject: [PATCH] util: improve text-decoder performance PR-URL: https://github.com/nodejs/node/pull/45363 Reviewed-By: Anna Henningsen Reviewed-By: Rich Trott --- lib/internal/encoding.js | 10 +--------- src/util-inl.h | 25 +++++++++++++++++++++++-- src/util.h | 1 + 3 files changed, 25 insertions(+), 11 deletions(-) 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 7a41eae4aa77df..6094f07f201f2f 100644 --- a/src/util.h +++ b/src/util.h @@ -506,6 +506,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_; }