diff options
Diffstat (limited to 'deps/v8/src/runtime/runtime-intl.cc')
-rw-r--r-- | deps/v8/src/runtime/runtime-intl.cc | 115 |
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 |