626 } |
626 } |
627 |
627 |
628 bool java_lang_String::equals(oop java_string, jchar* chars, int len) { |
628 bool java_lang_String::equals(oop java_string, jchar* chars, int len) { |
629 assert(java_string->klass() == SystemDictionary::String_klass(), |
629 assert(java_string->klass() == SystemDictionary::String_klass(), |
630 "must be java_string"); |
630 "must be java_string"); |
631 typeArrayOop value = java_lang_String::value(java_string); |
631 typeArrayOop value = java_lang_String::value_no_keepalive(java_string); |
632 int length = java_lang_String::length(java_string); |
632 int length = java_lang_String::length(java_string); |
633 if (length != len) { |
633 if (length != len) { |
634 return false; |
634 return false; |
635 } |
635 } |
636 bool is_latin1 = java_lang_String::is_latin1(java_string); |
636 bool is_latin1 = java_lang_String::is_latin1(java_string); |
637 if (!is_latin1) { |
637 if (!is_latin1) { |
638 for (int i = 0; i < len; i++) { |
638 for (int i = 0; i < len; i++) { |
639 if (value->char_at(i) != chars[i]) { |
639 if (value->char_at(i) != chars[i]) { |
640 return false; |
640 return false; |
641 } |
641 } |
653 bool java_lang_String::equals(oop str1, oop str2) { |
653 bool java_lang_String::equals(oop str1, oop str2) { |
654 assert(str1->klass() == SystemDictionary::String_klass(), |
654 assert(str1->klass() == SystemDictionary::String_klass(), |
655 "must be java String"); |
655 "must be java String"); |
656 assert(str2->klass() == SystemDictionary::String_klass(), |
656 assert(str2->klass() == SystemDictionary::String_klass(), |
657 "must be java String"); |
657 "must be java String"); |
658 typeArrayOop value1 = java_lang_String::value(str1); |
658 typeArrayOop value1 = java_lang_String::value_no_keepalive(str1); |
659 int length1 = java_lang_String::length(str1); |
659 int length1 = java_lang_String::length(value1); |
660 bool is_latin1 = java_lang_String::is_latin1(str1); |
660 bool is_latin1 = java_lang_String::is_latin1(str1); |
661 typeArrayOop value2 = java_lang_String::value(str2); |
661 typeArrayOop value2 = java_lang_String::value_no_keepalive(str2); |
662 int length2 = java_lang_String::length(str2); |
662 int length2 = java_lang_String::length(value2); |
663 bool is_latin2 = java_lang_String::is_latin1(str2); |
663 bool is_latin2 = java_lang_String::is_latin1(str2); |
664 |
664 |
665 if ((length1 != length2) || (is_latin1 != is_latin2)) { |
665 if ((length1 != length2) || (is_latin1 != is_latin2)) { |
666 // Strings of different size or with different |
666 // Strings of different size or with different |
667 // coders are never equal. |
667 // coders are never equal. |
668 return false; |
668 return false; |
669 } |
669 } |
670 int blength1 = value1->length(); |
670 int blength1 = value1->length(); |
671 for (int i = 0; i < value1->length(); i++) { |
671 for (int i = 0; i < blength1; i++) { |
672 if (value1->byte_at(i) != value2->byte_at(i)) { |
672 if (value1->byte_at(i) != value2->byte_at(i)) { |
673 return false; |
673 return false; |
674 } |
674 } |
675 } |
675 } |
676 return true; |
676 return true; |
677 } |
677 } |
678 |
678 |
679 void java_lang_String::print(oop java_string, outputStream* st) { |
679 void java_lang_String::print(oop java_string, outputStream* st) { |
680 assert(java_string->klass() == SystemDictionary::String_klass(), "must be java_string"); |
680 assert(java_string->klass() == SystemDictionary::String_klass(), "must be java_string"); |
681 typeArrayOop value = java_lang_String::value(java_string); |
681 typeArrayOop value = java_lang_String::value_no_keepalive(java_string); |
682 |
682 |
683 if (value == NULL) { |
683 if (value == NULL) { |
684 // This can happen if, e.g., printing a String |
684 // This can happen if, e.g., printing a String |
685 // object before its initializer has been called |
685 // object before its initializer has been called |
686 st->print("NULL"); |
686 st->print("NULL"); |