| OLD | NEW |
| 1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 | 5 |
| 6 #ifdef V8_I18N_SUPPORT | 6 #ifdef V8_I18N_SUPPORT |
| 7 #include "src/runtime/runtime-utils.h" | 7 #include "src/runtime/runtime-utils.h" |
| 8 | 8 |
| 9 #include <memory> | 9 #include <memory> |
| 10 | 10 |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 65 } | 65 } |
| 66 } | 66 } |
| 67 | 67 |
| 68 } // namespace | 68 } // namespace |
| 69 | 69 |
| 70 // ECMA 402 6.2.3 | 70 // ECMA 402 6.2.3 |
| 71 RUNTIME_FUNCTION(Runtime_CanonicalizeLanguageTag) { | 71 RUNTIME_FUNCTION(Runtime_CanonicalizeLanguageTag) { |
| 72 HandleScope scope(isolate); | 72 HandleScope scope(isolate); |
| 73 Factory* factory = isolate->factory(); | 73 Factory* factory = isolate->factory(); |
| 74 | 74 |
| 75 DCHECK(args.length() == 1); | 75 DCHECK_EQ(1, args.length()); |
| 76 CONVERT_ARG_HANDLE_CHECKED(String, locale_id_str, 0); | 76 CONVERT_ARG_HANDLE_CHECKED(String, locale_id_str, 0); |
| 77 | 77 |
| 78 v8::String::Utf8Value locale_id(v8::Utils::ToLocal(locale_id_str)); | 78 v8::String::Utf8Value locale_id(v8::Utils::ToLocal(locale_id_str)); |
| 79 | 79 |
| 80 // Return value which denotes invalid language tag. | 80 // Return value which denotes invalid language tag. |
| 81 // TODO(jshin): Can uloc_{for,to}TanguageTag fail even for structually valid | 81 // TODO(jshin): Can uloc_{for,to}TanguageTag fail even for structually valid |
| 82 // language tags? If not, just add CHECK instead of returning 'invalid-tag'. | 82 // language tags? If not, just add CHECK instead of returning 'invalid-tag'. |
| 83 const char* const kInvalidTag = "invalid-tag"; | 83 const char* const kInvalidTag = "invalid-tag"; |
| 84 | 84 |
| 85 UErrorCode error = U_ZERO_ERROR; | 85 UErrorCode error = U_ZERO_ERROR; |
| (...skipping 16 matching lines...) Expand all Loading... |
| 102 } | 102 } |
| 103 | 103 |
| 104 return *factory->NewStringFromAsciiChecked(result); | 104 return *factory->NewStringFromAsciiChecked(result); |
| 105 } | 105 } |
| 106 | 106 |
| 107 | 107 |
| 108 RUNTIME_FUNCTION(Runtime_AvailableLocalesOf) { | 108 RUNTIME_FUNCTION(Runtime_AvailableLocalesOf) { |
| 109 HandleScope scope(isolate); | 109 HandleScope scope(isolate); |
| 110 Factory* factory = isolate->factory(); | 110 Factory* factory = isolate->factory(); |
| 111 | 111 |
| 112 DCHECK(args.length() == 1); | 112 DCHECK_EQ(1, args.length()); |
| 113 CONVERT_ARG_HANDLE_CHECKED(String, service, 0); | 113 CONVERT_ARG_HANDLE_CHECKED(String, service, 0); |
| 114 | 114 |
| 115 const icu::Locale* available_locales = NULL; | 115 const icu::Locale* available_locales = NULL; |
| 116 int32_t count = 0; | 116 int32_t count = 0; |
| 117 | 117 |
| 118 if (service->IsUtf8EqualTo(CStrVector("collator"))) { | 118 if (service->IsUtf8EqualTo(CStrVector("collator"))) { |
| 119 available_locales = icu::Collator::getAvailableLocales(count); | 119 available_locales = icu::Collator::getAvailableLocales(count); |
| 120 } else if (service->IsUtf8EqualTo(CStrVector("numberformat"))) { | 120 } else if (service->IsUtf8EqualTo(CStrVector("numberformat"))) { |
| 121 available_locales = icu::NumberFormat::getAvailableLocales(count); | 121 available_locales = icu::NumberFormat::getAvailableLocales(count); |
| 122 } else if (service->IsUtf8EqualTo(CStrVector("dateformat"))) { | 122 } else if (service->IsUtf8EqualTo(CStrVector("dateformat"))) { |
| (...skipping 24 matching lines...) Expand all Loading... |
| 147 } | 147 } |
| 148 | 148 |
| 149 return *locales; | 149 return *locales; |
| 150 } | 150 } |
| 151 | 151 |
| 152 | 152 |
| 153 RUNTIME_FUNCTION(Runtime_GetDefaultICULocale) { | 153 RUNTIME_FUNCTION(Runtime_GetDefaultICULocale) { |
| 154 HandleScope scope(isolate); | 154 HandleScope scope(isolate); |
| 155 Factory* factory = isolate->factory(); | 155 Factory* factory = isolate->factory(); |
| 156 | 156 |
| 157 DCHECK(args.length() == 0); | 157 DCHECK_EQ(0, args.length()); |
| 158 | 158 |
| 159 icu::Locale default_locale; | 159 icu::Locale default_locale; |
| 160 | 160 |
| 161 // Set the locale | 161 // Set the locale |
| 162 char result[ULOC_FULLNAME_CAPACITY]; | 162 char result[ULOC_FULLNAME_CAPACITY]; |
| 163 UErrorCode status = U_ZERO_ERROR; | 163 UErrorCode status = U_ZERO_ERROR; |
| 164 uloc_toLanguageTag(default_locale.getName(), result, ULOC_FULLNAME_CAPACITY, | 164 uloc_toLanguageTag(default_locale.getName(), result, ULOC_FULLNAME_CAPACITY, |
| 165 FALSE, &status); | 165 FALSE, &status); |
| 166 if (U_SUCCESS(status)) { | 166 if (U_SUCCESS(status)) { |
| 167 return *factory->NewStringFromAsciiChecked(result); | 167 return *factory->NewStringFromAsciiChecked(result); |
| 168 } | 168 } |
| 169 | 169 |
| 170 return *factory->NewStringFromStaticChars("und"); | 170 return *factory->NewStringFromStaticChars("und"); |
| 171 } | 171 } |
| 172 | 172 |
| 173 | 173 |
| 174 RUNTIME_FUNCTION(Runtime_GetLanguageTagVariants) { | 174 RUNTIME_FUNCTION(Runtime_GetLanguageTagVariants) { |
| 175 HandleScope scope(isolate); | 175 HandleScope scope(isolate); |
| 176 Factory* factory = isolate->factory(); | 176 Factory* factory = isolate->factory(); |
| 177 | 177 |
| 178 DCHECK(args.length() == 1); | 178 DCHECK_EQ(1, args.length()); |
| 179 | 179 |
| 180 CONVERT_ARG_HANDLE_CHECKED(JSArray, input, 0); | 180 CONVERT_ARG_HANDLE_CHECKED(JSArray, input, 0); |
| 181 | 181 |
| 182 uint32_t length = static_cast<uint32_t>(input->length()->Number()); | 182 uint32_t length = static_cast<uint32_t>(input->length()->Number()); |
| 183 // Set some limit to prevent fuzz tests from going OOM. | 183 // Set some limit to prevent fuzz tests from going OOM. |
| 184 // Can be bumped when callers' requirements change. | 184 // Can be bumped when callers' requirements change. |
| 185 if (length >= 100) return isolate->ThrowIllegalOperation(); | 185 if (length >= 100) return isolate->ThrowIllegalOperation(); |
| 186 Handle<FixedArray> output = factory->NewFixedArray(length); | 186 Handle<FixedArray> output = factory->NewFixedArray(length); |
| 187 Handle<Name> maximized = factory->NewStringFromStaticChars("maximized"); | 187 Handle<Name> maximized = factory->NewStringFromStaticChars("maximized"); |
| 188 Handle<Name> base = factory->NewStringFromStaticChars("base"); | 188 Handle<Name> base = factory->NewStringFromStaticChars("base"); |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 252 | 252 |
| 253 Handle<JSArray> result = factory->NewJSArrayWithElements(output); | 253 Handle<JSArray> result = factory->NewJSArrayWithElements(output); |
| 254 result->set_length(Smi::FromInt(length)); | 254 result->set_length(Smi::FromInt(length)); |
| 255 return *result; | 255 return *result; |
| 256 } | 256 } |
| 257 | 257 |
| 258 | 258 |
| 259 RUNTIME_FUNCTION(Runtime_IsInitializedIntlObject) { | 259 RUNTIME_FUNCTION(Runtime_IsInitializedIntlObject) { |
| 260 HandleScope scope(isolate); | 260 HandleScope scope(isolate); |
| 261 | 261 |
| 262 DCHECK(args.length() == 1); | 262 DCHECK_EQ(1, args.length()); |
| 263 | 263 |
| 264 CONVERT_ARG_HANDLE_CHECKED(Object, input, 0); | 264 CONVERT_ARG_HANDLE_CHECKED(Object, input, 0); |
| 265 | 265 |
| 266 if (!input->IsJSObject()) return isolate->heap()->false_value(); | 266 if (!input->IsJSObject()) return isolate->heap()->false_value(); |
| 267 Handle<JSObject> obj = Handle<JSObject>::cast(input); | 267 Handle<JSObject> obj = Handle<JSObject>::cast(input); |
| 268 | 268 |
| 269 Handle<Symbol> marker = isolate->factory()->intl_initialized_marker_symbol(); | 269 Handle<Symbol> marker = isolate->factory()->intl_initialized_marker_symbol(); |
| 270 Handle<Object> tag = JSReceiver::GetDataProperty(obj, marker); | 270 Handle<Object> tag = JSReceiver::GetDataProperty(obj, marker); |
| 271 return isolate->heap()->ToBoolean(!tag->IsUndefined(isolate)); | 271 return isolate->heap()->ToBoolean(!tag->IsUndefined(isolate)); |
| 272 } | 272 } |
| 273 | 273 |
| 274 | 274 |
| 275 RUNTIME_FUNCTION(Runtime_IsInitializedIntlObjectOfType) { | 275 RUNTIME_FUNCTION(Runtime_IsInitializedIntlObjectOfType) { |
| 276 HandleScope scope(isolate); | 276 HandleScope scope(isolate); |
| 277 | 277 |
| 278 DCHECK(args.length() == 2); | 278 DCHECK_EQ(2, args.length()); |
| 279 | 279 |
| 280 CONVERT_ARG_HANDLE_CHECKED(Object, input, 0); | 280 CONVERT_ARG_HANDLE_CHECKED(Object, input, 0); |
| 281 CONVERT_ARG_HANDLE_CHECKED(String, expected_type, 1); | 281 CONVERT_ARG_HANDLE_CHECKED(String, expected_type, 1); |
| 282 | 282 |
| 283 if (!input->IsJSObject()) return isolate->heap()->false_value(); | 283 if (!input->IsJSObject()) return isolate->heap()->false_value(); |
| 284 Handle<JSObject> obj = Handle<JSObject>::cast(input); | 284 Handle<JSObject> obj = Handle<JSObject>::cast(input); |
| 285 | 285 |
| 286 Handle<Symbol> marker = isolate->factory()->intl_initialized_marker_symbol(); | 286 Handle<Symbol> marker = isolate->factory()->intl_initialized_marker_symbol(); |
| 287 Handle<Object> tag = JSReceiver::GetDataProperty(obj, marker); | 287 Handle<Object> tag = JSReceiver::GetDataProperty(obj, marker); |
| 288 return isolate->heap()->ToBoolean(tag->IsString() && | 288 return isolate->heap()->ToBoolean(tag->IsString() && |
| 289 String::cast(*tag)->Equals(*expected_type)); | 289 String::cast(*tag)->Equals(*expected_type)); |
| 290 } | 290 } |
| 291 | 291 |
| 292 | 292 |
| 293 RUNTIME_FUNCTION(Runtime_MarkAsInitializedIntlObjectOfType) { | 293 RUNTIME_FUNCTION(Runtime_MarkAsInitializedIntlObjectOfType) { |
| 294 HandleScope scope(isolate); | 294 HandleScope scope(isolate); |
| 295 | 295 |
| 296 DCHECK(args.length() == 3); | 296 DCHECK_EQ(3, args.length()); |
| 297 | 297 |
| 298 CONVERT_ARG_HANDLE_CHECKED(JSObject, input, 0); | 298 CONVERT_ARG_HANDLE_CHECKED(JSObject, input, 0); |
| 299 CONVERT_ARG_HANDLE_CHECKED(String, type, 1); | 299 CONVERT_ARG_HANDLE_CHECKED(String, type, 1); |
| 300 CONVERT_ARG_HANDLE_CHECKED(JSObject, impl, 2); | 300 CONVERT_ARG_HANDLE_CHECKED(JSObject, impl, 2); |
| 301 | 301 |
| 302 Handle<Symbol> marker = isolate->factory()->intl_initialized_marker_symbol(); | 302 Handle<Symbol> marker = isolate->factory()->intl_initialized_marker_symbol(); |
| 303 JSObject::SetProperty(input, marker, type, STRICT).Assert(); | 303 JSObject::SetProperty(input, marker, type, STRICT).Assert(); |
| 304 | 304 |
| 305 marker = isolate->factory()->intl_impl_object_symbol(); | 305 marker = isolate->factory()->intl_impl_object_symbol(); |
| 306 JSObject::SetProperty(input, marker, impl, STRICT).Assert(); | 306 JSObject::SetProperty(input, marker, impl, STRICT).Assert(); |
| 307 | 307 |
| 308 return isolate->heap()->undefined_value(); | 308 return isolate->heap()->undefined_value(); |
| 309 } | 309 } |
| 310 | 310 |
| 311 | 311 |
| 312 RUNTIME_FUNCTION(Runtime_GetImplFromInitializedIntlObject) { | 312 RUNTIME_FUNCTION(Runtime_GetImplFromInitializedIntlObject) { |
| 313 HandleScope scope(isolate); | 313 HandleScope scope(isolate); |
| 314 | 314 |
| 315 DCHECK(args.length() == 1); | 315 DCHECK_EQ(1, args.length()); |
| 316 | 316 |
| 317 CONVERT_ARG_HANDLE_CHECKED(JSObject, input, 0); | 317 CONVERT_ARG_HANDLE_CHECKED(JSObject, input, 0); |
| 318 | 318 |
| 319 if (!input->IsJSObject()) { | 319 if (!input->IsJSObject()) { |
| 320 THROW_NEW_ERROR_RETURN_FAILURE( | 320 THROW_NEW_ERROR_RETURN_FAILURE( |
| 321 isolate, NewTypeError(MessageTemplate::kNotIntlObject, input)); | 321 isolate, NewTypeError(MessageTemplate::kNotIntlObject, input)); |
| 322 } | 322 } |
| 323 | 323 |
| 324 Handle<JSObject> obj = Handle<JSObject>::cast(input); | 324 Handle<JSObject> obj = Handle<JSObject>::cast(input); |
| 325 | 325 |
| 326 Handle<Symbol> marker = isolate->factory()->intl_impl_object_symbol(); | 326 Handle<Symbol> marker = isolate->factory()->intl_impl_object_symbol(); |
| 327 | 327 |
| 328 Handle<Object> impl = JSReceiver::GetDataProperty(obj, marker); | 328 Handle<Object> impl = JSReceiver::GetDataProperty(obj, marker); |
| 329 if (!impl->IsJSObject()) { | 329 if (!impl->IsJSObject()) { |
| 330 THROW_NEW_ERROR_RETURN_FAILURE( | 330 THROW_NEW_ERROR_RETURN_FAILURE( |
| 331 isolate, NewTypeError(MessageTemplate::kNotIntlObject, obj)); | 331 isolate, NewTypeError(MessageTemplate::kNotIntlObject, obj)); |
| 332 } | 332 } |
| 333 return *impl; | 333 return *impl; |
| 334 } | 334 } |
| 335 | 335 |
| 336 | 336 |
| 337 RUNTIME_FUNCTION(Runtime_CreateDateTimeFormat) { | 337 RUNTIME_FUNCTION(Runtime_CreateDateTimeFormat) { |
| 338 HandleScope scope(isolate); | 338 HandleScope scope(isolate); |
| 339 | 339 |
| 340 DCHECK(args.length() == 3); | 340 DCHECK_EQ(3, args.length()); |
| 341 | 341 |
| 342 CONVERT_ARG_HANDLE_CHECKED(String, locale, 0); | 342 CONVERT_ARG_HANDLE_CHECKED(String, locale, 0); |
| 343 CONVERT_ARG_HANDLE_CHECKED(JSObject, options, 1); | 343 CONVERT_ARG_HANDLE_CHECKED(JSObject, options, 1); |
| 344 CONVERT_ARG_HANDLE_CHECKED(JSObject, resolved, 2); | 344 CONVERT_ARG_HANDLE_CHECKED(JSObject, resolved, 2); |
| 345 | 345 |
| 346 Handle<ObjectTemplateInfo> date_format_template = I18N::GetTemplate(isolate); | 346 Handle<ObjectTemplateInfo> date_format_template = I18N::GetTemplate(isolate); |
| 347 | 347 |
| 348 // Create an empty object wrapper. | 348 // Create an empty object wrapper. |
| 349 Handle<JSObject> local_object; | 349 Handle<JSObject> local_object; |
| 350 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( | 350 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
| (...skipping 18 matching lines...) Expand all Loading... |
| 369 GlobalHandles::MakeWeak(wrapper.location(), wrapper.location(), | 369 GlobalHandles::MakeWeak(wrapper.location(), wrapper.location(), |
| 370 DateFormat::DeleteDateFormat, | 370 DateFormat::DeleteDateFormat, |
| 371 WeakCallbackType::kInternalFields); | 371 WeakCallbackType::kInternalFields); |
| 372 return *local_object; | 372 return *local_object; |
| 373 } | 373 } |
| 374 | 374 |
| 375 | 375 |
| 376 RUNTIME_FUNCTION(Runtime_InternalDateFormat) { | 376 RUNTIME_FUNCTION(Runtime_InternalDateFormat) { |
| 377 HandleScope scope(isolate); | 377 HandleScope scope(isolate); |
| 378 | 378 |
| 379 DCHECK(args.length() == 2); | 379 DCHECK_EQ(2, args.length()); |
| 380 | 380 |
| 381 CONVERT_ARG_HANDLE_CHECKED(JSObject, date_format_holder, 0); | 381 CONVERT_ARG_HANDLE_CHECKED(JSObject, date_format_holder, 0); |
| 382 CONVERT_ARG_HANDLE_CHECKED(JSDate, date, 1); | 382 CONVERT_ARG_HANDLE_CHECKED(JSDate, date, 1); |
| 383 | 383 |
| 384 Handle<Object> value; | 384 Handle<Object> value; |
| 385 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, value, Object::ToNumber(date)); | 385 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, value, Object::ToNumber(date)); |
| 386 | 386 |
| 387 icu::SimpleDateFormat* date_format = | 387 icu::SimpleDateFormat* date_format = |
| 388 DateFormat::UnpackDateFormat(isolate, date_format_holder); | 388 DateFormat::UnpackDateFormat(isolate, date_format_holder); |
| 389 if (!date_format) return isolate->ThrowIllegalOperation(); | 389 if (!date_format) return isolate->ThrowIllegalOperation(); |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 470 isolate, JSObject::AddDataElement(array, index, element, NONE), false); | 470 isolate, JSObject::AddDataElement(array, index, element, NONE), false); |
| 471 return true; | 471 return true; |
| 472 } | 472 } |
| 473 | 473 |
| 474 } // namespace | 474 } // namespace |
| 475 | 475 |
| 476 RUNTIME_FUNCTION(Runtime_InternalDateFormatToParts) { | 476 RUNTIME_FUNCTION(Runtime_InternalDateFormatToParts) { |
| 477 HandleScope scope(isolate); | 477 HandleScope scope(isolate); |
| 478 Factory* factory = isolate->factory(); | 478 Factory* factory = isolate->factory(); |
| 479 | 479 |
| 480 DCHECK(args.length() == 2); | 480 DCHECK_EQ(2, args.length()); |
| 481 | 481 |
| 482 CONVERT_ARG_HANDLE_CHECKED(JSObject, date_format_holder, 0); | 482 CONVERT_ARG_HANDLE_CHECKED(JSObject, date_format_holder, 0); |
| 483 CONVERT_ARG_HANDLE_CHECKED(JSDate, date, 1); | 483 CONVERT_ARG_HANDLE_CHECKED(JSDate, date, 1); |
| 484 | 484 |
| 485 Handle<Object> value; | 485 Handle<Object> value; |
| 486 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, value, Object::ToNumber(date)); | 486 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, value, Object::ToNumber(date)); |
| 487 | 487 |
| 488 icu::SimpleDateFormat* date_format = | 488 icu::SimpleDateFormat* date_format = |
| 489 DateFormat::UnpackDateFormat(isolate, date_format_holder); | 489 DateFormat::UnpackDateFormat(isolate, date_format_holder); |
| 490 if (!date_format) return isolate->ThrowIllegalOperation(); | 490 if (!date_format) return isolate->ThrowIllegalOperation(); |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 526 return isolate->heap()->undefined_value(); | 526 return isolate->heap()->undefined_value(); |
| 527 } | 527 } |
| 528 } | 528 } |
| 529 JSObject::ValidateElements(result); | 529 JSObject::ValidateElements(result); |
| 530 return *result; | 530 return *result; |
| 531 } | 531 } |
| 532 | 532 |
| 533 RUNTIME_FUNCTION(Runtime_CreateNumberFormat) { | 533 RUNTIME_FUNCTION(Runtime_CreateNumberFormat) { |
| 534 HandleScope scope(isolate); | 534 HandleScope scope(isolate); |
| 535 | 535 |
| 536 DCHECK(args.length() == 3); | 536 DCHECK_EQ(3, args.length()); |
| 537 | 537 |
| 538 CONVERT_ARG_HANDLE_CHECKED(String, locale, 0); | 538 CONVERT_ARG_HANDLE_CHECKED(String, locale, 0); |
| 539 CONVERT_ARG_HANDLE_CHECKED(JSObject, options, 1); | 539 CONVERT_ARG_HANDLE_CHECKED(JSObject, options, 1); |
| 540 CONVERT_ARG_HANDLE_CHECKED(JSObject, resolved, 2); | 540 CONVERT_ARG_HANDLE_CHECKED(JSObject, resolved, 2); |
| 541 | 541 |
| 542 Handle<ObjectTemplateInfo> number_format_template = | 542 Handle<ObjectTemplateInfo> number_format_template = |
| 543 I18N::GetTemplate(isolate); | 543 I18N::GetTemplate(isolate); |
| 544 | 544 |
| 545 // Create an empty object wrapper. | 545 // Create an empty object wrapper. |
| 546 Handle<JSObject> local_object; | 546 Handle<JSObject> local_object; |
| (...skipping 18 matching lines...) Expand all Loading... |
| 565 GlobalHandles::MakeWeak(wrapper.location(), wrapper.location(), | 565 GlobalHandles::MakeWeak(wrapper.location(), wrapper.location(), |
| 566 NumberFormat::DeleteNumberFormat, | 566 NumberFormat::DeleteNumberFormat, |
| 567 WeakCallbackType::kInternalFields); | 567 WeakCallbackType::kInternalFields); |
| 568 return *local_object; | 568 return *local_object; |
| 569 } | 569 } |
| 570 | 570 |
| 571 | 571 |
| 572 RUNTIME_FUNCTION(Runtime_InternalNumberFormat) { | 572 RUNTIME_FUNCTION(Runtime_InternalNumberFormat) { |
| 573 HandleScope scope(isolate); | 573 HandleScope scope(isolate); |
| 574 | 574 |
| 575 DCHECK(args.length() == 2); | 575 DCHECK_EQ(2, args.length()); |
| 576 | 576 |
| 577 CONVERT_ARG_HANDLE_CHECKED(JSObject, number_format_holder, 0); | 577 CONVERT_ARG_HANDLE_CHECKED(JSObject, number_format_holder, 0); |
| 578 CONVERT_ARG_HANDLE_CHECKED(Object, number, 1); | 578 CONVERT_ARG_HANDLE_CHECKED(Object, number, 1); |
| 579 | 579 |
| 580 Handle<Object> value; | 580 Handle<Object> value; |
| 581 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, value, Object::ToNumber(number)); | 581 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, value, Object::ToNumber(number)); |
| 582 | 582 |
| 583 icu::DecimalFormat* number_format = | 583 icu::DecimalFormat* number_format = |
| 584 NumberFormat::UnpackNumberFormat(isolate, number_format_holder); | 584 NumberFormat::UnpackNumberFormat(isolate, number_format_holder); |
| 585 if (!number_format) return isolate->ThrowIllegalOperation(); | 585 if (!number_format) return isolate->ThrowIllegalOperation(); |
| 586 | 586 |
| 587 icu::UnicodeString result; | 587 icu::UnicodeString result; |
| 588 number_format->format(value->Number(), result); | 588 number_format->format(value->Number(), result); |
| 589 | 589 |
| 590 RETURN_RESULT_OR_FAILURE( | 590 RETURN_RESULT_OR_FAILURE( |
| 591 isolate, isolate->factory()->NewStringFromTwoByte(Vector<const uint16_t>( | 591 isolate, isolate->factory()->NewStringFromTwoByte(Vector<const uint16_t>( |
| 592 reinterpret_cast<const uint16_t*>(result.getBuffer()), | 592 reinterpret_cast<const uint16_t*>(result.getBuffer()), |
| 593 result.length()))); | 593 result.length()))); |
| 594 } | 594 } |
| 595 | 595 |
| 596 | 596 |
| 597 RUNTIME_FUNCTION(Runtime_CreateCollator) { | 597 RUNTIME_FUNCTION(Runtime_CreateCollator) { |
| 598 HandleScope scope(isolate); | 598 HandleScope scope(isolate); |
| 599 | 599 |
| 600 DCHECK(args.length() == 3); | 600 DCHECK_EQ(3, args.length()); |
| 601 | 601 |
| 602 CONVERT_ARG_HANDLE_CHECKED(String, locale, 0); | 602 CONVERT_ARG_HANDLE_CHECKED(String, locale, 0); |
| 603 CONVERT_ARG_HANDLE_CHECKED(JSObject, options, 1); | 603 CONVERT_ARG_HANDLE_CHECKED(JSObject, options, 1); |
| 604 CONVERT_ARG_HANDLE_CHECKED(JSObject, resolved, 2); | 604 CONVERT_ARG_HANDLE_CHECKED(JSObject, resolved, 2); |
| 605 | 605 |
| 606 Handle<ObjectTemplateInfo> collator_template = I18N::GetTemplate(isolate); | 606 Handle<ObjectTemplateInfo> collator_template = I18N::GetTemplate(isolate); |
| 607 | 607 |
| 608 // Create an empty object wrapper. | 608 // Create an empty object wrapper. |
| 609 Handle<JSObject> local_object; | 609 Handle<JSObject> local_object; |
| 610 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( | 610 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
| (...skipping 16 matching lines...) Expand all Loading... |
| 627 GlobalHandles::MakeWeak(wrapper.location(), wrapper.location(), | 627 GlobalHandles::MakeWeak(wrapper.location(), wrapper.location(), |
| 628 Collator::DeleteCollator, | 628 Collator::DeleteCollator, |
| 629 WeakCallbackType::kInternalFields); | 629 WeakCallbackType::kInternalFields); |
| 630 return *local_object; | 630 return *local_object; |
| 631 } | 631 } |
| 632 | 632 |
| 633 | 633 |
| 634 RUNTIME_FUNCTION(Runtime_InternalCompare) { | 634 RUNTIME_FUNCTION(Runtime_InternalCompare) { |
| 635 HandleScope scope(isolate); | 635 HandleScope scope(isolate); |
| 636 | 636 |
| 637 DCHECK(args.length() == 3); | 637 DCHECK_EQ(3, args.length()); |
| 638 | 638 |
| 639 CONVERT_ARG_HANDLE_CHECKED(JSObject, collator_holder, 0); | 639 CONVERT_ARG_HANDLE_CHECKED(JSObject, collator_holder, 0); |
| 640 CONVERT_ARG_HANDLE_CHECKED(String, string1, 1); | 640 CONVERT_ARG_HANDLE_CHECKED(String, string1, 1); |
| 641 CONVERT_ARG_HANDLE_CHECKED(String, string2, 2); | 641 CONVERT_ARG_HANDLE_CHECKED(String, string2, 2); |
| 642 | 642 |
| 643 icu::Collator* collator = Collator::UnpackCollator(isolate, collator_holder); | 643 icu::Collator* collator = Collator::UnpackCollator(isolate, collator_holder); |
| 644 if (!collator) return isolate->ThrowIllegalOperation(); | 644 if (!collator) return isolate->ThrowIllegalOperation(); |
| 645 | 645 |
| 646 string1 = String::Flatten(string1); | 646 string1 = String::Flatten(string1); |
| 647 string2 = String::Flatten(string2); | 647 string2 = String::Flatten(string2); |
| (...skipping 24 matching lines...) Expand all Loading... |
| 672 static const struct { | 672 static const struct { |
| 673 const char* name; | 673 const char* name; |
| 674 UNormalization2Mode mode; | 674 UNormalization2Mode mode; |
| 675 } normalizationForms[] = { | 675 } normalizationForms[] = { |
| 676 {"nfc", UNORM2_COMPOSE}, | 676 {"nfc", UNORM2_COMPOSE}, |
| 677 {"nfc", UNORM2_DECOMPOSE}, | 677 {"nfc", UNORM2_DECOMPOSE}, |
| 678 {"nfkc", UNORM2_COMPOSE}, | 678 {"nfkc", UNORM2_COMPOSE}, |
| 679 {"nfkc", UNORM2_DECOMPOSE}, | 679 {"nfkc", UNORM2_DECOMPOSE}, |
| 680 }; | 680 }; |
| 681 | 681 |
| 682 DCHECK(args.length() == 2); | 682 DCHECK_EQ(2, args.length()); |
| 683 | 683 |
| 684 CONVERT_ARG_HANDLE_CHECKED(String, s, 0); | 684 CONVERT_ARG_HANDLE_CHECKED(String, s, 0); |
| 685 CONVERT_NUMBER_CHECKED(int, form_id, Int32, args[1]); | 685 CONVERT_NUMBER_CHECKED(int, form_id, Int32, args[1]); |
| 686 CHECK(form_id >= 0 && | 686 CHECK(form_id >= 0 && |
| 687 static_cast<size_t>(form_id) < arraysize(normalizationForms)); | 687 static_cast<size_t>(form_id) < arraysize(normalizationForms)); |
| 688 | 688 |
| 689 int length = s->length(); | 689 int length = s->length(); |
| 690 s = String::Flatten(s); | 690 s = String::Flatten(s); |
| 691 icu::UnicodeString result; | 691 icu::UnicodeString result; |
| 692 std::unique_ptr<uc16[]> sap; | 692 std::unique_ptr<uc16[]> sap; |
| (...skipping 28 matching lines...) Expand all Loading... |
| 721 RETURN_RESULT_OR_FAILURE( | 721 RETURN_RESULT_OR_FAILURE( |
| 722 isolate, isolate->factory()->NewStringFromTwoByte(Vector<const uint16_t>( | 722 isolate, isolate->factory()->NewStringFromTwoByte(Vector<const uint16_t>( |
| 723 reinterpret_cast<const uint16_t*>(result.getBuffer()), | 723 reinterpret_cast<const uint16_t*>(result.getBuffer()), |
| 724 result.length()))); | 724 result.length()))); |
| 725 } | 725 } |
| 726 | 726 |
| 727 | 727 |
| 728 RUNTIME_FUNCTION(Runtime_CreateBreakIterator) { | 728 RUNTIME_FUNCTION(Runtime_CreateBreakIterator) { |
| 729 HandleScope scope(isolate); | 729 HandleScope scope(isolate); |
| 730 | 730 |
| 731 DCHECK(args.length() == 3); | 731 DCHECK_EQ(3, args.length()); |
| 732 | 732 |
| 733 CONVERT_ARG_HANDLE_CHECKED(String, locale, 0); | 733 CONVERT_ARG_HANDLE_CHECKED(String, locale, 0); |
| 734 CONVERT_ARG_HANDLE_CHECKED(JSObject, options, 1); | 734 CONVERT_ARG_HANDLE_CHECKED(JSObject, options, 1); |
| 735 CONVERT_ARG_HANDLE_CHECKED(JSObject, resolved, 2); | 735 CONVERT_ARG_HANDLE_CHECKED(JSObject, resolved, 2); |
| 736 | 736 |
| 737 Handle<ObjectTemplateInfo> break_iterator_template = | 737 Handle<ObjectTemplateInfo> break_iterator_template = |
| 738 I18N::GetTemplate2(isolate); | 738 I18N::GetTemplate2(isolate); |
| 739 | 739 |
| 740 // Create an empty object wrapper. | 740 // Create an empty object wrapper. |
| 741 Handle<JSObject> local_object; | 741 Handle<JSObject> local_object; |
| (...skipping 22 matching lines...) Expand all Loading... |
| 764 GlobalHandles::MakeWeak(wrapper.location(), wrapper.location(), | 764 GlobalHandles::MakeWeak(wrapper.location(), wrapper.location(), |
| 765 BreakIterator::DeleteBreakIterator, | 765 BreakIterator::DeleteBreakIterator, |
| 766 WeakCallbackType::kInternalFields); | 766 WeakCallbackType::kInternalFields); |
| 767 return *local_object; | 767 return *local_object; |
| 768 } | 768 } |
| 769 | 769 |
| 770 | 770 |
| 771 RUNTIME_FUNCTION(Runtime_BreakIteratorAdoptText) { | 771 RUNTIME_FUNCTION(Runtime_BreakIteratorAdoptText) { |
| 772 HandleScope scope(isolate); | 772 HandleScope scope(isolate); |
| 773 | 773 |
| 774 DCHECK(args.length() == 2); | 774 DCHECK_EQ(2, args.length()); |
| 775 | 775 |
| 776 CONVERT_ARG_HANDLE_CHECKED(JSObject, break_iterator_holder, 0); | 776 CONVERT_ARG_HANDLE_CHECKED(JSObject, break_iterator_holder, 0); |
| 777 CONVERT_ARG_HANDLE_CHECKED(String, text, 1); | 777 CONVERT_ARG_HANDLE_CHECKED(String, text, 1); |
| 778 | 778 |
| 779 icu::BreakIterator* break_iterator = | 779 icu::BreakIterator* break_iterator = |
| 780 BreakIterator::UnpackBreakIterator(isolate, break_iterator_holder); | 780 BreakIterator::UnpackBreakIterator(isolate, break_iterator_holder); |
| 781 if (!break_iterator) return isolate->ThrowIllegalOperation(); | 781 if (!break_iterator) return isolate->ThrowIllegalOperation(); |
| 782 | 782 |
| 783 icu::UnicodeString* u_text = reinterpret_cast<icu::UnicodeString*>( | 783 icu::UnicodeString* u_text = reinterpret_cast<icu::UnicodeString*>( |
| 784 break_iterator_holder->GetInternalField(1)); | 784 break_iterator_holder->GetInternalField(1)); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 795 | 795 |
| 796 break_iterator->setText(*u_text); | 796 break_iterator->setText(*u_text); |
| 797 | 797 |
| 798 return isolate->heap()->undefined_value(); | 798 return isolate->heap()->undefined_value(); |
| 799 } | 799 } |
| 800 | 800 |
| 801 | 801 |
| 802 RUNTIME_FUNCTION(Runtime_BreakIteratorFirst) { | 802 RUNTIME_FUNCTION(Runtime_BreakIteratorFirst) { |
| 803 HandleScope scope(isolate); | 803 HandleScope scope(isolate); |
| 804 | 804 |
| 805 DCHECK(args.length() == 1); | 805 DCHECK_EQ(1, args.length()); |
| 806 | 806 |
| 807 CONVERT_ARG_HANDLE_CHECKED(JSObject, break_iterator_holder, 0); | 807 CONVERT_ARG_HANDLE_CHECKED(JSObject, break_iterator_holder, 0); |
| 808 | 808 |
| 809 icu::BreakIterator* break_iterator = | 809 icu::BreakIterator* break_iterator = |
| 810 BreakIterator::UnpackBreakIterator(isolate, break_iterator_holder); | 810 BreakIterator::UnpackBreakIterator(isolate, break_iterator_holder); |
| 811 if (!break_iterator) return isolate->ThrowIllegalOperation(); | 811 if (!break_iterator) return isolate->ThrowIllegalOperation(); |
| 812 | 812 |
| 813 return *isolate->factory()->NewNumberFromInt(break_iterator->first()); | 813 return *isolate->factory()->NewNumberFromInt(break_iterator->first()); |
| 814 } | 814 } |
| 815 | 815 |
| 816 | 816 |
| 817 RUNTIME_FUNCTION(Runtime_BreakIteratorNext) { | 817 RUNTIME_FUNCTION(Runtime_BreakIteratorNext) { |
| 818 HandleScope scope(isolate); | 818 HandleScope scope(isolate); |
| 819 | 819 |
| 820 DCHECK(args.length() == 1); | 820 DCHECK_EQ(1, args.length()); |
| 821 | 821 |
| 822 CONVERT_ARG_HANDLE_CHECKED(JSObject, break_iterator_holder, 0); | 822 CONVERT_ARG_HANDLE_CHECKED(JSObject, break_iterator_holder, 0); |
| 823 | 823 |
| 824 icu::BreakIterator* break_iterator = | 824 icu::BreakIterator* break_iterator = |
| 825 BreakIterator::UnpackBreakIterator(isolate, break_iterator_holder); | 825 BreakIterator::UnpackBreakIterator(isolate, break_iterator_holder); |
| 826 if (!break_iterator) return isolate->ThrowIllegalOperation(); | 826 if (!break_iterator) return isolate->ThrowIllegalOperation(); |
| 827 | 827 |
| 828 return *isolate->factory()->NewNumberFromInt(break_iterator->next()); | 828 return *isolate->factory()->NewNumberFromInt(break_iterator->next()); |
| 829 } | 829 } |
| 830 | 830 |
| 831 | 831 |
| 832 RUNTIME_FUNCTION(Runtime_BreakIteratorCurrent) { | 832 RUNTIME_FUNCTION(Runtime_BreakIteratorCurrent) { |
| 833 HandleScope scope(isolate); | 833 HandleScope scope(isolate); |
| 834 | 834 |
| 835 DCHECK(args.length() == 1); | 835 DCHECK_EQ(1, args.length()); |
| 836 | 836 |
| 837 CONVERT_ARG_HANDLE_CHECKED(JSObject, break_iterator_holder, 0); | 837 CONVERT_ARG_HANDLE_CHECKED(JSObject, break_iterator_holder, 0); |
| 838 | 838 |
| 839 icu::BreakIterator* break_iterator = | 839 icu::BreakIterator* break_iterator = |
| 840 BreakIterator::UnpackBreakIterator(isolate, break_iterator_holder); | 840 BreakIterator::UnpackBreakIterator(isolate, break_iterator_holder); |
| 841 if (!break_iterator) return isolate->ThrowIllegalOperation(); | 841 if (!break_iterator) return isolate->ThrowIllegalOperation(); |
| 842 | 842 |
| 843 return *isolate->factory()->NewNumberFromInt(break_iterator->current()); | 843 return *isolate->factory()->NewNumberFromInt(break_iterator->current()); |
| 844 } | 844 } |
| 845 | 845 |
| 846 | 846 |
| 847 RUNTIME_FUNCTION(Runtime_BreakIteratorBreakType) { | 847 RUNTIME_FUNCTION(Runtime_BreakIteratorBreakType) { |
| 848 HandleScope scope(isolate); | 848 HandleScope scope(isolate); |
| 849 | 849 |
| 850 DCHECK(args.length() == 1); | 850 DCHECK_EQ(1, args.length()); |
| 851 | 851 |
| 852 CONVERT_ARG_HANDLE_CHECKED(JSObject, break_iterator_holder, 0); | 852 CONVERT_ARG_HANDLE_CHECKED(JSObject, break_iterator_holder, 0); |
| 853 | 853 |
| 854 icu::BreakIterator* break_iterator = | 854 icu::BreakIterator* break_iterator = |
| 855 BreakIterator::UnpackBreakIterator(isolate, break_iterator_holder); | 855 BreakIterator::UnpackBreakIterator(isolate, break_iterator_holder); |
| 856 if (!break_iterator) return isolate->ThrowIllegalOperation(); | 856 if (!break_iterator) return isolate->ThrowIllegalOperation(); |
| 857 | 857 |
| 858 // TODO(cira): Remove cast once ICU fixes base BreakIterator class. | 858 // TODO(cira): Remove cast once ICU fixes base BreakIterator class. |
| 859 icu::RuleBasedBreakIterator* rule_based_iterator = | 859 icu::RuleBasedBreakIterator* rule_based_iterator = |
| 860 static_cast<icu::RuleBasedBreakIterator*>(break_iterator); | 860 static_cast<icu::RuleBasedBreakIterator*>(break_iterator); |
| (...skipping 340 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1201 Handle<FixedArray> date_cache_version = | 1201 Handle<FixedArray> date_cache_version = |
| 1202 Handle<FixedArray>::cast(isolate->eternal_handles()->GetSingleton( | 1202 Handle<FixedArray>::cast(isolate->eternal_handles()->GetSingleton( |
| 1203 EternalHandles::DATE_CACHE_VERSION)); | 1203 EternalHandles::DATE_CACHE_VERSION)); |
| 1204 return date_cache_version->get(0); | 1204 return date_cache_version->get(0); |
| 1205 } | 1205 } |
| 1206 | 1206 |
| 1207 } // namespace internal | 1207 } // namespace internal |
| 1208 } // namespace v8 | 1208 } // namespace v8 |
| 1209 | 1209 |
| 1210 #endif // V8_I18N_SUPPORT | 1210 #endif // V8_I18N_SUPPORT |
| OLD | NEW |