617 } |
617 } |
618 |
618 |
619 bool java_lang_String::equals(oop java_string, jchar* chars, int len) { |
619 bool java_lang_String::equals(oop java_string, jchar* chars, int len) { |
620 assert(java_string->klass() == SystemDictionary::String_klass(), |
620 assert(java_string->klass() == SystemDictionary::String_klass(), |
621 "must be java_string"); |
621 "must be java_string"); |
622 typeArrayOop value = java_lang_String::value(java_string); |
622 typeArrayOop value = java_lang_String::value_no_keepalive(java_string); |
623 int length = java_lang_String::length(java_string); |
623 int length = java_lang_String::length(java_string); |
624 if (length != len) { |
624 if (length != len) { |
625 return false; |
625 return false; |
626 } |
626 } |
627 bool is_latin1 = java_lang_String::is_latin1(java_string); |
627 bool is_latin1 = java_lang_String::is_latin1(java_string); |
628 if (!is_latin1) { |
628 if (!is_latin1) { |
629 for (int i = 0; i < len; i++) { |
629 for (int i = 0; i < len; i++) { |
630 if (value->char_at(i) != chars[i]) { |
630 if (value->char_at(i) != chars[i]) { |
631 return false; |
631 return false; |
632 } |
632 } |
644 bool java_lang_String::equals(oop str1, oop str2) { |
644 bool java_lang_String::equals(oop str1, oop str2) { |
645 assert(str1->klass() == SystemDictionary::String_klass(), |
645 assert(str1->klass() == SystemDictionary::String_klass(), |
646 "must be java String"); |
646 "must be java String"); |
647 assert(str2->klass() == SystemDictionary::String_klass(), |
647 assert(str2->klass() == SystemDictionary::String_klass(), |
648 "must be java String"); |
648 "must be java String"); |
649 typeArrayOop value1 = java_lang_String::value(str1); |
649 typeArrayOop value1 = java_lang_String::value_no_keepalive(str1); |
650 int length1 = java_lang_String::length(str1); |
650 int length1 = java_lang_String::length(value1); |
651 bool is_latin1 = java_lang_String::is_latin1(str1); |
651 bool is_latin1 = java_lang_String::is_latin1(str1); |
652 typeArrayOop value2 = java_lang_String::value(str2); |
652 typeArrayOop value2 = java_lang_String::value_no_keepalive(str2); |
653 int length2 = java_lang_String::length(str2); |
653 int length2 = java_lang_String::length(value2); |
654 bool is_latin2 = java_lang_String::is_latin1(str2); |
654 bool is_latin2 = java_lang_String::is_latin1(str2); |
655 |
655 |
656 if ((length1 != length2) || (is_latin1 != is_latin2)) { |
656 if ((length1 != length2) || (is_latin1 != is_latin2)) { |
657 // Strings of different size or with different |
657 // Strings of different size or with different |
658 // coders are never equal. |
658 // coders are never equal. |
659 return false; |
659 return false; |
660 } |
660 } |
661 int blength1 = value1->length(); |
661 int blength1 = value1->length(); |
662 for (int i = 0; i < value1->length(); i++) { |
662 for (int i = 0; i < blength1; i++) { |
663 if (value1->byte_at(i) != value2->byte_at(i)) { |
663 if (value1->byte_at(i) != value2->byte_at(i)) { |
664 return false; |
664 return false; |
665 } |
665 } |
666 } |
666 } |
667 return true; |
667 return true; |
668 } |
668 } |
669 |
669 |
670 void java_lang_String::print(oop java_string, outputStream* st) { |
670 void java_lang_String::print(oop java_string, outputStream* st) { |
671 assert(java_string->klass() == SystemDictionary::String_klass(), "must be java_string"); |
671 assert(java_string->klass() == SystemDictionary::String_klass(), "must be java_string"); |
672 typeArrayOop value = java_lang_String::value(java_string); |
672 typeArrayOop value = java_lang_String::value_no_keepalive(java_string); |
673 |
673 |
674 if (value == NULL) { |
674 if (value == NULL) { |
675 // This can happen if, e.g., printing a String |
675 // This can happen if, e.g., printing a String |
676 // object before its initializer has been called |
676 // object before its initializer has been called |
677 st->print("NULL"); |
677 st->print("NULL"); |