Chromium Code Reviews| Index: src/runtime/runtime-i18n.cc |
| diff --git a/src/runtime/runtime-i18n.cc b/src/runtime/runtime-i18n.cc |
| index 14974e8ac44195fcd90b7d133d3d50e439bfb7b7..72381877d726c427bf230beb7e479a9fd21b8ce5 100644 |
| --- a/src/runtime/runtime-i18n.cc |
| +++ b/src/runtime/runtime-i18n.cc |
| @@ -59,6 +59,20 @@ const UChar* GetUCharBufferFromFlat(const String::FlatContent& flat, |
| } |
| } |
| +base::SmartArrayPointer<char> GetAsciiCString(Handle<String> src) { |
| + String::FlatContent flat = src->GetFlatContent(); |
| + DCHECK(flat.IsFlat()); |
| + int length = src->length(); |
| + char* dest = NewArray<char>(length + 1); |
| + if (flat.IsOneByte()) { |
| + CopyChars(dest, flat.ToOneByteVector().start(), length); |
| + } else { |
| + CopyChars(dest, flat.ToUC16Vector().start(), length); |
|
Yang
2016/05/30 11:01:49
Do we not care about clamping uc16 characters to c
|
| + } |
| + dest[length] = 0; |
| + return base::SmartArrayPointer<char>(dest); |
| +} |
| + |
| } // namespace |
| RUNTIME_FUNCTION(Runtime_CanonicalizeLanguageTag) { |
| @@ -66,19 +80,21 @@ RUNTIME_FUNCTION(Runtime_CanonicalizeLanguageTag) { |
| Factory* factory = isolate->factory(); |
| DCHECK(args.length() == 1); |
| - CONVERT_ARG_HANDLE_CHECKED(String, locale_id_str, 0); |
| - |
| - v8::String::Utf8Value locale_id(v8::Utils::ToLocal(locale_id_str)); |
| - |
| - // Return value which denotes invalid language tag. |
| - const char* const kInvalidTag = "invalid-tag"; |
| + CONVERT_ARG_HANDLE_CHECKED(String, tag, 0); |
| + // CONVERT_ARG_HANDLE_CHECKED(SeqOneByteString, locale_id_str, 0); |
|
Yang
2016/05/30 11:01:49
Please remove this line.
|
| + tag = String::Flatten(tag); |
| UErrorCode error = U_ZERO_ERROR; |
| char icu_result[ULOC_FULLNAME_CAPACITY]; |
| int icu_length = 0; |
| - |
| - uloc_forLanguageTag(*locale_id, icu_result, ULOC_FULLNAME_CAPACITY, |
| - &icu_length, &error); |
| + { |
| + DisallowHeapAllocation no_gc; |
| + base::SmartArrayPointer<char> locale_id = GetAsciiCString(tag); |
| + uloc_forLanguageTag(locale_id.get(), icu_result, ULOC_FULLNAME_CAPACITY, |
| + &icu_length, &error); |
| + } |
| + // Return value which denotes invalid language tag. |
| + const char* const kInvalidTag = "invalid-tag"; |
| if (U_FAILURE(error) || icu_length == 0) { |
| return *factory->NewStringFromAsciiChecked(kInvalidTag); |
| } |
| @@ -178,26 +194,29 @@ RUNTIME_FUNCTION(Runtime_GetLanguageTagVariants) { |
| Handle<Name> maximized = factory->NewStringFromStaticChars("maximized"); |
| Handle<Name> base = factory->NewStringFromStaticChars("base"); |
| for (unsigned int i = 0; i < length; ++i) { |
| - Handle<Object> locale_id; |
| + Handle<Object> entry; |
| ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
| - isolate, locale_id, JSReceiver::GetElement(isolate, input, i)); |
| - if (!locale_id->IsString()) { |
| + isolate, entry, JSReceiver::GetElement(isolate, input, i)); |
| + if (!entry->IsString()) { |
| return isolate->Throw(*factory->illegal_argument_string()); |
| } |
| - v8::String::Utf8Value utf8_locale_id( |
| - v8::Utils::ToLocal(Handle<String>::cast(locale_id))); |
| - |
| - UErrorCode error = U_ZERO_ERROR; |
| + Handle<String> locale_id = String::Flatten(Handle<String>::cast(entry)); |
| // Convert from BCP47 to ICU format. |
| // de-DE-u-co-phonebk -> de_DE@collation=phonebook |
| char icu_locale[ULOC_FULLNAME_CAPACITY]; |
| int icu_locale_length = 0; |
| - uloc_forLanguageTag(*utf8_locale_id, icu_locale, ULOC_FULLNAME_CAPACITY, |
| - &icu_locale_length, &error); |
| - if (U_FAILURE(error) || icu_locale_length == 0) { |
| - return isolate->Throw(*factory->illegal_argument_string()); |
| + UErrorCode error = U_ZERO_ERROR; |
| + { |
| + DisallowHeapAllocation no_gc; |
| + base::SmartArrayPointer<char> input_locale = GetAsciiCString(locale_id); |
| + |
| + uloc_forLanguageTag(input_locale.get(), icu_locale, |
| + ULOC_FULLNAME_CAPACITY, &icu_locale_length, &error); |
| + if (U_FAILURE(error) || icu_locale_length == 0) { |
| + return isolate->Throw(*factory->illegal_argument_string()); |
| + } |
| } |
| // Maximize the locale. |
| @@ -400,15 +419,22 @@ RUNTIME_FUNCTION(Runtime_InternalDateParse) { |
| CONVERT_ARG_HANDLE_CHECKED(JSObject, date_format_holder, 0); |
| CONVERT_ARG_HANDLE_CHECKED(String, date_string, 1); |
| - v8::String::Utf8Value utf8_date(v8::Utils::ToLocal(date_string)); |
| - icu::UnicodeString u_date(icu::UnicodeString::fromUTF8(*utf8_date)); |
| icu::SimpleDateFormat* date_format = |
| DateFormat::UnpackDateFormat(isolate, date_format_holder); |
| if (!date_format) return isolate->ThrowIllegalOperation(); |
| - |
| - UErrorCode status = U_ZERO_ERROR; |
| - UDate date = date_format->parse(u_date, status); |
| - if (U_FAILURE(status)) return isolate->heap()->undefined_value(); |
| + date_string = String::Flatten(date_string); |
| + UDate date; |
| + { |
| + DisallowHeapAllocation no_gc; |
| + String::FlatContent flat = date_string->GetFlatContent(); |
| + base::SmartArrayPointer<uc16> sap; |
| + int length = date_string->length(); |
| + icu::UnicodeString u_date(false, GetUCharBufferFromFlat(flat, &sap, length), |
| + length); |
| + UErrorCode status = U_ZERO_ERROR; |
| + date = date_format->parse(u_date, status); |
| + if (U_FAILURE(status)) return isolate->heap()->undefined_value(); |
| + } |
| Handle<JSDate> result; |
| ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |