util: improve text-decoder performance
PR-URL: https://github.com/nodejs/node/pull/45363 Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: Rich Trott <rtrott@gmail.com>
This commit is contained in:
parent
86a5b71dc9
commit
aed55df74b
@ -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);
|
||||
|
@ -513,8 +513,9 @@ SlicedArguments::SlicedArguments(
|
||||
template <typename T, size_t S>
|
||||
ArrayBufferViewContents<T, S>::ArrayBufferViewContents(
|
||||
v8::Local<v8::Value> value) {
|
||||
CHECK(value->IsArrayBufferView());
|
||||
Read(value.As<v8::ArrayBufferView>());
|
||||
DCHECK(value->IsArrayBufferView() || value->IsSharedArrayBuffer() ||
|
||||
value->IsArrayBuffer());
|
||||
ReadValue(value);
|
||||
}
|
||||
|
||||
template <typename T, size_t S>
|
||||
@ -542,6 +543,26 @@ void ArrayBufferViewContents<T, S>::Read(v8::Local<v8::ArrayBufferView> abv) {
|
||||
}
|
||||
}
|
||||
|
||||
template <typename T, size_t S>
|
||||
void ArrayBufferViewContents<T, S>::ReadValue(v8::Local<v8::Value> 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<v8::ArrayBufferView>());
|
||||
} else if (buf->IsArrayBuffer()) {
|
||||
auto ab = buf.As<v8::ArrayBuffer>();
|
||||
length_ = ab->ByteLength();
|
||||
data_ = static_cast<T*>(ab->Data());
|
||||
} else {
|
||||
CHECK(buf->IsSharedArrayBuffer());
|
||||
auto sab = buf.As<v8::SharedArrayBuffer>();
|
||||
length_ = sab->ByteLength();
|
||||
data_ = static_cast<T*>(sab->Data());
|
||||
}
|
||||
}
|
||||
|
||||
// ECMA262 20.1.2.5
|
||||
inline bool IsSafeJsInt(v8::Local<v8::Value> v) {
|
||||
if (!v->IsNumber()) return false;
|
||||
|
@ -506,6 +506,7 @@ class ArrayBufferViewContents {
|
||||
explicit inline ArrayBufferViewContents(v8::Local<v8::Object> value);
|
||||
explicit inline ArrayBufferViewContents(v8::Local<v8::ArrayBufferView> abv);
|
||||
inline void Read(v8::Local<v8::ArrayBufferView> abv);
|
||||
inline void ReadValue(v8::Local<v8::Value> buf);
|
||||
|
||||
inline const T* data() const { return data_; }
|
||||
inline size_t length() const { return length_; }
|
||||
|
Loading…
x
Reference in New Issue
Block a user