summaryrefslogtreecommitdiff
path: root/deps/v8/src/runtime/runtime-intl.cc
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/src/runtime/runtime-intl.cc')
-rw-r--r--deps/v8/src/runtime/runtime-intl.cc115
1 files changed, 60 insertions, 55 deletions
diff --git a/deps/v8/src/runtime/runtime-intl.cc b/deps/v8/src/runtime/runtime-intl.cc
index fced753c26..5d39074984 100644
--- a/deps/v8/src/runtime/runtime-intl.cc
+++ b/deps/v8/src/runtime/runtime-intl.cc
@@ -20,6 +20,7 @@
#include "src/intl.h"
#include "src/isolate-inl.h"
#include "src/messages.h"
+#include "src/objects/intl-objects-inl.h"
#include "src/objects/intl-objects.h"
#include "src/utils.h"
@@ -119,6 +120,11 @@ RUNTIME_FUNCTION(Runtime_AvailableLocalesOf) {
// so we should filter from all locales, but it's not clear how; see
// https://ssl.icu-project.org/trac/ticket/12756
available_locales = icu::Locale::getAvailableLocales(count);
+ } else if (service->IsUtf8EqualTo(CStrVector("relativetimeformat"))) {
+ // TODO(ftang): for now just use
+ // icu::NumberFormat::getAvailableLocales(count) until we migrate to
+ // Intl::GetAvailableLocales()
+ available_locales = icu::NumberFormat::getAvailableLocales(count);
} else {
UNREACHABLE();
}
@@ -172,36 +178,18 @@ RUNTIME_FUNCTION(Runtime_GetDefaultICULocale) {
return *factory->NewStringFromStaticChars("und");
}
-RUNTIME_FUNCTION(Runtime_IsInitializedIntlObject) {
- HandleScope scope(isolate);
-
- DCHECK_EQ(1, args.length());
-
- CONVERT_ARG_HANDLE_CHECKED(Object, input, 0);
-
- if (!input->IsJSObject()) return isolate->heap()->false_value();
- Handle<JSObject> obj = Handle<JSObject>::cast(input);
-
- Handle<Symbol> marker = isolate->factory()->intl_initialized_marker_symbol();
- Handle<Object> tag = JSReceiver::GetDataProperty(obj, marker);
- return isolate->heap()->ToBoolean(!tag->IsUndefined(isolate));
-}
-
RUNTIME_FUNCTION(Runtime_IsInitializedIntlObjectOfType) {
HandleScope scope(isolate);
DCHECK_EQ(2, args.length());
CONVERT_ARG_HANDLE_CHECKED(Object, input, 0);
- CONVERT_ARG_HANDLE_CHECKED(String, expected_type, 1);
+ CONVERT_SMI_ARG_CHECKED(expected_type_int, 1);
- if (!input->IsJSObject()) return isolate->heap()->false_value();
- Handle<JSObject> obj = Handle<JSObject>::cast(input);
+ Intl::Type expected_type = Intl::TypeFromInt(expected_type_int);
- Handle<Symbol> marker = isolate->factory()->intl_initialized_marker_symbol();
- Handle<Object> tag = JSReceiver::GetDataProperty(obj, marker);
- return isolate->heap()->ToBoolean(tag->IsString() &&
- String::cast(*tag)->Equals(*expected_type));
+ return isolate->heap()->ToBoolean(
+ Intl::IsObjectOfType(isolate, input, expected_type));
}
RUNTIME_FUNCTION(Runtime_MarkAsInitializedIntlObjectOfType) {
@@ -210,12 +198,19 @@ RUNTIME_FUNCTION(Runtime_MarkAsInitializedIntlObjectOfType) {
DCHECK_EQ(2, args.length());
CONVERT_ARG_HANDLE_CHECKED(JSObject, input, 0);
- CONVERT_ARG_HANDLE_CHECKED(String, type, 1);
+ CONVERT_ARG_HANDLE_CHECKED(Smi, type, 1);
+
+#ifdef DEBUG
+ // TypeFromSmi does correctness checks.
+ Intl::Type type_intl = Intl::TypeFromSmi(*type);
+ USE(type_intl);
+#endif
Handle<Symbol> marker = isolate->factory()->intl_initialized_marker_symbol();
- JSObject::SetProperty(input, marker, type, LanguageMode::kStrict).Assert();
+ JSObject::SetProperty(isolate, input, marker, type, LanguageMode::kStrict)
+ .Assert();
- return isolate->heap()->undefined_value();
+ return ReadOnlyRoots(isolate).undefined_value();
}
RUNTIME_FUNCTION(Runtime_CreateDateTimeFormat) {
@@ -228,7 +223,7 @@ RUNTIME_FUNCTION(Runtime_CreateDateTimeFormat) {
CONVERT_ARG_HANDLE_CHECKED(JSObject, resolved, 2);
Handle<JSFunction> constructor(
- isolate->native_context()->intl_date_time_format_function());
+ isolate->native_context()->intl_date_time_format_function(), isolate);
Handle<JSObject> local_object;
ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, local_object,
@@ -287,7 +282,7 @@ RUNTIME_FUNCTION(Runtime_CreateNumberFormat) {
CONVERT_ARG_HANDLE_CHECKED(JSObject, resolved, 2);
Handle<JSFunction> constructor(
- isolate->native_context()->intl_number_format_function());
+ isolate->native_context()->intl_number_format_function(), isolate);
Handle<JSObject> local_object;
ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, local_object,
@@ -299,7 +294,8 @@ RUNTIME_FUNCTION(Runtime_CreateNumberFormat) {
if (!number_format) return isolate->ThrowIllegalOperation();
- local_object->SetEmbedderField(0, reinterpret_cast<Smi*>(number_format));
+ local_object->SetEmbedderField(NumberFormat::kDecimalFormatIndex,
+ reinterpret_cast<Smi*>(number_format));
Handle<Object> wrapper = isolate->global_handles()->Create(*local_object);
GlobalHandles::MakeWeak(wrapper.location(), wrapper.location(),
@@ -314,22 +310,15 @@ RUNTIME_FUNCTION(Runtime_InternalNumberFormat) {
DCHECK_EQ(2, args.length());
CONVERT_ARG_HANDLE_CHECKED(JSObject, number_format_holder, 0);
- CONVERT_ARG_HANDLE_CHECKED(Object, number, 1);
+ CONVERT_ARG_HANDLE_CHECKED(Object, value, 1);
- Handle<Object> value;
- ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, value, Object::ToNumber(number));
+ Handle<Object> number_obj;
+ ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, number_obj,
+ Object::ToNumber(isolate, value));
- icu::DecimalFormat* number_format =
- NumberFormat::UnpackNumberFormat(isolate, number_format_holder);
- CHECK_NOT_NULL(number_format);
-
- icu::UnicodeString result;
- number_format->format(value->Number(), result);
-
- RETURN_RESULT_OR_FAILURE(
- isolate, isolate->factory()->NewStringFromTwoByte(Vector<const uint16_t>(
- reinterpret_cast<const uint16_t*>(result.getBuffer()),
- result.length())));
+ double number = number_obj->Number();
+ RETURN_RESULT_OR_FAILURE(isolate, NumberFormat::FormatNumber(
+ isolate, number_format_holder, number));
}
RUNTIME_FUNCTION(Runtime_CurrencyDigits) {
@@ -359,7 +348,7 @@ RUNTIME_FUNCTION(Runtime_CreateCollator) {
CONVERT_ARG_HANDLE_CHECKED(JSObject, resolved, 2);
Handle<JSFunction> constructor(
- isolate->native_context()->intl_collator_function());
+ isolate->native_context()->intl_collator_function(), isolate);
Handle<JSObject> collator_holder;
ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, collator_holder,
@@ -385,8 +374,8 @@ RUNTIME_FUNCTION(Runtime_InternalCompare) {
icu::Collator* collator = Collator::UnpackCollator(isolate, collator_holder);
CHECK_NOT_NULL(collator);
- string1 = String::Flatten(string1);
- string2 = String::Flatten(string2);
+ string1 = String::Flatten(isolate, string1);
+ string2 = String::Flatten(isolate, string2);
UCollationResult result;
UErrorCode status = U_ZERO_ERROR;
@@ -419,7 +408,7 @@ RUNTIME_FUNCTION(Runtime_CreatePluralRules) {
CONVERT_ARG_HANDLE_CHECKED(JSObject, resolved, 2);
Handle<JSFunction> constructor(
- isolate->native_context()->intl_plural_rules_function());
+ isolate->native_context()->intl_plural_rules_function(), isolate);
Handle<JSObject> local_object;
ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, local_object,
@@ -495,7 +484,7 @@ RUNTIME_FUNCTION(Runtime_CreateBreakIterator) {
CONVERT_ARG_HANDLE_CHECKED(JSObject, resolved, 2);
Handle<JSFunction> constructor(
- isolate->native_context()->intl_v8_break_iterator_function());
+ isolate->native_context()->intl_v8_break_iterator_function(), isolate);
Handle<JSObject> local_object;
ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, local_object,
@@ -537,7 +526,7 @@ RUNTIME_FUNCTION(Runtime_BreakIteratorAdoptText) {
delete u_text;
int length = text->length();
- text = String::Flatten(text);
+ text = String::Flatten(isolate, text);
DisallowHeapAllocation no_gc;
String::FlatContent flat = text->GetFlatContent();
std::unique_ptr<uc16[]> sap;
@@ -547,7 +536,7 @@ RUNTIME_FUNCTION(Runtime_BreakIteratorAdoptText) {
break_iterator->setText(*u_text);
- return isolate->heap()->undefined_value();
+ return ReadOnlyRoots(isolate).undefined_value();
}
RUNTIME_FUNCTION(Runtime_BreakIteratorFirst) {
@@ -611,7 +600,7 @@ RUNTIME_FUNCTION(Runtime_BreakIteratorBreakType) {
if (status >= UBRK_WORD_NONE && status < UBRK_WORD_NONE_LIMIT) {
return *isolate->factory()->NewStringFromStaticChars("none");
} else if (status >= UBRK_WORD_NUMBER && status < UBRK_WORD_NUMBER_LIMIT) {
- return isolate->heap()->number_string();
+ return ReadOnlyRoots(isolate).number_string();
} else if (status >= UBRK_WORD_LETTER && status < UBRK_WORD_LETTER_LIMIT) {
return *isolate->factory()->NewStringFromStaticChars("letter");
} else if (status >= UBRK_WORD_KANA && status < UBRK_WORD_KANA_LIMIT) {
@@ -627,7 +616,7 @@ RUNTIME_FUNCTION(Runtime_StringToLowerCaseIntl) {
HandleScope scope(isolate);
DCHECK_EQ(args.length(), 1);
CONVERT_ARG_HANDLE_CHECKED(String, s, 0);
- s = String::Flatten(s);
+ s = String::Flatten(isolate, s);
return ConvertToLower(s, isolate);
}
@@ -635,7 +624,7 @@ RUNTIME_FUNCTION(Runtime_StringToUpperCaseIntl) {
HandleScope scope(isolate);
DCHECK_EQ(args.length(), 1);
CONVERT_ARG_HANDLE_CHECKED(String, s, 0);
- s = String::Flatten(s);
+ s = String::Flatten(isolate, s);
return ConvertToUpper(s, isolate);
}
@@ -649,8 +638,8 @@ RUNTIME_FUNCTION(Runtime_StringLocaleConvertCase) {
// Primary language tag can be up to 8 characters long in theory.
// https://tools.ietf.org/html/bcp47#section-2.2.1
DCHECK_LE(lang_arg->length(), 8);
- lang_arg = String::Flatten(lang_arg);
- s = String::Flatten(s);
+ lang_arg = String::Flatten(isolate, lang_arg);
+ s = String::Flatten(isolate, s);
// All the languages requiring special-handling have two-letter codes.
// Note that we have to check for '!= 2' here because private-use language
@@ -685,7 +674,8 @@ RUNTIME_FUNCTION(Runtime_StringLocaleConvertCase) {
RUNTIME_FUNCTION(Runtime_DateCacheVersion) {
HandleScope scope(isolate);
DCHECK_EQ(0, args.length());
- if (isolate->serializer_enabled()) return isolate->heap()->undefined_value();
+ if (isolate->serializer_enabled())
+ return ReadOnlyRoots(isolate).undefined_value();
if (!isolate->eternal_handles()->Exists(EternalHandles::DATE_CACHE_VERSION)) {
Handle<FixedArray> date_cache_version =
isolate->factory()->NewFixedArray(1, TENURED);
@@ -699,5 +689,20 @@ RUNTIME_FUNCTION(Runtime_DateCacheVersion) {
return date_cache_version->get(0);
}
+RUNTIME_FUNCTION(Runtime_IntlUnwrapReceiver) {
+ HandleScope scope(isolate);
+ DCHECK_EQ(5, args.length());
+ CONVERT_ARG_HANDLE_CHECKED(JSReceiver, receiver, 0);
+ CONVERT_SMI_ARG_CHECKED(type_int, 1);
+ CONVERT_ARG_HANDLE_CHECKED(JSFunction, constructor, 2);
+ CONVERT_ARG_HANDLE_CHECKED(String, method, 3);
+ CONVERT_BOOLEAN_ARG_CHECKED(check_legacy_constructor, 4);
+
+ RETURN_RESULT_OR_FAILURE(
+ isolate, Intl::UnwrapReceiver(isolate, receiver, constructor,
+ Intl::TypeFromInt(type_int), method,
+ check_legacy_constructor));
+}
+
} // namespace internal
} // namespace v8