From 5e1fe3fa3d234e2417cf2606071350f1dbb03a47 Mon Sep 17 00:00:00 2001 From: Ruben Bridgewater Date: Sun, 31 May 2020 18:23:07 +0200 Subject: [PATCH] util: improve getStringWidth performance This makes sure the common path does not normalize the input string. It's only required for characters that are outside of the ASCII range. Signed-off-by: Ruben Bridgewater --- lib/internal/util/inspect.js | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/lib/internal/util/inspect.js b/lib/internal/util/inspect.js index fbc0a4ee2d6b6e..1a8f74b71f88fa 100644 --- a/lib/internal/util/inspect.js +++ b/lib/internal/util/inspect.js @@ -1960,13 +1960,6 @@ function formatWithOptionsInternal(inspectOptions, ...args) { return str; } -function prepareStringForGetStringWidth(str, removeControlChars) { - str = str.normalize('NFC'); - if (removeControlChars) - str = stripVTControlCharacters(str); - return str; -} - if (internalBinding('config').hasIntl) { const icu = internalBinding('icu'); // icu.getStringWidth(string, ambiguousAsFullWidth, expandEmojiSequence) @@ -1977,13 +1970,14 @@ if (internalBinding('config').hasIntl) { getStringWidth = function getStringWidth(str, removeControlChars = true) { let width = 0; - str = prepareStringForGetStringWidth(str, removeControlChars); + if (removeControlChars) + str = stripVTControlCharacters(str); for (let i = 0; i < str.length; i++) { // Try to avoid calling into C++ by first handling the ASCII portion of // the string. If it is fully ASCII, we skip the C++ part. const code = str.charCodeAt(i); if (code >= 127) { - width += icu.getStringWidth(str.slice(i)); + width += icu.getStringWidth(str.slice(i).normalize('NFC')); break; } width += code >= 32 ? 1 : 0; @@ -1997,7 +1991,9 @@ if (internalBinding('config').hasIntl) { getStringWidth = function getStringWidth(str, removeControlChars = true) { let width = 0; - str = prepareStringForGetStringWidth(str, removeControlChars); + if (removeControlChars) + str = stripVTControlCharacters(str); + str = str.normalize('NFC'); for (const char of str) { const code = char.codePointAt(0); if (isFullWidthCodePoint(code)) {