summaryrefslogtreecommitdiff
path: root/deps/v8/src/objects/intl-objects.cc
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/src/objects/intl-objects.cc')
-rw-r--r--deps/v8/src/objects/intl-objects.cc74
1 files changed, 54 insertions, 20 deletions
diff --git a/deps/v8/src/objects/intl-objects.cc b/deps/v8/src/objects/intl-objects.cc
index dfabb29af9..b990a85bed 100644
--- a/deps/v8/src/objects/intl-objects.cc
+++ b/deps/v8/src/objects/intl-objects.cc
@@ -29,6 +29,7 @@
#include "unicode/brkiter.h"
#include "unicode/calendar.h"
#include "unicode/coll.h"
+#include "unicode/datefmt.h"
#include "unicode/decimfmt.h"
#include "unicode/locid.h"
#include "unicode/normalizer2.h"
@@ -254,7 +255,7 @@ MaybeHandle<String> LocaleConvertCase(Isolate* isolate, Handle<String> s,
// Called from TF builtins.
String Intl::ConvertOneByteToLower(String src, String dst) {
DCHECK_EQ(src->length(), dst->length());
- DCHECK(src->HasOnlyOneByteChars());
+ DCHECK(src->IsOneByteRepresentation());
DCHECK(src->IsFlat());
DCHECK(dst->IsSeqOneByteString());
@@ -298,7 +299,7 @@ String Intl::ConvertOneByteToLower(String src, String dst) {
}
MaybeHandle<String> Intl::ConvertToLower(Isolate* isolate, Handle<String> s) {
- if (!s->HasOnlyOneByteChars()) {
+ if (!s->IsOneByteRepresentation()) {
// Use a slower implementation for strings with characters beyond U+00FF.
return LocaleConvertCase(isolate, s, false, "");
}
@@ -330,7 +331,7 @@ MaybeHandle<String> Intl::ConvertToLower(Isolate* isolate, Handle<String> s) {
MaybeHandle<String> Intl::ConvertToUpper(Isolate* isolate, Handle<String> s) {
int32_t length = s->length();
- if (s->HasOnlyOneByteChars() && length > 0) {
+ if (s->IsOneByteRepresentation() && length > 0) {
Handle<SeqOneByteString> result =
isolate->factory()->NewRawOneByteString(length).ToHandleChecked();
@@ -552,7 +553,8 @@ std::string DefaultLocale(Isolate* isolate) {
if (isolate->default_locale().empty()) {
icu::Locale default_locale;
// Translate ICU's fallback locale to a well-known locale.
- if (strcmp(default_locale.getName(), "en_US_POSIX") == 0) {
+ if (strcmp(default_locale.getName(), "en_US_POSIX") == 0 ||
+ strcmp(default_locale.getName(), "c") == 0) {
isolate->set_default_locale("en-US");
} else {
// Set the locale
@@ -729,11 +731,20 @@ Maybe<std::string> Intl::CanonicalizeLanguageTag(Isolate* isolate,
}
std::string locale(locale_str->ToCString().get());
+ return Intl::CanonicalizeLanguageTag(isolate, locale);
+}
+
+Maybe<std::string> Intl::CanonicalizeLanguageTag(Isolate* isolate,
+ const std::string& locale_in) {
+ std::string locale = locale_in;
+
if (locale.length() == 0 ||
!String::IsAscii(locale.data(), static_cast<int>(locale.length()))) {
THROW_NEW_ERROR_RETURN_VALUE(
isolate,
- NewRangeError(MessageTemplate::kInvalidLanguageTag, locale_str),
+ NewRangeError(
+ MessageTemplate::kInvalidLanguageTag,
+ isolate->factory()->NewStringFromAsciiChecked(locale.c_str())),
Nothing<std::string>());
}
@@ -774,18 +785,22 @@ Maybe<std::string> Intl::CanonicalizeLanguageTag(Isolate* isolate,
if (U_FAILURE(error) || icu_locale.isBogus()) {
THROW_NEW_ERROR_RETURN_VALUE(
isolate,
- NewRangeError(MessageTemplate::kInvalidLanguageTag, locale_str),
+ NewRangeError(
+ MessageTemplate::kInvalidLanguageTag,
+ isolate->factory()->NewStringFromAsciiChecked(locale.c_str())),
Nothing<std::string>());
}
Maybe<std::string> maybe_to_language_tag = Intl::ToLanguageTag(icu_locale);
if (maybe_to_language_tag.IsNothing()) {
THROW_NEW_ERROR_RETURN_VALUE(
isolate,
- NewRangeError(MessageTemplate::kInvalidLanguageTag, locale_str),
+ NewRangeError(
+ MessageTemplate::kInvalidLanguageTag,
+ isolate->factory()->NewStringFromAsciiChecked(locale.c_str())),
Nothing<std::string>());
}
- return Intl::ToLanguageTag(icu_locale);
+ return maybe_to_language_tag;
}
Maybe<std::vector<std::string>> Intl::CanonicalizeLocaleList(
@@ -994,11 +1009,14 @@ MaybeHandle<String> Intl::NumberToLocaleString(Isolate* isolate,
Handle<Object> num,
Handle<Object> locales,
Handle<Object> options) {
- Handle<Object> number_obj;
- ASSIGN_RETURN_ON_EXCEPTION(isolate, number_obj,
- Object::ToNumber(isolate, num), String);
-
- double number = number_obj->Number();
+ Handle<Object> numeric_obj;
+ if (FLAG_harmony_intl_bigint) {
+ ASSIGN_RETURN_ON_EXCEPTION(isolate, numeric_obj,
+ Object::ToNumeric(isolate, num), String);
+ } else {
+ ASSIGN_RETURN_ON_EXCEPTION(isolate, numeric_obj,
+ Object::ToNumber(isolate, num), String);
+ }
// We only cache the instance when both locales and options are undefined,
// as that is the only case when the specified side-effects of examining
@@ -1011,8 +1029,8 @@ MaybeHandle<String> Intl::NumberToLocaleString(Isolate* isolate,
Isolate::ICUObjectCacheType::kDefaultNumberFormat));
// We may use the cached icu::NumberFormat for a fast path.
if (cached_number_format != nullptr) {
- return JSNumberFormat::FormatNumber(isolate, *cached_number_format,
- number);
+ return JSNumberFormat::FormatNumeric(isolate, *cached_number_format,
+ numeric_obj);
}
}
@@ -1036,7 +1054,8 @@ MaybeHandle<String> Intl::NumberToLocaleString(Isolate* isolate,
// Return FormatNumber(numberFormat, x).
icu::NumberFormat* icu_number_format =
number_format->icu_number_format()->raw();
- return JSNumberFormat::FormatNumber(isolate, *icu_number_format, number);
+ return JSNumberFormat::FormatNumeric(isolate, *icu_number_format,
+ numeric_obj);
}
namespace {
@@ -1710,9 +1729,9 @@ MaybeHandle<String> Intl::Normalize(Isolate* isolate, Handle<String> string,
// functionality in a straightforward way.
class ICUTimezoneCache : public base::TimezoneCache {
public:
- ICUTimezoneCache() : timezone_(nullptr) { Clear(); }
+ ICUTimezoneCache() : timezone_(nullptr) { Clear(TimeZoneDetection::kSkip); }
- ~ICUTimezoneCache() override { Clear(); };
+ ~ICUTimezoneCache() override { Clear(TimeZoneDetection::kSkip); }
const char* LocalTimezone(double time_ms) override;
@@ -1720,7 +1739,7 @@ class ICUTimezoneCache : public base::TimezoneCache {
double LocalTimeOffset(double time_ms, bool is_utc) override;
- void Clear() override;
+ void Clear(TimeZoneDetection time_zone_detection) override;
private:
icu::TimeZone* GetTimeZone();
@@ -1793,11 +1812,14 @@ double ICUTimezoneCache::LocalTimeOffset(double time_ms, bool is_utc) {
return raw_offset + dst_offset;
}
-void ICUTimezoneCache::Clear() {
+void ICUTimezoneCache::Clear(TimeZoneDetection time_zone_detection) {
delete timezone_;
timezone_ = nullptr;
timezone_name_.clear();
dst_timezone_name_.clear();
+ if (time_zone_detection == TimeZoneDetection::kRedetect) {
+ icu::TimeZone::adoptDefault(icu::TimeZone::detectHostTimeZone());
+ }
}
base::TimezoneCache* Intl::CreateTimeZoneCache() {
@@ -1842,5 +1864,17 @@ Intl::HourCycle Intl::ToHourCycle(const std::string& hc) {
return Intl::HourCycle::kUndefined;
}
+const std::set<std::string>& Intl::GetAvailableLocalesForLocale() {
+ static base::LazyInstance<Intl::AvailableLocales<icu::Locale>>::type
+ available_locales = LAZY_INSTANCE_INITIALIZER;
+ return available_locales.Pointer()->Get();
+}
+
+const std::set<std::string>& Intl::GetAvailableLocalesForDateFormat() {
+ static base::LazyInstance<Intl::AvailableLocales<icu::DateFormat>>::type
+ available_locales = LAZY_INSTANCE_INITIALIZER;
+ return available_locales.Pointer()->Get();
+}
+
} // namespace internal
} // namespace v8