Changeset 267500 in webkit
- Timestamp:
- Sep 23, 2020, 2:26:09 PM (6 years ago)
- Location:
- trunk
- Files:
-
- 8 edited
-
JSTests/ChangeLog (modified) (1 diff)
-
JSTests/stress/intl-numberformat.js (modified) (1 diff)
-
JSTests/test262/expectations.yaml (modified) (1 diff)
-
Source/JavaScriptCore/ChangeLog (modified) (1 diff)
-
Source/JavaScriptCore/runtime/CommonIdentifiers.h (modified) (1 diff)
-
Source/JavaScriptCore/runtime/IntlNumberFormat.cpp (modified) (1 diff)
-
Source/JavaScriptCore/runtime/IntlNumberFormatInlines.h (modified) (3 diffs)
-
Source/JavaScriptCore/runtime/IntlPluralRules.cpp (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/JSTests/ChangeLog
r267489 r267500 1 2020-09-23 Yusuke Suzuki <ysuzuki@apple.com> 2 3 [JSC] Intl spec update: handle awkward rounding behavior 4 https://bugs.webkit.org/show_bug.cgi?id=216760 5 6 Reviewed by Ross Kirsling. 7 8 * stress/intl-numberformat.js: 9 * test262/expectations.yaml: 10 1 11 2020-09-23 Caio Lima <ticaiolima@gmail.com> 2 12 -
trunk/JSTests/stress/intl-numberformat.js
r266973 r267500 460 460 shouldBe(Intl.NumberFormat('zh-Hans-CN-u-nu-hanidec').format(123456789n), '一二三,四五六,七八九'); 461 461 shouldBe(Intl.NumberFormat('en', { maximumSignificantDigits: 3 }).format(123456n), '123,000'); 462 463 { 464 let nf = new Intl.NumberFormat('en', { 465 style: 'currency', 466 currency: 'USD', 467 maximumFractionDigits: 1 468 }); 469 shouldBe(nf.resolvedOptions().maximumFractionDigits, 1); 470 shouldBe(nf.resolvedOptions().minimumFractionDigits, 1); 471 shouldBe(nf.format(30.333333333333), `$30.3`); 472 shouldBe(nf.format(30.35), `$30.4`); 473 shouldBe(nf.format(30), `$30.0`); 474 } 475 { 476 let nf = new Intl.NumberFormat('en', { 477 style: 'currency', 478 currency: 'USD', 479 maximumFractionDigits: 0 480 }); 481 shouldBe(nf.resolvedOptions().maximumFractionDigits, 0); 482 shouldBe(nf.resolvedOptions().minimumFractionDigits, 0); 483 shouldBe(nf.format(30.3), `$30`); 484 shouldBe(nf.format(30.5), `$31`); 485 shouldBe(nf.format(30), `$30`); 486 } 487 { 488 let nf = new Intl.NumberFormat('en', { 489 style: 'currency', 490 currency: 'CLF', 491 maximumFractionDigits: 3 492 }); 493 shouldBe(nf.resolvedOptions().maximumFractionDigits, 3); 494 shouldBe(nf.resolvedOptions().minimumFractionDigits, 3); 495 if ($vm.icuVersion() >= 64) { 496 shouldBe([`CLF 30.333`, `CLF 30.333`].includes(nf.format(30.333333333333)), true); 497 shouldBe([`CLF 30.000`, `CLF 30.000`].includes(nf.format(30)), true); 498 } 499 } 500 { 501 let nf = new Intl.NumberFormat('en', { 502 style: 'currency', 503 currency: 'CLF', 504 maximumFractionDigits: 0 505 }); 506 shouldBe(nf.resolvedOptions().maximumFractionDigits, 0); 507 shouldBe(nf.resolvedOptions().minimumFractionDigits, 0); 508 if ($vm.icuVersion() >= 64) { 509 shouldBe([`CLF 30`, `CLF 30`].includes(nf.format(30.333333333333)), true); 510 shouldBe([`CLF 31`, `CLF 31`].includes(nf.format(30.5)), true); 511 shouldBe([`CLF 30`, `CLF 30`].includes(nf.format(30)), true); 512 } 513 } 514 shouldThrow(() => { 515 let nf = new Intl.NumberFormat('en', { 516 style: 'currency', 517 currency: 'CLF', 518 maximumFractionDigits: 0, 519 minimumFractionDigits: 100 520 }); 521 }, RangeError); -
trunk/JSTests/test262/expectations.yaml
r267348 r267500 1471 1471 default: 'Test262Error: "und".minimize() should be "en" Expected SameValue(«en-u-va-posix», «en») to be true' 1472 1472 strict mode: 'Test262Error: "und".minimize() should be "en" Expected SameValue(«en-u-va-posix», «en») to be true' 1473 test/intl402/NumberFormat/dft-currency-mnfd-range-check-mxfd.js: 1474 default: 'Test262Error: Expected a RangeError to be thrown but no exception was thrown at all' 1475 strict mode: 'Test262Error: Expected a RangeError to be thrown but no exception was thrown at all' 1473 1476 test/language/arguments-object/mapped/nonconfigurable-nonenumerable-nonwritable-descriptors-set-by-arguments.js: 1474 1477 default: 'Test262Error: Expected obj[0] to have enumerable:false.' -
trunk/Source/JavaScriptCore/ChangeLog
r267489 r267500 1 2020-09-23 Yusuke Suzuki <ysuzuki@apple.com> 2 3 [JSC] Intl spec update: handle awkward rounding behavior 4 https://bugs.webkit.org/show_bug.cgi?id=216760 5 6 Reviewed by Ross Kirsling. 7 8 This patch supports new spec change of "handle awkward rounding behavior"[1]. 9 This changes minimumFractionDigits / maximumFractionDigits calculation when the specified ones are less than currency-digits. 10 11 [1]: https://github.com/tc39/ecma402/pull/471 12 13 * runtime/CommonIdentifiers.h: 14 * runtime/IntlNumberFormat.cpp: 15 (JSC::IntlNumberFormat::resolvedOptions const): 16 * runtime/IntlNumberFormatInlines.h: 17 (JSC::setNumberFormatDigitOptions): 18 * runtime/IntlPluralRules.cpp: 19 (JSC::IntlPluralRules::resolvedOptions const): 20 1 21 2020-09-23 Caio Lima <ticaiolima@gmail.com> 2 22 -
trunk/Source/JavaScriptCore/runtime/CommonIdentifiers.h
r267186 r267500 154 154 macro(locale) \ 155 155 macro(localeMatcher) \ 156 macro(maximumFractionDigits) \ 157 macro(maximumSignificantDigits) \ 156 158 macro(message) \ 159 macro(minimumFractionDigits) \ 160 macro(minimumIntegerDigits) \ 161 macro(minimumSignificantDigits) \ 157 162 macro(minute) \ 158 163 macro(month) \ -
trunk/Source/JavaScriptCore/runtime/IntlNumberFormat.cpp
r266044 r267500 811 811 break; 812 812 } 813 options->putDirect(vm, Identifier::fromString(vm, "minimumIntegerDigits"), jsNumber(m_minimumIntegerDigits));813 options->putDirect(vm, vm.propertyNames->minimumIntegerDigits, jsNumber(m_minimumIntegerDigits)); 814 814 switch (m_roundingType) { 815 815 case IntlRoundingType::FractionDigits: 816 options->putDirect(vm, Identifier::fromString(vm, "minimumFractionDigits"), jsNumber(m_minimumFractionDigits));817 options->putDirect(vm, Identifier::fromString(vm, "maximumFractionDigits"), jsNumber(m_maximumFractionDigits));816 options->putDirect(vm, vm.propertyNames->minimumFractionDigits, jsNumber(m_minimumFractionDigits)); 817 options->putDirect(vm, vm.propertyNames->maximumFractionDigits, jsNumber(m_maximumFractionDigits)); 818 818 break; 819 819 case IntlRoundingType::SignificantDigits: 820 options->putDirect(vm, Identifier::fromString(vm, "minimumSignificantDigits"), jsNumber(m_minimumSignificantDigits));821 options->putDirect(vm, Identifier::fromString(vm, "maximumSignificantDigits"), jsNumber(m_maximumSignificantDigits));820 options->putDirect(vm, vm.propertyNames->minimumSignificantDigits, jsNumber(m_minimumSignificantDigits)); 821 options->putDirect(vm, vm.propertyNames->maximumSignificantDigits, jsNumber(m_maximumSignificantDigits)); 822 822 break; 823 823 case IntlRoundingType::CompactRounding: -
trunk/Source/JavaScriptCore/runtime/IntlNumberFormatInlines.h
r266655 r267500 39 39 auto scope = DECLARE_THROW_SCOPE(vm); 40 40 41 unsigned minimumIntegerDigits = intlNumberOption(globalObject, options, Identifier::fromString(vm, "minimumIntegerDigits"), 1, 21, 1);41 unsigned minimumIntegerDigits = intlNumberOption(globalObject, options, vm.propertyNames->minimumIntegerDigits, 1, 21, 1); 42 42 RETURN_IF_EXCEPTION(scope, void()); 43 43 44 JSValue minimumFractionDigitsValue = options->get(globalObject, Identifier::fromString(vm, "minimumFractionDigits"));44 JSValue minimumFractionDigitsValue = options->get(globalObject, vm.propertyNames->minimumFractionDigits); 45 45 RETURN_IF_EXCEPTION(scope, void()); 46 46 47 JSValue maximumFractionDigitsValue = options->get(globalObject, Identifier::fromString(vm, "maximumFractionDigits"));47 JSValue maximumFractionDigitsValue = options->get(globalObject, vm.propertyNames->maximumFractionDigits); 48 48 RETURN_IF_EXCEPTION(scope, void()); 49 49 50 JSValue minimumSignificantDigitsValue = options->get(globalObject, Identifier::fromString(vm, "minimumSignificantDigits"));50 JSValue minimumSignificantDigitsValue = options->get(globalObject, vm.propertyNames->minimumSignificantDigits); 51 51 RETURN_IF_EXCEPTION(scope, void()); 52 52 53 JSValue maximumSignificantDigitsValue = options->get(globalObject, Identifier::fromString(vm, "maximumSignificantDigits"));53 JSValue maximumSignificantDigitsValue = options->get(globalObject, vm.propertyNames->maximumSignificantDigits); 54 54 RETURN_IF_EXCEPTION(scope, void()); 55 55 … … 58 58 if (!minimumSignificantDigitsValue.isUndefined() || !maximumSignificantDigitsValue.isUndefined()) { 59 59 intlInstance->m_roundingType = IntlRoundingType::SignificantDigits; 60 unsigned minimumSignificantDigits = intlDefaultNumberOption(globalObject, minimumSignificantDigitsValue, Identifier::fromString(vm, "minimumSignificantDigits"), 1, 21, 1);60 unsigned minimumSignificantDigits = intlDefaultNumberOption(globalObject, minimumSignificantDigitsValue, vm.propertyNames->minimumSignificantDigits, 1, 21, 1); 61 61 RETURN_IF_EXCEPTION(scope, void()); 62 unsigned maximumSignificantDigits = intlDefaultNumberOption(globalObject, maximumSignificantDigitsValue, Identifier::fromString(vm, "maximumSignificantDigits"), minimumSignificantDigits, 21, 21);62 unsigned maximumSignificantDigits = intlDefaultNumberOption(globalObject, maximumSignificantDigitsValue, vm.propertyNames->maximumSignificantDigits, minimumSignificantDigits, 21, 21); 63 63 RETURN_IF_EXCEPTION(scope, void()); 64 64 intlInstance->m_minimumSignificantDigits = minimumSignificantDigits; … … 68 68 69 69 if (!minimumFractionDigitsValue.isUndefined() || !maximumFractionDigitsValue.isUndefined()) { 70 constexpr unsigned undefinedValue = UINT32_MAX; 70 71 intlInstance->m_roundingType = IntlRoundingType::FractionDigits; 71 unsigned minimumFractionDigits = intlDefaultNumberOption(globalObject, minimumFractionDigitsValue, Identifier::fromString(vm, "minimumFractionDigits"), 0, 20, minimumFractionDigitsDefault);72 unsigned specifiedMinimumFractionDigits = intlDefaultNumberOption(globalObject, minimumFractionDigitsValue, vm.propertyNames->minimumFractionDigits, 0, 20, undefinedValue); 72 73 RETURN_IF_EXCEPTION(scope, void()); 73 unsigned maximumFractionDigitsActualDefault = std::max(minimumFractionDigits, maximumFractionDigitsDefault); 74 unsigned maximumFractionDigits = intlDefaultNumberOption(globalObject, maximumFractionDigitsValue, Identifier::fromString(vm, "maximumFractionDigits"), minimumFractionDigits, 20, maximumFractionDigitsActualDefault); 74 unsigned specifiedMaximumFractionDigits = intlDefaultNumberOption(globalObject, maximumFractionDigitsValue, vm.propertyNames->maximumFractionDigits, 0, 20, undefinedValue); 75 75 RETURN_IF_EXCEPTION(scope, void()); 76 if (specifiedMaximumFractionDigits != undefinedValue) 77 minimumFractionDigitsDefault = std::min(minimumFractionDigitsDefault, specifiedMaximumFractionDigits); 78 unsigned minimumFractionDigits = intlDefaultNumberOption(globalObject, (specifiedMinimumFractionDigits == undefinedValue) ? jsUndefined() : jsNumber(specifiedMinimumFractionDigits), vm.propertyNames->minimumFractionDigits, 0, 20, minimumFractionDigitsDefault); 79 RETURN_IF_EXCEPTION(scope, void()); 80 unsigned maximumFractionDigits = intlDefaultNumberOption(globalObject, (specifiedMaximumFractionDigits == undefinedValue) ? jsUndefined() : jsNumber(specifiedMaximumFractionDigits), vm.propertyNames->maximumFractionDigits, 0, 20, std::max(maximumFractionDigitsDefault, minimumFractionDigits)); 81 RETURN_IF_EXCEPTION(scope, void()); 82 if (minimumFractionDigits > maximumFractionDigits) { 83 throwRangeError(globalObject, scope, "Computed minimumFractionDigits is larger than maximumFractionDigits"_s); 84 return; 85 } 76 86 intlInstance->m_minimumFractionDigits = minimumFractionDigits; 77 87 intlInstance->m_maximumFractionDigits = maximumFractionDigits; -
trunk/Source/JavaScriptCore/runtime/IntlPluralRules.cpp
r266031 r267500 152 152 options->putDirect(vm, vm.propertyNames->locale, jsNontrivialString(vm, m_locale)); 153 153 options->putDirect(vm, vm.propertyNames->type, jsNontrivialString(vm, m_type == Type::Ordinal ? "ordinal"_s : "cardinal"_s)); 154 options->putDirect(vm, Identifier::fromString(vm, "minimumIntegerDigits"), jsNumber(m_minimumIntegerDigits));154 options->putDirect(vm, vm.propertyNames->minimumIntegerDigits, jsNumber(m_minimumIntegerDigits)); 155 155 switch (m_roundingType) { 156 156 case IntlRoundingType::FractionDigits: 157 options->putDirect(vm, Identifier::fromString(vm, "minimumFractionDigits"), jsNumber(m_minimumFractionDigits));158 options->putDirect(vm, Identifier::fromString(vm, "maximumFractionDigits"), jsNumber(m_maximumFractionDigits));157 options->putDirect(vm, vm.propertyNames->minimumFractionDigits, jsNumber(m_minimumFractionDigits)); 158 options->putDirect(vm, vm.propertyNames->maximumFractionDigits, jsNumber(m_maximumFractionDigits)); 159 159 break; 160 160 case IntlRoundingType::SignificantDigits: 161 options->putDirect(vm, Identifier::fromString(vm, "minimumSignificantDigits"), jsNumber(m_minimumSignificantDigits));162 options->putDirect(vm, Identifier::fromString(vm, "maximumSignificantDigits"), jsNumber(m_maximumSignificantDigits));161 options->putDirect(vm, vm.propertyNames->minimumSignificantDigits, jsNumber(m_minimumSignificantDigits)); 162 options->putDirect(vm, vm.propertyNames->maximumSignificantDigits, jsNumber(m_maximumSignificantDigits)); 163 163 break; 164 164 default:
Note:
See TracChangeset
for help on using the changeset viewer.