From b0a7f5691113534c2cf771f2dd3cece5e93bc7d4 Mon Sep 17 00:00:00 2001 From: Frank Tang Date: Tue, 03 Nov 2020 23:20:37 -0800 Subject: [PATCH] Update to ICU68-1 ICU68-1 change the output skeleton format. So we need to change resolvedOptions code for 68 migration. Chromium roll https://chromium-review.googlesource.com/c/chromium/src/+/2474093 Bug: v8:10945 Change-Id: I3b2c7fbe8abb22df8fa51287c498ca3245b8c55b Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2477431 Commit-Queue: Frank Tang Reviewed-by: Jakob Kummerow Reviewed-by: Shu-yu Guo Cr-Commit-Position: refs/heads/master@{#70972} (ported to work with CurrencySignString(Isolate* isolate, Handle UnitDisplayString(Isolate* isolate, const icu::UnicodeString& skeleton) { // Ex: skeleton as - // "measure-unit/length-meter .### rounding-mode-half-up unit-width-full-name" + // =ICU-68.1: "unit/length-meter .### rounding-mode-half-up unit-width-full-name" if (skeleton.indexOf("unit-width-full-name") >= 0) { return ReadOnlyRoots(isolate).long_string_handle(); } // Ex: skeleton as - // "measure-unit/length-meter .### rounding-mode-half-up unit-width-narrow". + // =ICU-68.1: "unit/length-meter .### rounding-mode-half-up unit-width-narrow". if (skeleton.indexOf("unit-width-narrow") >= 0) { return ReadOnlyRoots(isolate).narrow_string_handle(); } // Ex: skeleton as - // "measure-unit/length-foot .### rounding-mode-half-up" + // =ICU-68.1: "unit/length-foot .### rounding-mode-half-up" return ReadOnlyRoots(isolate).short_string_handle(); } @@ -422,7 +425,8 @@ Notation NotationFromSkeleton(const icu::UnicodeString& skeleton) { return Notation::COMPACT; } // Ex: skeleton as - // "measure-unit/length-foot .### rounding-mode-half-up" + // =ICU-68.1: "unit/length-foot .### rounding-mode-half-up" return Notation::STANDARD; } @@ -562,14 +566,23 @@ namespace { // Ex: percent .### rounding-mode-half-up // Special case for "percent" -// Ex: "measure-unit/length-kilometer per-measure-unit/duration-hour .### -// rounding-mode-half-up" should return "kilometer-per-unit". -// Ex: "measure-unit/duration-year .### rounding-mode-half-up" should return -// "year". +// =ICU-68.1: +// Ex: "unit/milliliter-per-acre .### rounding-mode-half-up" +// should return "milliliter-per-acre". +// Ex: "unit/year .### rounding-mode-half-up" should return +// "year". std::string UnitFromSkeleton(const icu::UnicodeString& skeleton) { std::string str; str = skeleton.toUTF8String(str); +#if U_ICU_VERSION_MAJOR_NUM < 68 std::string search("measure-unit/"); +#else + std::string search("unit/"); +#endif size_t begin = str.find(search); if (begin == str.npos) { // Special case for "percent". @@ -578,20 +591,41 @@ std::string UnitFromSkeleton(const icu::UnicodeString& skeleton) { } return ""; } +#if U_ICU_VERSION_MAJOR_NUM < 68 // Skip the type (ex: "length"). // "measure-unit/length-kilometer per-measure-unit/duration-hour" // b begin = str.find("-", begin + search.size()); +#else + // Ex: + // "unit/acre .### rounding-mode-half-up" + // b + // Ex: + // "unit/milliliter-per-acre .### rounding-mode-half-up" + // b + begin += search.size(); +#endif if (begin == str.npos) { return ""; } +#if U_ICU_VERSION_MAJOR_NUM < 68 begin++; // Skip the '-'. +#endif // Find the end of the subtype. size_t end = str.find(" ", begin); - // "measure-unit/length-kilometer per-measure-unit/duration-hour" - // b e + // =ICU-68.1: + // Ex: + // "unit/acre .### rounding-mode-half-up" + // b e + // Ex: + // "unit/milliliter-per-acre .### rounding-mode-half-up" + // b e if (end == str.npos) { end = str.size(); +#if U_ICU_VERSION_MAJOR_NUM < 68 return str.substr(begin, end - begin); } // "measure-unit/length-kilometer per-measure-unit/duration-hour" @@ -625,17 +659,36 @@ std::string UnitFromSkeleton(const icu::UnicodeString& skeleton) { // "measure-unit/length-kilometer per-measure-unit/duration-hour" // [result ] b e return result + "-per-" + str.substr(begin, end - begin); +#else + } + return str.substr(begin, end - begin); +#endif } Style StyleFromSkeleton(const icu::UnicodeString& skeleton) { if (skeleton.indexOf("currency/") >= 0) { return Style::CURRENCY; } +#if U_ICU_VERSION_MAJOR_NUM < 68 if (skeleton.indexOf("measure-unit/") >= 0) { if (skeleton.indexOf("scale/100") >= 0 && skeleton.indexOf("measure-unit/concentr-percent") >= 0) { +#else + if (skeleton.indexOf("percent") >= 0) { + // percent precision-integer rounding-mode-half-up scale/100 + if (skeleton.indexOf("scale/100") >= 0) { +#endif return Style::PERCENT; +#if U_ICU_VERSION_MAJOR_NUM >= 68 + } else { + return Style::UNIT; +#endif } +#if U_ICU_VERSION_MAJOR_NUM >= 68 + } + // Before ICU68: "measure-unit/", since ICU68 "unit/" + if (skeleton.indexOf("unit/") >= 0) { +#endif return Style::UNIT; } return Style::DECIMAL; diff --git a/v8/src/objects/js-relative-time-format.cc b/v8/src/objects/js-relative-time-format.cc index 267343aaae..64d56a1c12 100644 --- a/v8/src/objects/js-relative-time-format.cc +++ b/v8/src/objects/js-relative-time-format.cc @@ -195,9 +195,18 @@ MaybeHandle JSRelativeTimeFormat::New( } } +#if U_ICU_VERSION_MAJOR_NUM < 68 icu::DecimalFormat* decimal_format = static_cast(number_format); decimal_format->setMinimumGroupingDigits(-2); +#else + if (number_format->getDynamicClassID() == + icu::DecimalFormat::getStaticClassID()) { + icu::DecimalFormat* decimal_format = + static_cast(number_format); + decimal_format->setMinimumGroupingDigits(-2); + } +#endif // Change UDISPCTX_CAPITALIZATION_NONE to other values if // ECMA402 later include option to change capitalization.