diff options
Diffstat (limited to 'deps/v8/src/runtime/runtime-intl.cc')
-rw-r--r-- | deps/v8/src/runtime/runtime-intl.cc | 399 |
1 files changed, 2 insertions, 397 deletions
diff --git a/deps/v8/src/runtime/runtime-intl.cc b/deps/v8/src/runtime/runtime-intl.cc index ad75952824..32e7a46b6e 100644 --- a/deps/v8/src/runtime/runtime-intl.cc +++ b/deps/v8/src/runtime/runtime-intl.cc @@ -22,8 +22,10 @@ #include "src/objects/intl-objects.h" #include "src/objects/js-array-inl.h" #include "src/objects/js-collator-inl.h" +#include "src/objects/js-date-time-format-inl.h" #include "src/objects/js-list-format-inl.h" #include "src/objects/js-list-format.h" +#include "src/objects/js-number-format-inl.h" #include "src/objects/js-plural-rules-inl.h" #include "src/objects/managed.h" #include "src/runtime/runtime-utils.h" @@ -42,7 +44,6 @@ #include "unicode/numfmt.h" #include "unicode/numsys.h" #include "unicode/plurrule.h" -#include "unicode/rbbi.h" #include "unicode/smpdtfmt.h" #include "unicode/timezone.h" #include "unicode/uchar.h" @@ -77,40 +78,6 @@ RUNTIME_FUNCTION(Runtime_FormatListToParts) { isolate, JSListFormat::FormatListToParts(isolate, list_format, list)); } -RUNTIME_FUNCTION(Runtime_GetNumberOption) { - HandleScope scope(isolate); - DCHECK_EQ(5, args.length()); - CONVERT_ARG_HANDLE_CHECKED(JSReceiver, options, 0); - CONVERT_ARG_HANDLE_CHECKED(String, property, 1); - CONVERT_SMI_ARG_CHECKED(min, 2); - CONVERT_SMI_ARG_CHECKED(max, 3); - CONVERT_SMI_ARG_CHECKED(fallback, 4); - - Maybe<int> num = - Intl::GetNumberOption(isolate, options, property, min, max, fallback); - if (num.IsNothing()) { - return ReadOnlyRoots(isolate).exception(); - } - return Smi::FromInt(num.FromJust()); -} - -RUNTIME_FUNCTION(Runtime_DefaultNumberOption) { - HandleScope scope(isolate); - DCHECK_EQ(5, args.length()); - CONVERT_ARG_HANDLE_CHECKED(Object, value, 0); - CONVERT_SMI_ARG_CHECKED(min, 1); - CONVERT_SMI_ARG_CHECKED(max, 2); - CONVERT_SMI_ARG_CHECKED(fallback, 3); - CONVERT_ARG_HANDLE_CHECKED(String, property, 4); - - Maybe<int> num = - Intl::DefaultNumberOption(isolate, value, min, max, fallback, property); - if (num.IsNothing()) { - return ReadOnlyRoots(isolate).exception(); - } - return Smi::FromInt(num.FromJust()); -} - // ECMA 402 6.2.3 RUNTIME_FUNCTION(Runtime_CanonicalizeLanguageTag) { HandleScope scope(isolate); @@ -143,340 +110,6 @@ RUNTIME_FUNCTION(Runtime_GetDefaultICULocale) { Intl::DefaultLocale(isolate).c_str()); } -RUNTIME_FUNCTION(Runtime_IsWellFormedCurrencyCode) { - HandleScope scope(isolate); - DCHECK_EQ(1, args.length()); - CONVERT_ARG_HANDLE_CHECKED(String, currency, 0); - return *(isolate->factory()->ToBoolean( - Intl::IsWellFormedCurrencyCode(isolate, currency))); -} - -RUNTIME_FUNCTION(Runtime_DefineWEProperty) { - HandleScope scope(isolate); - - DCHECK_EQ(3, args.length()); - CONVERT_ARG_HANDLE_CHECKED(JSObject, target, 0); - CONVERT_ARG_HANDLE_CHECKED(Name, key, 1); - CONVERT_ARG_HANDLE_CHECKED(Object, value, 2); - Intl::DefineWEProperty(isolate, target, key, value); - return ReadOnlyRoots(isolate).undefined_value(); -} - -RUNTIME_FUNCTION(Runtime_IsInitializedIntlObjectOfType) { - HandleScope scope(isolate); - - DCHECK_EQ(2, args.length()); - - CONVERT_ARG_HANDLE_CHECKED(Object, input, 0); - CONVERT_SMI_ARG_CHECKED(expected_type_int, 1); - - Intl::Type expected_type = Intl::TypeFromInt(expected_type_int); - - return isolate->heap()->ToBoolean( - Intl::IsObjectOfType(isolate, input, expected_type)); -} - -RUNTIME_FUNCTION(Runtime_MarkAsInitializedIntlObjectOfType) { - HandleScope scope(isolate); - - DCHECK_EQ(2, args.length()); - - CONVERT_ARG_HANDLE_CHECKED(JSObject, input, 0); - 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(isolate, input, marker, type, LanguageMode::kStrict) - .Assert(); - - return ReadOnlyRoots(isolate).undefined_value(); -} - -RUNTIME_FUNCTION(Runtime_CreateDateTimeFormat) { - HandleScope scope(isolate); - - DCHECK_EQ(3, args.length()); - - CONVERT_ARG_HANDLE_CHECKED(String, locale, 0); - CONVERT_ARG_HANDLE_CHECKED(JSObject, options, 1); - CONVERT_ARG_HANDLE_CHECKED(JSObject, resolved, 2); - - Handle<JSFunction> constructor( - isolate->native_context()->intl_date_time_format_function(), isolate); - - Handle<JSObject> local_object; - ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, local_object, - JSObject::New(constructor, constructor)); - - // Set date time formatter as embedder field of the resulting JS object. - icu::SimpleDateFormat* date_format = - DateFormat::InitializeDateTimeFormat(isolate, locale, options, resolved); - CHECK_NOT_NULL(date_format); - - local_object->SetEmbedderField(DateFormat::kSimpleDateFormatIndex, - reinterpret_cast<Smi*>(date_format)); - - // Make object handle weak so we can delete the data format once GC kicks in. - Handle<Object> wrapper = isolate->global_handles()->Create(*local_object); - GlobalHandles::MakeWeak(wrapper.location(), wrapper.location(), - DateFormat::DeleteDateFormat, - WeakCallbackType::kInternalFields); - return *local_object; -} - -RUNTIME_FUNCTION(Runtime_CreateNumberFormat) { - HandleScope scope(isolate); - - DCHECK_EQ(3, args.length()); - - CONVERT_ARG_HANDLE_CHECKED(String, locale, 0); - CONVERT_ARG_HANDLE_CHECKED(JSObject, options, 1); - CONVERT_ARG_HANDLE_CHECKED(JSObject, resolved, 2); - RETURN_RESULT_OR_FAILURE( - isolate, Intl::CreateNumberFormat(isolate, locale, options, resolved)); -} - -RUNTIME_FUNCTION(Runtime_CurrencyDigits) { - HandleScope scope(isolate); - DCHECK_EQ(1, args.length()); - CONVERT_ARG_HANDLE_CHECKED(String, currency, 0); - return *Intl::CurrencyDigits(isolate, currency); -} - -RUNTIME_FUNCTION(Runtime_CollatorResolvedOptions) { - HandleScope scope(isolate); - - DCHECK_EQ(1, args.length()); - CONVERT_ARG_HANDLE_CHECKED(Object, collator_obj, 0); - - // 3. If pr does not have an [[InitializedCollator]] internal - // slot, throw a TypeError exception. - if (!collator_obj->IsJSCollator()) { - Handle<String> method_str = isolate->factory()->NewStringFromStaticChars( - "Intl.Collator.prototype.resolvedOptions"); - THROW_NEW_ERROR_RETURN_FAILURE( - isolate, NewTypeError(MessageTemplate::kIncompatibleMethodReceiver, - method_str, collator_obj)); - } - - Handle<JSCollator> collator = Handle<JSCollator>::cast(collator_obj); - - return *JSCollator::ResolvedOptions(isolate, collator); -} - -RUNTIME_FUNCTION(Runtime_PluralRulesResolvedOptions) { - HandleScope scope(isolate); - - DCHECK_EQ(1, args.length()); - CONVERT_ARG_HANDLE_CHECKED(Object, plural_rules_obj, 0); - - // 3. If pr does not have an [[InitializedPluralRules]] internal - // slot, throw a TypeError exception. - if (!plural_rules_obj->IsJSPluralRules()) { - Handle<String> method_str = isolate->factory()->NewStringFromStaticChars( - "Intl.PluralRules.prototype.resolvedOptions"); - THROW_NEW_ERROR_RETURN_FAILURE( - isolate, NewTypeError(MessageTemplate::kIncompatibleMethodReceiver, - method_str, plural_rules_obj)); - } - - Handle<JSPluralRules> plural_rules = - Handle<JSPluralRules>::cast(plural_rules_obj); - - return *JSPluralRules::ResolvedOptions(isolate, plural_rules); -} - -RUNTIME_FUNCTION(Runtime_ParseExtension) { - Factory* factory = isolate->factory(); - HandleScope scope(isolate); - DCHECK_EQ(1, args.length()); - CONVERT_ARG_HANDLE_CHECKED(String, extension, 0); - std::map<std::string, std::string> map; - Intl::ParseExtension(isolate, std::string(extension->ToCString().get()), map); - Handle<JSObject> extension_map = - isolate->factory()->NewJSObjectWithNullProto(); - for (std::map<std::string, std::string>::iterator it = map.begin(); - it != map.end(); it++) { - JSObject::AddProperty( - isolate, extension_map, - factory->NewStringFromAsciiChecked(it->first.c_str()), - factory->NewStringFromAsciiChecked(it->second.c_str()), NONE); - } - return *extension_map; -} - -RUNTIME_FUNCTION(Runtime_PluralRulesSelect) { - HandleScope scope(isolate); - - DCHECK_EQ(2, args.length()); - CONVERT_ARG_HANDLE_CHECKED(Object, plural_rules_obj, 0); - CONVERT_ARG_HANDLE_CHECKED(Object, number, 1); - - // 3. If pr does not have an [[InitializedPluralRules]] internal - // slot, throw a TypeError exception. - if (!plural_rules_obj->IsJSPluralRules()) { - Handle<String> method_str = isolate->factory()->NewStringFromStaticChars( - "Intl.PluralRules.prototype.select"); - THROW_NEW_ERROR_RETURN_FAILURE( - isolate, NewTypeError(MessageTemplate::kIncompatibleMethodReceiver, - method_str, plural_rules_obj)); - } - - Handle<JSPluralRules> plural_rules = - Handle<JSPluralRules>::cast(plural_rules_obj); - - // 4. Return ? ResolvePlural(pr, n). - - RETURN_RESULT_OR_FAILURE( - isolate, JSPluralRules::ResolvePlural(isolate, plural_rules, number)); -} - -RUNTIME_FUNCTION(Runtime_CreateBreakIterator) { - HandleScope scope(isolate); - - DCHECK_EQ(3, args.length()); - - CONVERT_ARG_HANDLE_CHECKED(String, locale, 0); - CONVERT_ARG_HANDLE_CHECKED(JSObject, options, 1); - CONVERT_ARG_HANDLE_CHECKED(JSObject, resolved, 2); - - Handle<JSFunction> constructor( - isolate->native_context()->intl_v8_break_iterator_function(), isolate); - - Handle<JSObject> local_object; - ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, local_object, - JSObject::New(constructor, constructor)); - - // Set break iterator as embedder field of the resulting JS object. - icu::BreakIterator* break_iterator = V8BreakIterator::InitializeBreakIterator( - isolate, locale, options, resolved); - CHECK_NOT_NULL(break_iterator); - - if (!break_iterator) return isolate->ThrowIllegalOperation(); - - local_object->SetEmbedderField(V8BreakIterator::kBreakIteratorIndex, - reinterpret_cast<Smi*>(break_iterator)); - // Make sure that the pointer to adopted text is nullptr. - local_object->SetEmbedderField(V8BreakIterator::kUnicodeStringIndex, - static_cast<Smi*>(nullptr)); - - // Make object handle weak so we can delete the break iterator once GC kicks - // in. - Handle<Object> wrapper = isolate->global_handles()->Create(*local_object); - GlobalHandles::MakeWeak(wrapper.location(), wrapper.location(), - V8BreakIterator::DeleteBreakIterator, - WeakCallbackType::kInternalFields); - return *local_object; -} - -RUNTIME_FUNCTION(Runtime_BreakIteratorFirst) { - HandleScope scope(isolate); - - DCHECK_EQ(1, args.length()); - - CONVERT_ARG_HANDLE_CHECKED(JSObject, break_iterator_holder, 0); - - icu::BreakIterator* break_iterator = - V8BreakIterator::UnpackBreakIterator(break_iterator_holder); - CHECK_NOT_NULL(break_iterator); - - return *isolate->factory()->NewNumberFromInt(break_iterator->first()); -} - -RUNTIME_FUNCTION(Runtime_BreakIteratorNext) { - HandleScope scope(isolate); - - DCHECK_EQ(1, args.length()); - - CONVERT_ARG_HANDLE_CHECKED(JSObject, break_iterator_holder, 0); - - icu::BreakIterator* break_iterator = - V8BreakIterator::UnpackBreakIterator(break_iterator_holder); - CHECK_NOT_NULL(break_iterator); - - return *isolate->factory()->NewNumberFromInt(break_iterator->next()); -} - -RUNTIME_FUNCTION(Runtime_BreakIteratorCurrent) { - HandleScope scope(isolate); - - DCHECK_EQ(1, args.length()); - - CONVERT_ARG_HANDLE_CHECKED(JSObject, break_iterator_holder, 0); - - icu::BreakIterator* break_iterator = - V8BreakIterator::UnpackBreakIterator(break_iterator_holder); - CHECK_NOT_NULL(break_iterator); - - return *isolate->factory()->NewNumberFromInt(break_iterator->current()); -} - -RUNTIME_FUNCTION(Runtime_BreakIteratorBreakType) { - HandleScope scope(isolate); - - DCHECK_EQ(1, args.length()); - - CONVERT_ARG_HANDLE_CHECKED(JSObject, break_iterator_holder, 0); - - icu::BreakIterator* break_iterator = - V8BreakIterator::UnpackBreakIterator(break_iterator_holder); - CHECK_NOT_NULL(break_iterator); - - // TODO(cira): Remove cast once ICU fixes base BreakIterator class. - icu::RuleBasedBreakIterator* rule_based_iterator = - static_cast<icu::RuleBasedBreakIterator*>(break_iterator); - int32_t status = rule_based_iterator->getRuleStatus(); - // Keep return values in sync with JavaScript BreakType enum. - 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 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) { - return *isolate->factory()->NewStringFromStaticChars("kana"); - } else if (status >= UBRK_WORD_IDEO && status < UBRK_WORD_IDEO_LIMIT) { - return *isolate->factory()->NewStringFromStaticChars("ideo"); - } else { - return *isolate->factory()->NewStringFromStaticChars("unknown"); - } -} - -RUNTIME_FUNCTION(Runtime_ToLocaleDateTime) { - HandleScope scope(isolate); - - DCHECK_EQ(6, args.length()); - - CONVERT_ARG_HANDLE_CHECKED(Object, date, 0); - CONVERT_ARG_HANDLE_CHECKED(Object, locales, 1); - CONVERT_ARG_HANDLE_CHECKED(Object, options, 2); - CONVERT_ARG_HANDLE_CHECKED(String, required, 3); - CONVERT_ARG_HANDLE_CHECKED(String, defaults, 4); - CONVERT_ARG_HANDLE_CHECKED(String, service, 5); - - RETURN_RESULT_OR_FAILURE( - isolate, DateFormat::ToLocaleDateTime( - isolate, date, locales, options, required->ToCString().get(), - defaults->ToCString().get(), service->ToCString().get())); -} - -RUNTIME_FUNCTION(Runtime_ToDateTimeOptions) { - HandleScope scope(isolate); - DCHECK_EQ(args.length(), 3); - CONVERT_ARG_HANDLE_CHECKED(Object, options, 0); - CONVERT_ARG_HANDLE_CHECKED(String, required, 1); - CONVERT_ARG_HANDLE_CHECKED(String, defaults, 2); - RETURN_RESULT_OR_FAILURE( - isolate, DateFormat::ToDateTimeOptions(isolate, options, - required->ToCString().get(), - defaults->ToCString().get())); -} - RUNTIME_FUNCTION(Runtime_StringToLowerCaseIntl) { HandleScope scope(isolate); DCHECK_EQ(args.length(), 1); @@ -511,33 +144,5 @@ 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)); -} - -RUNTIME_FUNCTION(Runtime_SupportedLocalesOf) { - HandleScope scope(isolate); - - DCHECK_EQ(args.length(), 3); - - CONVERT_ARG_HANDLE_CHECKED(String, service, 0); - CONVERT_ARG_HANDLE_CHECKED(Object, locales, 1); - CONVERT_ARG_HANDLE_CHECKED(Object, options, 2); - - RETURN_RESULT_OR_FAILURE( - isolate, Intl::SupportedLocalesOf(isolate, service, locales, options)); -} - } // namespace internal } // namespace v8 |