diff --git a/src/wutil.cpp b/src/wutil.cpp index 0fee1658e..b9601ba06 100644 --- a/src/wutil.cpp +++ b/src/wutil.cpp @@ -711,13 +711,14 @@ unsigned long long fish_wcstoull(const wchar_t *str, const wchar_t **endptr, int /// Like wcstod(), but wcstod() is enormously expensive on some platforms so this tries to have a /// fast path. double fish_wcstod(const wchar_t *str, wchar_t **endptr) { - // The "fast path." If we're all ASCII, use strtod(). + // The "fast path." If we're all ASCII and we fit inline, use strtod(). char narrow[128]; size_t len = std::wcslen(str); size_t len_plus_0 = 1 + len; - auto is_ascii = [](wchar_t c) { return 0 <= c && c <= 127; }; - if (len_plus_0 <= sizeof narrow && std::all_of(str, str + len, is_ascii)) { + auto is_digit = [](wchar_t c) { return '0' <= c && c <= '9'; }; + if (len_plus_0 <= sizeof narrow && std::all_of(str, str + len, is_digit)) { // Fast path. Copy the string into a local buffer and run strtod() on it. + // We can ignore the locale-taking version because we are limited to ASCII digits. std::copy(str, str + len_plus_0, narrow); char *narrow_endptr = nullptr; double ret = strtod(narrow, endptr ? &narrow_endptr : nullptr);