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) {
|
decode(input = empty, options = kEmptyObject) {
|
||||||
validateDecoder(this);
|
validateDecoder(this);
|
||||||
if (isAnyArrayBuffer(input)) {
|
if (!isAnyArrayBuffer(input) && !isArrayBufferView(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)) {
|
|
||||||
throw new ERR_INVALID_ARG_TYPE('input',
|
throw new ERR_INVALID_ARG_TYPE('input',
|
||||||
['ArrayBuffer', 'ArrayBufferView'],
|
['ArrayBuffer', 'ArrayBufferView'],
|
||||||
input);
|
input);
|
||||||
|
@ -513,8 +513,9 @@ SlicedArguments::SlicedArguments(
|
|||||||
template <typename T, size_t S>
|
template <typename T, size_t S>
|
||||||
ArrayBufferViewContents<T, S>::ArrayBufferViewContents(
|
ArrayBufferViewContents<T, S>::ArrayBufferViewContents(
|
||||||
v8::Local<v8::Value> value) {
|
v8::Local<v8::Value> value) {
|
||||||
CHECK(value->IsArrayBufferView());
|
DCHECK(value->IsArrayBufferView() || value->IsSharedArrayBuffer() ||
|
||||||
Read(value.As<v8::ArrayBufferView>());
|
value->IsArrayBuffer());
|
||||||
|
ReadValue(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T, size_t S>
|
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
|
// ECMA262 20.1.2.5
|
||||||
inline bool IsSafeJsInt(v8::Local<v8::Value> v) {
|
inline bool IsSafeJsInt(v8::Local<v8::Value> v) {
|
||||||
if (!v->IsNumber()) return false;
|
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::Object> value);
|
||||||
explicit inline ArrayBufferViewContents(v8::Local<v8::ArrayBufferView> abv);
|
explicit inline ArrayBufferViewContents(v8::Local<v8::ArrayBufferView> abv);
|
||||||
inline void Read(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 const T* data() const { return data_; }
|
||||||
inline size_t length() const { return length_; }
|
inline size_t length() const { return length_; }
|
||||||
|
Loading…
x
Reference in New Issue
Block a user