193 lines
7.0 KiB
Diff
193 lines
7.0 KiB
Diff
|
From b0a7f5691113534c2cf771f2dd3cece5e93bc7d4 Mon Sep 17 00:00:00 2001
|
||
|
From: Frank Tang <ftang@chromium.org>
|
||
|
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 <ftang@chromium.org>
|
||
|
Reviewed-by: Jakob Kummerow <jkummerow@chromium.org>
|
||
|
Reviewed-by: Shu-yu Guo <syg@chromium.org>
|
||
|
Cr-Commit-Position: refs/heads/master@{#70972}
|
||
|
|
||
|
(ported to work with <ICU-68.1 -- https://bugs.gentoo.org/757606)
|
||
|
---
|
||
|
|
||
|
diff --git a/src/objects/js-number-format.cc b/src/objects/js-number-format.cc
|
||
|
index 45b0eab..d18b133 100644
|
||
|
--- a/src/objects/js-number-format.cc
|
||
|
+++ b/src/objects/js-number-format.cc
|
||
|
@@ -389,17 +389,20 @@ Handle<String> CurrencySignString(Isolate* isolate,
|
||
|
Handle<String> 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: "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: "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: "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: "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: "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
|
||
|
+// >=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<std::string>(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:
|
||
|
+ // "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/src/objects/js-relative-time-format.cc b/src/objects/js-relative-time-format.cc
|
||
|
index 267343aaae..64d56a1c12 100644
|
||
|
--- a/src/objects/js-relative-time-format.cc
|
||
|
+++ b/src/objects/js-relative-time-format.cc
|
||
|
@@ -195,9 +195,18 @@ MaybeHandle<JSRelativeTimeFormat> JSRelativeTimeFormat::New(
|
||
|
}
|
||
|
}
|
||
|
|
||
|
+#if U_ICU_VERSION_MAJOR_NUM < 68
|
||
|
icu::DecimalFormat* decimal_format =
|
||
|
static_cast<icu::DecimalFormat*>(number_format);
|
||
|
decimal_format->setMinimumGroupingDigits(-2);
|
||
|
+#else
|
||
|
+ if (number_format->getDynamicClassID() ==
|
||
|
+ icu::DecimalFormat::getStaticClassID()) {
|
||
|
+ icu::DecimalFormat* decimal_format =
|
||
|
+ static_cast<icu::DecimalFormat*>(number_format);
|
||
|
+ decimal_format->setMinimumGroupingDigits(-2);
|
||
|
+ }
|
||
|
+#endif
|
||
|
|
||
|
// Change UDISPCTX_CAPITALIZATION_NONE to other values if
|
||
|
// ECMA402 later include option to change capitalization.
|