From cbc4b735a9fd67548b6e3fbed65f3b2519d82704 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Bargull?= Date: Tue, 24 Aug 2021 09:34:51 +0000 Subject: [PATCH] Bug 1648137 - Part 16: Allow to format non-decimal number strings. r=platform-i18n-reviewers,dminor Remove this Java compatibility restriction to be able to format ranges starting resp. ending at infinity. Differential Revision: https://phabricator.services.mozilla.com/D119756 --- .../bug-1648137-non-finite-decimal.diff | 30 +++++++++++++++++++ intl/icu/source/i18n/number_utils.cpp | 6 ---- intl/update-icu.sh | 1 + 3 files changed, 31 insertions(+), 6 deletions(-) create mode 100644 intl/icu-patches/bug-1648137-non-finite-decimal.diff diff --git a/intl/icu-patches/bug-1648137-non-finite-decimal.diff b/intl/icu-patches/bug-1648137-non-finite-decimal.diff new file mode 100644 index 000000000000..54a781e37627 --- /dev/null +++ b/intl/icu-patches/bug-1648137-non-finite-decimal.diff @@ -0,0 +1,30 @@ +# Allow to support non-finite decimal number strings. +# +# ICU bug: https://unicode-org.atlassian.net/browse/ICU-21675 + +diff --git a/intl/icu/source/i18n/number_utils.cpp b/intl/icu/source/i18n/number_utils.cpp +--- a/intl/icu/source/i18n/number_utils.cpp ++++ b/intl/icu/source/i18n/number_utils.cpp +@@ -175,22 +175,16 @@ void DecNum::_setTo(const char* str, int + if ((fContext.status & DEC_Conversion_syntax) != 0) { + status = U_DECIMAL_NUMBER_SYNTAX_ERROR; + return; + } else if (fContext.status != 0) { + // Not a syntax error, but some other error, like an exponent that is too large. + status = U_UNSUPPORTED_ERROR; + return; + } +- +- // For consistency with Java BigDecimal, no support for DecNum that is NaN or Infinity! +- if (decNumberIsSpecial(fData.getAlias())) { +- status = U_UNSUPPORTED_ERROR; +- return; +- } + } + + void + DecNum::setTo(const uint8_t* bcd, int32_t length, int32_t scale, bool isNegative, UErrorCode& status) { + if (length > kDefaultDigits) { + fData.resize(length, 0); + fContext.digits = length; + } else { diff --git a/intl/icu/source/i18n/number_utils.cpp b/intl/icu/source/i18n/number_utils.cpp index bef7ea6c61f3..17fa0c58ba3d 100644 --- a/intl/icu/source/i18n/number_utils.cpp +++ b/intl/icu/source/i18n/number_utils.cpp @@ -180,12 +180,6 @@ void DecNum::_setTo(const char* str, int32_t maxDigits, UErrorCode& status) { status = U_UNSUPPORTED_ERROR; return; } - - // For consistency with Java BigDecimal, no support for DecNum that is NaN or Infinity! - if (decNumberIsSpecial(fData.getAlias())) { - status = U_UNSUPPORTED_ERROR; - return; - } } void diff --git a/intl/update-icu.sh b/intl/update-icu.sh index 56d692a1d4f4..72e423eeb7b3 100755 --- a/intl/update-icu.sh +++ b/intl/update-icu.sh @@ -62,6 +62,7 @@ for patch in \ bug-1714933-2-locale-basename-memory-leak.diff \ bug-1714933-3-locale-nullptr-deref.diff \ bug-1648137-clear-formatter-number.diff \ + bug-1648137-non-finite-decimal.diff \ ; do echo "Applying local patch $patch" patch -d ${icu_dir}/../../ -p1 --no-backup-if-mismatch < ${icu_dir}/../icu-patches/$patch