summarylogtreecommitdiffstats
path: root/v8-icu68.patch
blob: 98739ea4df12ffebdb0ad7b087cc36ef6e7ed136 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
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.