From e65b46ba0feca4ec3297fd2d6e35928dcd12d581 Mon Sep 17 00:00:00 2001 From: Moonchild Date: Thu, 19 Oct 2023 15:46:27 +0200 Subject: [PATCH] Issue #2350 - Part 2: Allow "maximumFractionDigits" option in Intl.NumberFormat to be less than the default minimum fraction digits. This implements the changes from the "has consensus" PR in TC39 The second pair of `DefaultNumberOption()` calls was inlined, because only the fallback case is relevant anyway. Steps 12.d and 12.e from the spec PR were combined into a single `if`-block. That way it also matches step 12.f more closely. Also changed the single `if` steps into an `if-else if` chain, because the steps are mutually exclusive. --- js/src/builtin/intl/NumberFormat.js | 29 ++++++++++++++++++++++------- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/js/src/builtin/intl/NumberFormat.js b/js/src/builtin/intl/NumberFormat.js index 495aaa8542..ed0ce47888 100644 --- a/js/src/builtin/intl/NumberFormat.js +++ b/js/src/builtin/intl/NumberFormat.js @@ -170,18 +170,33 @@ function SetNumberFormatDigitOptions(lazyData, options, mnfdDefault, mxfdDefault // Step 12.a (Omitted). // Step 12.b. - mnfd = DefaultNumberOption(mnfd, 0, 20, mnfdDefault); + mnfd = DefaultNumberOption(mnfd, 0, 20, undefined); // Step 12.c. - const mxfdActualDefault = std_Math_max(mnfd, mxfdDefault); + mxfd = DefaultNumberOption(mxfd, 0, 20, undefined); - // Step 12.d. - mxfd = DefaultNumberOption(mxfd, mnfd, 20, mxfdActualDefault); - - // Step 12.e. - lazyData.minimumFractionDigits = mnfd; + // Steps 12.d-e. + // Inlined DefaultNumberOption, only the fallback case applies here. + if (mnfd === undefined) { + assert(mxfd !== undefined, "mxfd isn't undefined when mnfd is undefined"); + mnfd = std_Math_min(mnfdDefault, mxfd); + } // Step 12.f. + // Inlined DefaultNumberOption, only the fallback case applies here. + else if (mxfd === undefined) { + mxfd = std_Math_max(mxfdDefault, mnfd); + } + + // Step 12.g. + else if (mnfd > mxfd) { + ThrowRangeError(JSMSG_INVALID_DIGITS_VALUE, mxfd); + } + + // Step 12.h. + lazyData.minimumFractionDigits = mnfd; + + // Step 12.i. lazyData.maximumFractionDigits = mxfd; }