| 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/v8.h" | 7 #include "src/v8.h" |
| 8 | 8 |
| 9 #include "src/api-natives.h" | 9 #include "src/api-natives.h" |
| 10 #include "src/arguments.h" | 10 #include "src/arguments.h" |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 81 | 81 |
| 82 const icu::Locale* available_locales = NULL; | 82 const icu::Locale* available_locales = NULL; |
| 83 int32_t count = 0; | 83 int32_t count = 0; |
| 84 | 84 |
| 85 if (service->IsUtf8EqualTo(CStrVector("collator"))) { | 85 if (service->IsUtf8EqualTo(CStrVector("collator"))) { |
| 86 available_locales = icu::Collator::getAvailableLocales(count); | 86 available_locales = icu::Collator::getAvailableLocales(count); |
| 87 } else if (service->IsUtf8EqualTo(CStrVector("numberformat"))) { | 87 } else if (service->IsUtf8EqualTo(CStrVector("numberformat"))) { |
| 88 available_locales = icu::NumberFormat::getAvailableLocales(count); | 88 available_locales = icu::NumberFormat::getAvailableLocales(count); |
| 89 } else if (service->IsUtf8EqualTo(CStrVector("dateformat"))) { | 89 } else if (service->IsUtf8EqualTo(CStrVector("dateformat"))) { |
| 90 available_locales = icu::DateFormat::getAvailableLocales(count); | 90 available_locales = icu::DateFormat::getAvailableLocales(count); |
| 91 #if !UCONFIG_NO_BREAK_ITERATION |
| 91 } else if (service->IsUtf8EqualTo(CStrVector("breakiterator"))) { | 92 } else if (service->IsUtf8EqualTo(CStrVector("breakiterator"))) { |
| 92 available_locales = icu::BreakIterator::getAvailableLocales(count); | 93 available_locales = icu::BreakIterator::getAvailableLocales(count); |
| 94 #endif |
| 93 } | 95 } |
| 94 | 96 |
| 95 UErrorCode error = U_ZERO_ERROR; | 97 UErrorCode error = U_ZERO_ERROR; |
| 96 char result[ULOC_FULLNAME_CAPACITY]; | 98 char result[ULOC_FULLNAME_CAPACITY]; |
| 97 Handle<JSObject> locales = factory->NewJSObject(isolate->object_function()); | 99 Handle<JSObject> locales = factory->NewJSObject(isolate->object_function()); |
| 98 | 100 |
| 99 for (int32_t i = 0; i < count; ++i) { | 101 for (int32_t i = 0; i < count; ++i) { |
| 100 const char* icu_name = available_locales[i].getName(); | 102 const char* icu_name = available_locales[i].getName(); |
| 101 | 103 |
| 102 error = U_ZERO_ERROR; | 104 error = U_ZERO_ERROR; |
| (...skipping 494 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 597 isolate->factory()->NewStringFromTwoByte(Vector<const uint16_t>( | 599 isolate->factory()->NewStringFromTwoByte(Vector<const uint16_t>( |
| 598 reinterpret_cast<const uint16_t*>(result.getBuffer()), | 600 reinterpret_cast<const uint16_t*>(result.getBuffer()), |
| 599 result.length()))); | 601 result.length()))); |
| 600 return *result_str; | 602 return *result_str; |
| 601 } | 603 } |
| 602 | 604 |
| 603 | 605 |
| 604 RUNTIME_FUNCTION(Runtime_CreateBreakIterator) { | 606 RUNTIME_FUNCTION(Runtime_CreateBreakIterator) { |
| 605 HandleScope scope(isolate); | 607 HandleScope scope(isolate); |
| 606 | 608 |
| 609 #if !UCONFIG_NO_BREAK_ITERATION |
| 607 DCHECK(args.length() == 3); | 610 DCHECK(args.length() == 3); |
| 608 | 611 |
| 609 CONVERT_ARG_HANDLE_CHECKED(String, locale, 0); | 612 CONVERT_ARG_HANDLE_CHECKED(String, locale, 0); |
| 610 CONVERT_ARG_HANDLE_CHECKED(JSObject, options, 1); | 613 CONVERT_ARG_HANDLE_CHECKED(JSObject, options, 1); |
| 611 CONVERT_ARG_HANDLE_CHECKED(JSObject, resolved, 2); | 614 CONVERT_ARG_HANDLE_CHECKED(JSObject, resolved, 2); |
| 612 | 615 |
| 613 Handle<ObjectTemplateInfo> break_iterator_template = | 616 Handle<ObjectTemplateInfo> break_iterator_template = |
| 614 I18N::GetTemplate2(isolate); | 617 I18N::GetTemplate2(isolate); |
| 615 | 618 |
| 616 // Create an empty object wrapper. | 619 // Create an empty object wrapper. |
| (...skipping 17 matching lines...) Expand all Loading... |
| 634 Handle<String> value = factory->NewStringFromStaticChars("valid"); | 637 Handle<String> value = factory->NewStringFromStaticChars("valid"); |
| 635 JSObject::AddProperty(local_object, key, value, NONE); | 638 JSObject::AddProperty(local_object, key, value, NONE); |
| 636 | 639 |
| 637 // Make object handle weak so we can delete the break iterator once GC kicks | 640 // Make object handle weak so we can delete the break iterator once GC kicks |
| 638 // in. | 641 // in. |
| 639 Handle<Object> wrapper = isolate->global_handles()->Create(*local_object); | 642 Handle<Object> wrapper = isolate->global_handles()->Create(*local_object); |
| 640 GlobalHandles::MakeWeak(wrapper.location(), | 643 GlobalHandles::MakeWeak(wrapper.location(), |
| 641 reinterpret_cast<void*>(wrapper.location()), | 644 reinterpret_cast<void*>(wrapper.location()), |
| 642 BreakIterator::DeleteBreakIterator); | 645 BreakIterator::DeleteBreakIterator); |
| 643 return *local_object; | 646 return *local_object; |
| 647 #else |
| 648 return isolate->heap()->undefined_value(); |
| 649 #endif |
| 644 } | 650 } |
| 645 | 651 |
| 646 | 652 |
| 647 RUNTIME_FUNCTION(Runtime_BreakIteratorAdoptText) { | 653 RUNTIME_FUNCTION(Runtime_BreakIteratorAdoptText) { |
| 648 HandleScope scope(isolate); | 654 HandleScope scope(isolate); |
| 649 | 655 |
| 656 #if !UCONFIG_NO_BREAK_ITERATION |
| 650 DCHECK(args.length() == 2); | 657 DCHECK(args.length() == 2); |
| 651 | 658 |
| 652 CONVERT_ARG_HANDLE_CHECKED(JSObject, break_iterator_holder, 0); | 659 CONVERT_ARG_HANDLE_CHECKED(JSObject, break_iterator_holder, 0); |
| 653 CONVERT_ARG_HANDLE_CHECKED(String, text, 1); | 660 CONVERT_ARG_HANDLE_CHECKED(String, text, 1); |
| 654 | 661 |
| 655 icu::BreakIterator* break_iterator = | 662 icu::BreakIterator* break_iterator = |
| 656 BreakIterator::UnpackBreakIterator(isolate, break_iterator_holder); | 663 BreakIterator::UnpackBreakIterator(isolate, break_iterator_holder); |
| 657 if (!break_iterator) return isolate->ThrowIllegalOperation(); | 664 if (!break_iterator) return isolate->ThrowIllegalOperation(); |
| 658 | 665 |
| 659 icu::UnicodeString* u_text = reinterpret_cast<icu::UnicodeString*>( | 666 icu::UnicodeString* u_text = reinterpret_cast<icu::UnicodeString*>( |
| 660 break_iterator_holder->GetInternalField(1)); | 667 break_iterator_holder->GetInternalField(1)); |
| 661 delete u_text; | 668 delete u_text; |
| 662 | 669 |
| 663 v8::String::Value text_value(v8::Utils::ToLocal(text)); | 670 v8::String::Value text_value(v8::Utils::ToLocal(text)); |
| 664 u_text = new icu::UnicodeString(reinterpret_cast<const UChar*>(*text_value), | 671 u_text = new icu::UnicodeString(reinterpret_cast<const UChar*>(*text_value), |
| 665 text_value.length()); | 672 text_value.length()); |
| 666 break_iterator_holder->SetInternalField(1, reinterpret_cast<Smi*>(u_text)); | 673 break_iterator_holder->SetInternalField(1, reinterpret_cast<Smi*>(u_text)); |
| 667 | 674 |
| 668 break_iterator->setText(*u_text); | 675 break_iterator->setText(*u_text); |
| 676 #endif |
| 669 | 677 |
| 670 return isolate->heap()->undefined_value(); | 678 return isolate->heap()->undefined_value(); |
| 671 } | 679 } |
| 672 | 680 |
| 673 | 681 |
| 674 RUNTIME_FUNCTION(Runtime_BreakIteratorFirst) { | 682 RUNTIME_FUNCTION(Runtime_BreakIteratorFirst) { |
| 675 HandleScope scope(isolate); | 683 HandleScope scope(isolate); |
| 676 | 684 |
| 685 #if !UCONFIG_NO_BREAK_ITERATION |
| 677 DCHECK(args.length() == 1); | 686 DCHECK(args.length() == 1); |
| 678 | 687 |
| 679 CONVERT_ARG_HANDLE_CHECKED(JSObject, break_iterator_holder, 0); | 688 CONVERT_ARG_HANDLE_CHECKED(JSObject, break_iterator_holder, 0); |
| 680 | 689 |
| 681 icu::BreakIterator* break_iterator = | 690 icu::BreakIterator* break_iterator = |
| 682 BreakIterator::UnpackBreakIterator(isolate, break_iterator_holder); | 691 BreakIterator::UnpackBreakIterator(isolate, break_iterator_holder); |
| 683 if (!break_iterator) return isolate->ThrowIllegalOperation(); | 692 if (!break_iterator) return isolate->ThrowIllegalOperation(); |
| 684 | 693 |
| 685 return *isolate->factory()->NewNumberFromInt(break_iterator->first()); | 694 return *isolate->factory()->NewNumberFromInt(break_iterator->first()); |
| 695 #else |
| 696 return isolate->heap()->undefined_value(); |
| 697 #endif |
| 686 } | 698 } |
| 687 | 699 |
| 688 | 700 |
| 689 RUNTIME_FUNCTION(Runtime_BreakIteratorNext) { | 701 RUNTIME_FUNCTION(Runtime_BreakIteratorNext) { |
| 690 HandleScope scope(isolate); | 702 HandleScope scope(isolate); |
| 691 | 703 |
| 704 #if !UCONFIG_NO_BREAK_ITERATION |
| 692 DCHECK(args.length() == 1); | 705 DCHECK(args.length() == 1); |
| 693 | 706 |
| 694 CONVERT_ARG_HANDLE_CHECKED(JSObject, break_iterator_holder, 0); | 707 CONVERT_ARG_HANDLE_CHECKED(JSObject, break_iterator_holder, 0); |
| 695 | 708 |
| 696 icu::BreakIterator* break_iterator = | 709 icu::BreakIterator* break_iterator = |
| 697 BreakIterator::UnpackBreakIterator(isolate, break_iterator_holder); | 710 BreakIterator::UnpackBreakIterator(isolate, break_iterator_holder); |
| 698 if (!break_iterator) return isolate->ThrowIllegalOperation(); | 711 if (!break_iterator) return isolate->ThrowIllegalOperation(); |
| 699 | 712 |
| 700 return *isolate->factory()->NewNumberFromInt(break_iterator->next()); | 713 return *isolate->factory()->NewNumberFromInt(break_iterator->next()); |
| 714 #else |
| 715 return isolate->heap()->undefined_value(); |
| 716 #endif |
| 701 } | 717 } |
| 702 | 718 |
| 703 | 719 |
| 704 RUNTIME_FUNCTION(Runtime_BreakIteratorCurrent) { | 720 RUNTIME_FUNCTION(Runtime_BreakIteratorCurrent) { |
| 705 HandleScope scope(isolate); | 721 HandleScope scope(isolate); |
| 706 | 722 |
| 723 #if !UCONFIG_NO_BREAK_ITERATION |
| 707 DCHECK(args.length() == 1); | 724 DCHECK(args.length() == 1); |
| 708 | 725 |
| 709 CONVERT_ARG_HANDLE_CHECKED(JSObject, break_iterator_holder, 0); | 726 CONVERT_ARG_HANDLE_CHECKED(JSObject, break_iterator_holder, 0); |
| 710 | 727 |
| 711 icu::BreakIterator* break_iterator = | 728 icu::BreakIterator* break_iterator = |
| 712 BreakIterator::UnpackBreakIterator(isolate, break_iterator_holder); | 729 BreakIterator::UnpackBreakIterator(isolate, break_iterator_holder); |
| 713 if (!break_iterator) return isolate->ThrowIllegalOperation(); | 730 if (!break_iterator) return isolate->ThrowIllegalOperation(); |
| 714 | 731 |
| 715 return *isolate->factory()->NewNumberFromInt(break_iterator->current()); | 732 return *isolate->factory()->NewNumberFromInt(break_iterator->current()); |
| 733 #else |
| 734 return isolate->heap()->undefined_value(); |
| 735 #endif |
| 716 } | 736 } |
| 717 | 737 |
| 718 | 738 |
| 719 RUNTIME_FUNCTION(Runtime_BreakIteratorBreakType) { | 739 RUNTIME_FUNCTION(Runtime_BreakIteratorBreakType) { |
| 720 HandleScope scope(isolate); | 740 HandleScope scope(isolate); |
| 721 | 741 |
| 742 #if !UCONFIG_NO_BREAK_ITERATION |
| 722 DCHECK(args.length() == 1); | 743 DCHECK(args.length() == 1); |
| 723 | 744 |
| 724 CONVERT_ARG_HANDLE_CHECKED(JSObject, break_iterator_holder, 0); | 745 CONVERT_ARG_HANDLE_CHECKED(JSObject, break_iterator_holder, 0); |
| 725 | 746 |
| 726 icu::BreakIterator* break_iterator = | 747 icu::BreakIterator* break_iterator = |
| 727 BreakIterator::UnpackBreakIterator(isolate, break_iterator_holder); | 748 BreakIterator::UnpackBreakIterator(isolate, break_iterator_holder); |
| 728 if (!break_iterator) return isolate->ThrowIllegalOperation(); | 749 if (!break_iterator) return isolate->ThrowIllegalOperation(); |
| 729 | 750 |
| 730 // TODO(cira): Remove cast once ICU fixes base BreakIterator class. | 751 // TODO(cira): Remove cast once ICU fixes base BreakIterator class. |
| 731 icu::RuleBasedBreakIterator* rule_based_iterator = | 752 icu::RuleBasedBreakIterator* rule_based_iterator = |
| 732 static_cast<icu::RuleBasedBreakIterator*>(break_iterator); | 753 static_cast<icu::RuleBasedBreakIterator*>(break_iterator); |
| 733 int32_t status = rule_based_iterator->getRuleStatus(); | 754 int32_t status = rule_based_iterator->getRuleStatus(); |
| 734 // Keep return values in sync with JavaScript BreakType enum. | 755 // Keep return values in sync with JavaScript BreakType enum. |
| 735 if (status >= UBRK_WORD_NONE && status < UBRK_WORD_NONE_LIMIT) { | 756 if (status >= UBRK_WORD_NONE && status < UBRK_WORD_NONE_LIMIT) { |
| 736 return *isolate->factory()->NewStringFromStaticChars("none"); | 757 return *isolate->factory()->NewStringFromStaticChars("none"); |
| 737 } else if (status >= UBRK_WORD_NUMBER && status < UBRK_WORD_NUMBER_LIMIT) { | 758 } else if (status >= UBRK_WORD_NUMBER && status < UBRK_WORD_NUMBER_LIMIT) { |
| 738 return *isolate->factory()->number_string(); | 759 return *isolate->factory()->number_string(); |
| 739 } else if (status >= UBRK_WORD_LETTER && status < UBRK_WORD_LETTER_LIMIT) { | 760 } else if (status >= UBRK_WORD_LETTER && status < UBRK_WORD_LETTER_LIMIT) { |
| 740 return *isolate->factory()->NewStringFromStaticChars("letter"); | 761 return *isolate->factory()->NewStringFromStaticChars("letter"); |
| 741 } else if (status >= UBRK_WORD_KANA && status < UBRK_WORD_KANA_LIMIT) { | 762 } else if (status >= UBRK_WORD_KANA && status < UBRK_WORD_KANA_LIMIT) { |
| 742 return *isolate->factory()->NewStringFromStaticChars("kana"); | 763 return *isolate->factory()->NewStringFromStaticChars("kana"); |
| 743 } else if (status >= UBRK_WORD_IDEO && status < UBRK_WORD_IDEO_LIMIT) { | 764 } else if (status >= UBRK_WORD_IDEO && status < UBRK_WORD_IDEO_LIMIT) { |
| 744 return *isolate->factory()->NewStringFromStaticChars("ideo"); | 765 return *isolate->factory()->NewStringFromStaticChars("ideo"); |
| 745 } else { | 766 } else { |
| 746 return *isolate->factory()->NewStringFromStaticChars("unknown"); | 767 return *isolate->factory()->NewStringFromStaticChars("unknown"); |
| 747 } | 768 } |
| 769 #else |
| 770 return isolate->heap()->undefined_value(); |
| 771 #endif |
| 748 } | 772 } |
| 749 } | 773 } |
| 750 } // namespace v8::internal | 774 } // namespace v8::internal |
| 751 | 775 |
| 752 #endif // V8_I18N_SUPPORT | 776 #endif // V8_I18N_SUPPORT |
| OLD | NEW |