| 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 "src/api.h" | 9 #include "src/api.h" |
| 10 #include "src/api-natives.h" | 10 #include "src/api-natives.h" |
| (...skipping 364 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 375 Handle<Object> value; | 375 Handle<Object> value; |
| 376 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, value, Object::ToNumber(date)); | 376 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, value, Object::ToNumber(date)); |
| 377 | 377 |
| 378 icu::SimpleDateFormat* date_format = | 378 icu::SimpleDateFormat* date_format = |
| 379 DateFormat::UnpackDateFormat(isolate, date_format_holder); | 379 DateFormat::UnpackDateFormat(isolate, date_format_holder); |
| 380 if (!date_format) return isolate->ThrowIllegalOperation(); | 380 if (!date_format) return isolate->ThrowIllegalOperation(); |
| 381 | 381 |
| 382 icu::UnicodeString result; | 382 icu::UnicodeString result; |
| 383 date_format->format(value->Number(), result); | 383 date_format->format(value->Number(), result); |
| 384 | 384 |
| 385 Handle<String> result_str; | 385 RETURN_RESULT_OR_FAILURE( |
| 386 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( | 386 isolate, isolate->factory()->NewStringFromTwoByte(Vector<const uint16_t>( |
| 387 isolate, result_str, | 387 reinterpret_cast<const uint16_t*>(result.getBuffer()), |
| 388 isolate->factory()->NewStringFromTwoByte(Vector<const uint16_t>( | 388 result.length()))); |
| 389 reinterpret_cast<const uint16_t*>(result.getBuffer()), | |
| 390 result.length()))); | |
| 391 return *result_str; | |
| 392 } | 389 } |
| 393 | 390 |
| 394 | 391 |
| 395 RUNTIME_FUNCTION(Runtime_InternalDateParse) { | 392 RUNTIME_FUNCTION(Runtime_InternalDateParse) { |
| 396 HandleScope scope(isolate); | 393 HandleScope scope(isolate); |
| 397 | 394 |
| 398 DCHECK(args.length() == 2); | 395 DCHECK(args.length() == 2); |
| 399 | 396 |
| 400 CONVERT_ARG_HANDLE_CHECKED(JSObject, date_format_holder, 0); | 397 CONVERT_ARG_HANDLE_CHECKED(JSObject, date_format_holder, 0); |
| 401 CONVERT_ARG_HANDLE_CHECKED(String, date_string, 1); | 398 CONVERT_ARG_HANDLE_CHECKED(String, date_string, 1); |
| 402 | 399 |
| 403 v8::String::Utf8Value utf8_date(v8::Utils::ToLocal(date_string)); | 400 v8::String::Utf8Value utf8_date(v8::Utils::ToLocal(date_string)); |
| 404 icu::UnicodeString u_date(icu::UnicodeString::fromUTF8(*utf8_date)); | 401 icu::UnicodeString u_date(icu::UnicodeString::fromUTF8(*utf8_date)); |
| 405 icu::SimpleDateFormat* date_format = | 402 icu::SimpleDateFormat* date_format = |
| 406 DateFormat::UnpackDateFormat(isolate, date_format_holder); | 403 DateFormat::UnpackDateFormat(isolate, date_format_holder); |
| 407 if (!date_format) return isolate->ThrowIllegalOperation(); | 404 if (!date_format) return isolate->ThrowIllegalOperation(); |
| 408 | 405 |
| 409 UErrorCode status = U_ZERO_ERROR; | 406 UErrorCode status = U_ZERO_ERROR; |
| 410 UDate date = date_format->parse(u_date, status); | 407 UDate date = date_format->parse(u_date, status); |
| 411 if (U_FAILURE(status)) return isolate->heap()->undefined_value(); | 408 if (U_FAILURE(status)) return isolate->heap()->undefined_value(); |
| 412 | 409 |
| 413 Handle<JSDate> result; | 410 RETURN_RESULT_OR_FAILURE( |
| 414 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( | 411 isolate, JSDate::New(isolate->date_function(), isolate->date_function(), |
| 415 isolate, result, | 412 static_cast<double>(date))); |
| 416 JSDate::New(isolate->date_function(), isolate->date_function(), | |
| 417 static_cast<double>(date))); | |
| 418 return *result; | |
| 419 } | 413 } |
| 420 | 414 |
| 421 | 415 |
| 422 RUNTIME_FUNCTION(Runtime_CreateNumberFormat) { | 416 RUNTIME_FUNCTION(Runtime_CreateNumberFormat) { |
| 423 HandleScope scope(isolate); | 417 HandleScope scope(isolate); |
| 424 | 418 |
| 425 DCHECK(args.length() == 3); | 419 DCHECK(args.length() == 3); |
| 426 | 420 |
| 427 CONVERT_ARG_HANDLE_CHECKED(String, locale, 0); | 421 CONVERT_ARG_HANDLE_CHECKED(String, locale, 0); |
| 428 CONVERT_ARG_HANDLE_CHECKED(JSObject, options, 1); | 422 CONVERT_ARG_HANDLE_CHECKED(JSObject, options, 1); |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 469 Handle<Object> value; | 463 Handle<Object> value; |
| 470 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, value, Object::ToNumber(number)); | 464 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, value, Object::ToNumber(number)); |
| 471 | 465 |
| 472 icu::DecimalFormat* number_format = | 466 icu::DecimalFormat* number_format = |
| 473 NumberFormat::UnpackNumberFormat(isolate, number_format_holder); | 467 NumberFormat::UnpackNumberFormat(isolate, number_format_holder); |
| 474 if (!number_format) return isolate->ThrowIllegalOperation(); | 468 if (!number_format) return isolate->ThrowIllegalOperation(); |
| 475 | 469 |
| 476 icu::UnicodeString result; | 470 icu::UnicodeString result; |
| 477 number_format->format(value->Number(), result); | 471 number_format->format(value->Number(), result); |
| 478 | 472 |
| 479 Handle<String> result_str; | 473 RETURN_RESULT_OR_FAILURE( |
| 480 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( | 474 isolate, isolate->factory()->NewStringFromTwoByte(Vector<const uint16_t>( |
| 481 isolate, result_str, | 475 reinterpret_cast<const uint16_t*>(result.getBuffer()), |
| 482 isolate->factory()->NewStringFromTwoByte(Vector<const uint16_t>( | 476 result.length()))); |
| 483 reinterpret_cast<const uint16_t*>(result.getBuffer()), | |
| 484 result.length()))); | |
| 485 return *result_str; | |
| 486 } | 477 } |
| 487 | 478 |
| 488 | 479 |
| 489 RUNTIME_FUNCTION(Runtime_InternalNumberParse) { | 480 RUNTIME_FUNCTION(Runtime_InternalNumberParse) { |
| 490 HandleScope scope(isolate); | 481 HandleScope scope(isolate); |
| 491 | 482 |
| 492 DCHECK(args.length() == 2); | 483 DCHECK(args.length() == 2); |
| 493 | 484 |
| 494 CONVERT_ARG_HANDLE_CHECKED(JSObject, number_format_holder, 0); | 485 CONVERT_ARG_HANDLE_CHECKED(JSObject, number_format_holder, 0); |
| 495 CONVERT_ARG_HANDLE_CHECKED(String, number_string, 1); | 486 CONVERT_ARG_HANDLE_CHECKED(String, number_string, 1); |
| (...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 640 // Read-only alias of the normalized prefix. | 631 // Read-only alias of the normalized prefix. |
| 641 result.setTo(false, input.getBuffer(), normalized_prefix_length); | 632 result.setTo(false, input.getBuffer(), normalized_prefix_length); |
| 642 // copy-on-write; normalize the suffix and append to |result|. | 633 // copy-on-write; normalize the suffix and append to |result|. |
| 643 normalizer->normalizeSecondAndAppend(result, unnormalized, status); | 634 normalizer->normalizeSecondAndAppend(result, unnormalized, status); |
| 644 } | 635 } |
| 645 | 636 |
| 646 if (U_FAILURE(status)) { | 637 if (U_FAILURE(status)) { |
| 647 return isolate->heap()->undefined_value(); | 638 return isolate->heap()->undefined_value(); |
| 648 } | 639 } |
| 649 | 640 |
| 650 Handle<String> result_str; | 641 RETURN_RESULT_OR_FAILURE( |
| 651 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( | 642 isolate, isolate->factory()->NewStringFromTwoByte(Vector<const uint16_t>( |
| 652 isolate, result_str, | 643 reinterpret_cast<const uint16_t*>(result.getBuffer()), |
| 653 isolate->factory()->NewStringFromTwoByte(Vector<const uint16_t>( | 644 result.length()))); |
| 654 reinterpret_cast<const uint16_t*>(result.getBuffer()), | |
| 655 result.length()))); | |
| 656 return *result_str; | |
| 657 } | 645 } |
| 658 | 646 |
| 659 | 647 |
| 660 RUNTIME_FUNCTION(Runtime_CreateBreakIterator) { | 648 RUNTIME_FUNCTION(Runtime_CreateBreakIterator) { |
| 661 HandleScope scope(isolate); | 649 HandleScope scope(isolate); |
| 662 | 650 |
| 663 DCHECK(args.length() == 3); | 651 DCHECK(args.length() == 3); |
| 664 | 652 |
| 665 CONVERT_ARG_HANDLE_CHECKED(String, locale, 0); | 653 CONVERT_ARG_HANDLE_CHECKED(String, locale, 0); |
| 666 CONVERT_ARG_HANDLE_CHECKED(JSObject, options, 1); | 654 CONVERT_ARG_HANDLE_CHECKED(JSObject, options, 1); |
| (...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 841 // semantics) and will be modified to contain the converted result. | 829 // semantics) and will be modified to contain the converted result. |
| 842 // Using read-only alias at first saves one copy operation if | 830 // Using read-only alias at first saves one copy operation if |
| 843 // transliteration does not change the input, which is rather rare. | 831 // transliteration does not change the input, which is rather rare. |
| 844 // Moreover, transliteration takes rather long so that saving one copy | 832 // Moreover, transliteration takes rather long so that saving one copy |
| 845 // helps only a little bit. | 833 // helps only a little bit. |
| 846 converted.setTo(false, src, src_length); | 834 converted.setTo(false, src, src_length); |
| 847 ConvertCaseWithTransliterator(&converted, "el-Upper"); | 835 ConvertCaseWithTransliterator(&converted, "el-Upper"); |
| 848 // If no change is made, just return |s|. | 836 // If no change is made, just return |s|. |
| 849 if (converted.getBuffer() == src) return *s; | 837 if (converted.getBuffer() == src) return *s; |
| 850 } | 838 } |
| 851 Handle<String> result; | 839 RETURN_RESULT_OR_FAILURE( |
| 852 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( | 840 isolate, |
| 853 isolate, result, | |
| 854 isolate->factory()->NewStringFromTwoByte(Vector<const uint16_t>( | 841 isolate->factory()->NewStringFromTwoByte(Vector<const uint16_t>( |
| 855 reinterpret_cast<const uint16_t*>(converted.getBuffer()), | 842 reinterpret_cast<const uint16_t*>(converted.getBuffer()), |
| 856 converted.length()))); | 843 converted.length()))); |
| 857 return *result; | |
| 858 } | 844 } |
| 859 | 845 |
| 860 auto case_converter = is_to_upper ? u_strToUpper : u_strToLower; | 846 auto case_converter = is_to_upper ? u_strToUpper : u_strToLower; |
| 861 | 847 |
| 862 int32_t dest_length = src_length; | 848 int32_t dest_length = src_length; |
| 863 UErrorCode status; | 849 UErrorCode status; |
| 864 Handle<SeqTwoByteString> result; | 850 Handle<SeqTwoByteString> result; |
| 865 base::SmartArrayPointer<uc16> sap; | 851 base::SmartArrayPointer<uc16> sap; |
| 866 | 852 |
| 867 // This is not a real loop. It'll be executed only once (no overflow) or | 853 // This is not a real loop. It'll be executed only once (no overflow) or |
| (...skipping 291 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1159 Handle<FixedArray> date_cache_version = | 1145 Handle<FixedArray> date_cache_version = |
| 1160 Handle<FixedArray>::cast(isolate->eternal_handles()->GetSingleton( | 1146 Handle<FixedArray>::cast(isolate->eternal_handles()->GetSingleton( |
| 1161 EternalHandles::DATE_CACHE_VERSION)); | 1147 EternalHandles::DATE_CACHE_VERSION)); |
| 1162 return date_cache_version->get(0); | 1148 return date_cache_version->get(0); |
| 1163 } | 1149 } |
| 1164 | 1150 |
| 1165 } // namespace internal | 1151 } // namespace internal |
| 1166 } // namespace v8 | 1152 } // namespace v8 |
| 1167 | 1153 |
| 1168 #endif // V8_I18N_SUPPORT | 1154 #endif // V8_I18N_SUPPORT |
| OLD | NEW |