From bb4d150aed2d2f0676293697336e12efbb7d04a7 Mon Sep 17 00:00:00 2001 From: Jarred Sumner Date: Tue, 20 Jan 2026 22:41:14 -0800 Subject: [PATCH] Try using internal string-width in node:readline (#26306) ### What does this PR do? Remove NFKDC normalization and stripVTControlCharacters since Bun.stringWidth does this now ### How did you verify your code works? ci --------- Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> --- src/js/builtins/ConsoleObject.ts | 5 +---- src/js/node/readline.ts | 4 +--- src/string.zig | 15 +++++---------- test/internal/ban-limits.json | 2 +- 4 files changed, 8 insertions(+), 18 deletions(-) diff --git a/src/js/builtins/ConsoleObject.ts b/src/js/builtins/ConsoleObject.ts index f146d8c1e9..74c3a409a3 100644 --- a/src/js/builtins/ConsoleObject.ts +++ b/src/js/builtins/ConsoleObject.ts @@ -172,10 +172,7 @@ export function createConsoleConstructor(console: typeof globalThis.console) { * Returns the number of columns required to display the given string. */ var getStringWidth = function getStringWidth(str, removeControlChars = true) { - if (removeControlChars) str = stripVTControlCharacters(str); - str = StringPrototypeNormalize.$call(str, "NFC"); - - return internalGetStringWidth(str); + return internalGetStringWidth(str, removeControlChars); }; const tableChars = { diff --git a/src/js/node/readline.ts b/src/js/node/readline.ts index 56b75d11b6..81328b378f 100644 --- a/src/js/node/readline.ts +++ b/src/js/node/readline.ts @@ -98,9 +98,7 @@ const ObjectCreate = Object.create; * Returns the number of columns required to display the given string. */ var getStringWidth = function getStringWidth(str, removeControlChars = true) { - if (removeControlChars) str = stripVTControlCharacters(str); - str = StringPrototypeNormalize.$call(str, "NFC"); - return internalGetStringWidth(str); + return internalGetStringWidth(str, removeControlChars); }; const stripANSI = Bun.stripANSI; diff --git a/src/string.zig b/src/string.zig index d9852b0938..b3afd217bf 100644 --- a/src/string.zig +++ b/src/string.zig @@ -1093,20 +1093,15 @@ pub const String = extern struct { extern fn JSC__createRangeError(*jsc.JSGlobalObject, str: *const String) jsc.JSValue; pub fn jsGetStringWidth(globalObject: *jsc.JSGlobalObject, callFrame: *jsc.CallFrame) bun.JSError!jsc.JSValue { - const args = callFrame.arguments_old(1).slice(); + const argument = callFrame.argument(0); + const str = try argument.toJSString(globalObject); + const view = str.view(globalObject); - if (args.len == 0 or !args.ptr[0].isString()) { + if (view.isEmpty()) { return .jsNumber(@as(i32, 0)); } - const str = try args[0].toBunString(globalObject); - defer str.deref(); - - if (str.isEmpty()) { - return .jsNumber(@as(i32, 0)); - } - - const width = str.visibleWidth(false); + const width = bun.String.init(view).visibleWidth(false); return .jsNumber(width); } diff --git a/test/internal/ban-limits.json b/test/internal/ban-limits.json index 3d7f316804..d4e1db49a5 100644 --- a/test/internal/ban-limits.json +++ b/test/internal/ban-limits.json @@ -4,7 +4,7 @@ " catch bun.outOfMemory()": 0, "!= alloc.ptr": 0, "!= allocator.ptr": 0, - ".arguments_old(": 264, + ".arguments_old(": 263, ".jsBoolean(false)": 0, ".jsBoolean(true)": 0, ".stdDir()": 42,