diff --git a/benchmark/util/text-decoder.js b/benchmark/util/text-decoder.js index 1aa60f2dd0bcd6..dd4f02016df077 100644 --- a/benchmark/util/text-decoder.js +++ b/benchmark/util/text-decoder.js @@ -3,7 +3,7 @@ const common = require('../common.js'); const bench = common.createBenchmark(main, { - encoding: ['utf-8', 'windows-1252', 'iso-8859-3'], + encoding: ['utf-8', 'latin1', 'iso-8859-3'], ignoreBOM: [0, 1], fatal: [0, 1], len: [256, 1024 * 16, 1024 * 128], diff --git a/lib/internal/encoding.js b/lib/internal/encoding.js index e054ca4dd5202d..1d4d562dfe35ee 100644 --- a/lib/internal/encoding.js +++ b/lib/internal/encoding.js @@ -28,7 +28,6 @@ const kEncoding = Symbol('encoding'); const kDecoder = Symbol('decoder'); const kFatal = Symbol('kFatal'); const kUTF8FastPath = Symbol('kUTF8FastPath'); -const kLatin1FastPath = Symbol('kLatin1FastPath'); const kIgnoreBOM = Symbol('kIgnoreBOM'); const { @@ -55,7 +54,6 @@ const { encodeIntoResults, encodeUtf8String, decodeUTF8, - decodeLatin1, } = binding; const { Buffer } = require('buffer'); @@ -420,10 +418,9 @@ function makeTextDecoderICU() { this[kFatal] = Boolean(options?.fatal); // Only support fast path for UTF-8. this[kUTF8FastPath] = enc === 'utf-8'; - this[kLatin1FastPath] = enc === 'windows-1252'; this[kHandle] = undefined; - if (!this[kUTF8FastPath] && !this[kLatin1FastPath]) { + if (!this[kUTF8FastPath]) { this.#prepareConverter(); } } @@ -440,16 +437,11 @@ function makeTextDecoderICU() { validateDecoder(this); this[kUTF8FastPath] &&= !(options?.stream); - this[kLatin1FastPath] &&= !(options?.stream); if (this[kUTF8FastPath]) { return decodeUTF8(input, this[kIgnoreBOM], this[kFatal]); } - if (this[kLatin1FastPath]) { - return decodeLatin1(input, this[kIgnoreBOM], this[kFatal]); - } - this.#prepareConverter(); validateObject(options, 'options', kValidateObjectAllowObjectsAndNull); diff --git a/src/encoding_binding.cc b/src/encoding_binding.cc index 877ae8a18f6b8f..ad3674599690c8 100644 --- a/src/encoding_binding.cc +++ b/src/encoding_binding.cc @@ -1,7 +1,6 @@ #include "encoding_binding.h" #include "ada.h" #include "env-inl.h" -#include "node_buffer.h" #include "node_errors.h" #include "node_external_reference.h" #include "simdutf.h" @@ -221,7 +220,6 @@ void BindingData::CreatePerIsolateProperties(IsolateData* isolate_data, SetMethodNoSideEffect(isolate, target, "decodeUTF8", DecodeUTF8); SetMethodNoSideEffect(isolate, target, "toASCII", ToASCII); SetMethodNoSideEffect(isolate, target, "toUnicode", ToUnicode); - SetMethodNoSideEffect(isolate, target, "decodeLatin1", DecodeLatin1); } void BindingData::CreatePerContextProperties(Local target, @@ -239,53 +237,6 @@ void BindingData::RegisterTimerExternalReferences( registry->Register(DecodeUTF8); registry->Register(ToASCII); registry->Register(ToUnicode); - registry->Register(DecodeLatin1); -} - -void BindingData::DecodeLatin1(const FunctionCallbackInfo& args) { - Environment* env = Environment::GetCurrent(args); - - CHECK_GE(args.Length(), 1); - if (!(args[0]->IsArrayBuffer() || args[0]->IsSharedArrayBuffer() || - args[0]->IsArrayBufferView())) { - return node::THROW_ERR_INVALID_ARG_TYPE( - env->isolate(), - "The \"input\" argument must be an instance of ArrayBuffer, " - "SharedArrayBuffer, or ArrayBufferView."); - } - - bool ignore_bom = args[1]->IsTrue(); - bool has_fatal = args[2]->IsTrue(); - - ArrayBufferViewContents buffer(args[0]); - const uint8_t* data = buffer.data(); - size_t length = buffer.length(); - - if (ignore_bom && length > 0 && data[0] == 0xFF) { - data++; - length--; - } - - if (length == 0) { - return args.GetReturnValue().SetEmptyString(); - } - - std::string result(length * 2, '\0'); - - size_t written = simdutf::convert_latin1_to_utf8( - reinterpret_cast(data), length, result.data()); - - if (has_fatal && written == 0) { - return node::THROW_ERR_ENCODING_INVALID_ENCODED_DATA( - env->isolate(), "The encoded data was not valid for encoding latin1"); - } - - std::string_view view(result.c_str(), written); - - Local ret; - if (ToV8Value(env->context(), view, env->isolate()).ToLocal(&ret)) { - args.GetReturnValue().Set(ret); - } } } // namespace encoding_binding diff --git a/src/encoding_binding.h b/src/encoding_binding.h index 97f55394d27641..2690cb74f8a05b 100644 --- a/src/encoding_binding.h +++ b/src/encoding_binding.h @@ -31,7 +31,6 @@ class BindingData : public SnapshotableObject { static void EncodeInto(const v8::FunctionCallbackInfo& args); static void EncodeUtf8String(const v8::FunctionCallbackInfo& args); static void DecodeUTF8(const v8::FunctionCallbackInfo& args); - static void DecodeLatin1(const v8::FunctionCallbackInfo& args); static void ToASCII(const v8::FunctionCallbackInfo& args); static void ToUnicode(const v8::FunctionCallbackInfo& args); diff --git a/test/parallel/test-internal-encoding-binding.js b/test/parallel/test-internal-encoding-binding.js deleted file mode 100644 index b7483bf1d22820..00000000000000 --- a/test/parallel/test-internal-encoding-binding.js +++ /dev/null @@ -1,48 +0,0 @@ -// Flags: --expose-internals - -'use strict'; - -require('../common'); - -const assert = require('node:assert'); -const { internalBinding } = require('internal/test/binding'); -const binding = internalBinding('encoding_binding'); - -{ - // Valid input - const buf = Uint8Array.from([0xC1, 0xE9, 0xF3]); - assert.strictEqual(binding.decodeLatin1(buf, false, false), 'Áéó'); -} - -{ - // Empty input - const buf = Uint8Array.from([]); - assert.strictEqual(binding.decodeLatin1(buf, false, false), ''); -} - -{ - // Invalid input, but Latin1 has no invalid chars and should never throw. - const buf = new TextEncoder().encode('Invalid Latin1 🧑‍🧑‍🧒‍🧒'); - assert.strictEqual( - binding.decodeLatin1(buf, false, false), - 'Invalid Latin1 ð\x9F§\x91â\x80\x8Dð\x9F§\x91â\x80\x8Dð\x9F§\x92â\x80\x8Dð\x9F§\x92' - ); -} - -{ - // IgnoreBOM with BOM - const buf = Uint8Array.from([0xFE, 0xFF, 0xC1, 0xE9, 0xF3]); - assert.strictEqual(binding.decodeLatin1(buf, true, false), 'þÿÁéó'); -} - -{ - // Fatal and InvalidInput, but Latin1 has no invalid chars and should never throw. - const buf = Uint8Array.from([0xFF, 0xFF, 0xFF]); - assert.strictEqual(binding.decodeLatin1(buf, false, true), 'ÿÿÿ'); -} - -{ - // IgnoreBOM and Fatal, but Latin1 has no invalid chars and should never throw. - const buf = Uint8Array.from([0xFE, 0xFF, 0xC1, 0xE9, 0xF3]); - assert.strictEqual(binding.decodeLatin1(buf, true, true), 'þÿÁéó'); -} diff --git a/typings/internalBinding/encoding_binding.d.ts b/typings/internalBinding/encoding_binding.d.ts index 6e1d48efd81529..0774a21f25e21f 100644 --- a/typings/internalBinding/encoding_binding.d.ts +++ b/typings/internalBinding/encoding_binding.d.ts @@ -4,5 +4,4 @@ export interface EncodingBinding { decodeUTF8(buffer: ArrayBufferView | ArrayBuffer | SharedArrayBuffer, ignoreBOM?: boolean, hasFatal?: boolean): string; toASCII(input: string): string; toUnicode(input: string): string; - decodeLatin1(buffer: ArrayBufferView | ArrayBuffer | SharedArrayBuffer, ignoreBOM?: boolean, hasFatal?: boolean): string; }