Skip to content

Commit ca3ed36

Browse files
anonrigTrott
authored andcommitted
util: improve text decoder performance
PR-URL: #45388 Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: Santiago Gimeno <santiago.gimeno@gmail.com> Reviewed-By: Rich Trott <rtrott@gmail.com>
1 parent 4107ce0 commit ca3ed36

File tree

3 files changed

+20
-17
lines changed

3 files changed

+20
-17
lines changed

lib/internal/encoding.js

+1-11
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ const {
1818
} = primordials;
1919

2020
const {
21-
ERR_ENCODING_INVALID_ENCODED_DATA,
2221
ERR_ENCODING_NOT_SUPPORTED,
2322
ERR_INVALID_ARG_TYPE,
2423
ERR_INVALID_THIS,
@@ -411,11 +410,6 @@ function makeTextDecoderICU() {
411410

412411
decode(input = empty, options = kEmptyObject) {
413412
validateDecoder(this);
414-
if (!isAnyArrayBuffer(input) && !isArrayBufferView(input)) {
415-
throw new ERR_INVALID_ARG_TYPE('input',
416-
['ArrayBuffer', 'ArrayBufferView'],
417-
input);
418-
}
419413
validateObject(options, 'options', {
420414
nullable: true,
421415
allowArray: true,
@@ -426,11 +420,7 @@ function makeTextDecoderICU() {
426420
if (options !== null)
427421
flags |= options.stream ? 0 : CONVERTER_FLAGS_FLUSH;
428422

429-
const ret = _decode(this[kHandle], input, flags);
430-
if (typeof ret === 'number') {
431-
throw new ERR_ENCODING_INVALID_ENCODED_DATA(this.encoding, ret);
432-
}
433-
return ret;
423+
return _decode(this[kHandle], input, flags, this.encoding);
434424
}
435425
}
436426

src/node_errors.h

+1
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ void OOMErrorHandler(const char* location, const v8::OOMDetails& details);
6060
V(ERR_CRYPTO_JOB_INIT_FAILED, Error) \
6161
V(ERR_DLOPEN_DISABLED, Error) \
6262
V(ERR_DLOPEN_FAILED, Error) \
63+
V(ERR_ENCODING_INVALID_ENCODED_DATA, TypeError) \
6364
V(ERR_EXECUTION_ENVIRONMENT_NOT_AVAILABLE, Error) \
6465
V(ERR_INVALID_ADDRESS, Error) \
6566
V(ERR_INVALID_ARG_VALUE, TypeError) \

src/node_i18n.cc

+18-6
Original file line numberDiff line numberDiff line change
@@ -436,13 +436,25 @@ void ConverterObject::Create(const FunctionCallbackInfo<Value>& args) {
436436
void ConverterObject::Decode(const FunctionCallbackInfo<Value>& args) {
437437
Environment* env = Environment::GetCurrent(args);
438438

439-
CHECK_GE(args.Length(), 3); // Converter, Buffer, Flags
439+
CHECK_GE(args.Length(), 4); // Converter, Buffer, Flags, Encoding
440440

441441
ConverterObject* converter;
442442
ASSIGN_OR_RETURN_UNWRAP(&converter, args[0].As<Object>());
443+
444+
if (!(args[1]->IsArrayBuffer() || args[1]->IsSharedArrayBuffer() ||
445+
args[1]->IsArrayBufferView())) {
446+
return node::THROW_ERR_INVALID_ARG_TYPE(
447+
env->isolate(),
448+
"The \"input\" argument must be an instance of SharedArrayBuffer, "
449+
"ArrayBuffer or ArrayBufferView.");
450+
}
451+
443452
ArrayBufferViewContents<char> input(args[1]);
444453
int flags = args[2]->Uint32Value(env->context()).ToChecked();
445454

455+
CHECK(args[3]->IsString());
456+
Local<String> from_encoding = args[3].As<String>();
457+
446458
UErrorCode status = U_ZERO_ERROR;
447459
MaybeStackBuffer<UChar> result;
448460

@@ -524,14 +536,14 @@ void ConverterObject::Decode(const FunctionCallbackInfo<Value>& args) {
524536
Local<Value> ret;
525537
if (encoded.ToLocal(&ret)) {
526538
args.GetReturnValue().Set(ret);
527-
} else {
528-
args.GetReturnValue().Set(error);
539+
return;
529540
}
530-
531-
return;
532541
}
533542

534-
args.GetReturnValue().Set(status);
543+
node::THROW_ERR_ENCODING_INVALID_ENCODED_DATA(
544+
env->isolate(),
545+
"The encoded data was not valid for encoding %s",
546+
*node::Utf8Value(env->isolate(), from_encoding));
535547
}
536548

537549
ConverterObject::ConverterObject(

0 commit comments

Comments
 (0)