561 return sym;
562 }
563 }
564
565 Symbol* java_lang_String::as_symbol_or_null(oop java_string) {
566 typeArrayOop value = java_lang_String::value(java_string);
567 int length = java_lang_String::length(java_string, value);
568 bool is_latin1 = java_lang_String::is_latin1(java_string);
569 if (!is_latin1) {
570 jchar* base = (length == 0) ? NULL : value->char_at_addr(0);
571 return SymbolTable::probe_unicode(base, length);
572 } else {
573 ResourceMark rm;
574 jbyte* position = (length == 0) ? NULL : value->byte_at_addr(0);
575 const char* base = UNICODE::as_utf8(position, length);
576 return SymbolTable::probe(base, length);
577 }
578 }
579
580 int java_lang_String::utf8_length(oop java_string, typeArrayOop value) {
581 assert(oopDesc::equals(value, java_lang_String::value(java_string)),
582 "value must be same as java_lang_String::value(java_string)");
583 int length = java_lang_String::length(java_string, value);
584 if (length == 0) {
585 return 0;
586 }
587 if (!java_lang_String::is_latin1(java_string)) {
588 return UNICODE::utf8_length(value->char_at_addr(0), length);
589 } else {
590 return UNICODE::utf8_length(value->byte_at_addr(0), length);
591 }
592 }
593
594 int java_lang_String::utf8_length(oop java_string) {
595 typeArrayOop value = java_lang_String::value(java_string);
596 return utf8_length(java_string, value);
597 }
598
599 char* java_lang_String::as_utf8_string(oop java_string) {
600 typeArrayOop value = java_lang_String::value(java_string);
601 int length = java_lang_String::length(java_string, value);
602 bool is_latin1 = java_lang_String::is_latin1(java_string);
603 if (!is_latin1) {
604 jchar* position = (length == 0) ? NULL : value->char_at_addr(0);
605 return UNICODE::as_utf8(position, length);
606 } else {
607 jbyte* position = (length == 0) ? NULL : value->byte_at_addr(0);
608 return UNICODE::as_utf8(position, length);
609 }
610 }
611
612 char* java_lang_String::as_utf8_string(oop java_string, typeArrayOop value, char* buf, int buflen) {
613 assert(oopDesc::equals(value, java_lang_String::value(java_string)),
614 "value must be same as java_lang_String::value(java_string)");
615 int length = java_lang_String::length(java_string, value);
616 bool is_latin1 = java_lang_String::is_latin1(java_string);
617 if (!is_latin1) {
618 jchar* position = (length == 0) ? NULL : value->char_at_addr(0);
619 return UNICODE::as_utf8(position, length, buf, buflen);
620 } else {
621 jbyte* position = (length == 0) ? NULL : value->byte_at_addr(0);
622 return UNICODE::as_utf8(position, length, buf, buflen);
623 }
624 }
625
626 char* java_lang_String::as_utf8_string(oop java_string, char* buf, int buflen) {
627 typeArrayOop value = java_lang_String::value(java_string);
628 return as_utf8_string(java_string, value, buf, buflen);
629 }
630
631 char* java_lang_String::as_utf8_string(oop java_string, int start, int len) {
632 typeArrayOop value = java_lang_String::value(java_string);
633 bool is_latin1 = java_lang_String::is_latin1(java_string);
634 assert(start + len <= java_lang_String::length(java_string), "just checking");
635 if (!is_latin1) {
636 jchar* position = value->char_at_addr(start);
637 return UNICODE::as_utf8(position, len);
638 } else {
639 jbyte* position = value->byte_at_addr(start);
640 return UNICODE::as_utf8(position, len);
641 }
642 }
643
644 char* java_lang_String::as_utf8_string(oop java_string, typeArrayOop value, int start, int len, char* buf, int buflen) {
645 assert(oopDesc::equals(value, java_lang_String::value(java_string)),
646 "value must be same as java_lang_String::value(java_string)");
647 assert(start + len <= java_lang_String::length(java_string), "just checking");
648 bool is_latin1 = java_lang_String::is_latin1(java_string);
649 if (!is_latin1) {
650 jchar* position = value->char_at_addr(start);
651 return UNICODE::as_utf8(position, len, buf, buflen);
652 } else {
653 jbyte* position = value->byte_at_addr(start);
654 return UNICODE::as_utf8(position, len, buf, buflen);
655 }
656 }
657
658 bool java_lang_String::equals(oop java_string, const jchar* chars, int len) {
659 assert(java_string->klass() == SystemDictionary::String_klass(),
660 "must be java_string");
661 typeArrayOop value = java_lang_String::value_no_keepalive(java_string);
662 int length = java_lang_String::length(java_string, value);
663 if (length != len) {
664 return false;
665 }
669 if (value->char_at(i) != chars[i]) {
670 return false;
671 }
672 }
673 } else {
674 for (int i = 0; i < len; i++) {
675 if ((((jchar) value->byte_at(i)) & 0xff) != chars[i]) {
676 return false;
677 }
678 }
679 }
680 return true;
681 }
682
683 bool java_lang_String::equals(oop str1, oop str2) {
684 assert(str1->klass() == SystemDictionary::String_klass(),
685 "must be java String");
686 assert(str2->klass() == SystemDictionary::String_klass(),
687 "must be java String");
688 typeArrayOop value1 = java_lang_String::value_no_keepalive(str1);
689 int length1 = java_lang_String::length(str1, value1);
690 bool is_latin1 = java_lang_String::is_latin1(str1);
691 typeArrayOop value2 = java_lang_String::value_no_keepalive(str2);
692 int length2 = java_lang_String::length(str2, value2);
693 bool is_latin2 = java_lang_String::is_latin1(str2);
694
695 if ((length1 != length2) || (is_latin1 != is_latin2)) {
696 // Strings of different size or with different
697 // coders are never equal.
698 return false;
699 }
700 int blength1 = value1->length();
701 for (int i = 0; i < blength1; i++) {
702 if (value1->byte_at(i) != value2->byte_at(i)) {
703 return false;
704 }
705 }
706 return true;
707 }
708
709 void java_lang_String::print(oop java_string, outputStream* st) {
710 assert(java_string->klass() == SystemDictionary::String_klass(), "must be java_string");
711 typeArrayOop value = java_lang_String::value_no_keepalive(java_string);
712
713 if (value == NULL) {
714 // This can happen if, e.g., printing a String
715 // object before its initializer has been called
716 st->print("NULL");
717 return;
718 }
719
720 int length = java_lang_String::length(java_string, value);
721 bool is_latin1 = java_lang_String::is_latin1(java_string);
722
723 st->print("\"");
724 for (int index = 0; index < length; index++) {
725 st->print("%c", (!is_latin1) ? value->char_at(index) :
726 ((jchar) value->byte_at(index)) & 0xff );
|
561 return sym;
562 }
563 }
564
565 Symbol* java_lang_String::as_symbol_or_null(oop java_string) {
566 typeArrayOop value = java_lang_String::value(java_string);
567 int length = java_lang_String::length(java_string, value);
568 bool is_latin1 = java_lang_String::is_latin1(java_string);
569 if (!is_latin1) {
570 jchar* base = (length == 0) ? NULL : value->char_at_addr(0);
571 return SymbolTable::probe_unicode(base, length);
572 } else {
573 ResourceMark rm;
574 jbyte* position = (length == 0) ? NULL : value->byte_at_addr(0);
575 const char* base = UNICODE::as_utf8(position, length);
576 return SymbolTable::probe(base, length);
577 }
578 }
579
580 int java_lang_String::utf8_length(oop java_string, typeArrayOop value) {
581 assert(values_equal(value, java_lang_String::value(java_string)),
582 "value must be same as java_lang_String::value(java_string)");
583 int length = java_lang_String::length(java_string, value);
584 if (length == 0) {
585 return 0;
586 }
587 if (!java_lang_String::is_latin1(java_string)) {
588 return UNICODE::utf8_length(value->char_at_addr(0), length);
589 } else {
590 return UNICODE::utf8_length(value->byte_at_addr(0), length);
591 }
592 }
593
594 int java_lang_String::utf8_length(oop java_string) {
595 typeArrayOop value = java_lang_String::value(java_string);
596 return utf8_length(java_string, value);
597 }
598
599 char* java_lang_String::as_utf8_string(oop java_string) {
600 typeArrayOop value = java_lang_String::value(java_string);
601 int length = java_lang_String::length(java_string, value);
602 bool is_latin1 = java_lang_String::is_latin1(java_string);
603 if (!is_latin1) {
604 jchar* position = (length == 0) ? NULL : value->char_at_addr(0);
605 return UNICODE::as_utf8(position, length);
606 } else {
607 jbyte* position = (length == 0) ? NULL : value->byte_at_addr(0);
608 return UNICODE::as_utf8(position, length);
609 }
610 }
611
612 char* java_lang_String::as_utf8_string(oop java_string, typeArrayOop value, char* buf, int buflen) {
613 assert(values_equal(value, java_lang_String::value(java_string)),
614 "value must be same as java_lang_String::value(java_string)");
615 int length = java_lang_String::length(java_string, value);
616 bool is_latin1 = java_lang_String::is_latin1(java_string);
617 if (!is_latin1) {
618 jchar* position = (length == 0) ? NULL : value->char_at_addr(0);
619 return UNICODE::as_utf8(position, length, buf, buflen);
620 } else {
621 jbyte* position = (length == 0) ? NULL : value->byte_at_addr(0);
622 return UNICODE::as_utf8(position, length, buf, buflen);
623 }
624 }
625
626 char* java_lang_String::as_utf8_string(oop java_string, char* buf, int buflen) {
627 typeArrayOop value = java_lang_String::value(java_string);
628 return as_utf8_string(java_string, value, buf, buflen);
629 }
630
631 char* java_lang_String::as_utf8_string(oop java_string, int start, int len) {
632 typeArrayOop value = java_lang_String::value(java_string);
633 bool is_latin1 = java_lang_String::is_latin1(java_string);
634 assert(start + len <= java_lang_String::length(java_string), "just checking");
635 if (!is_latin1) {
636 jchar* position = value->char_at_addr(start);
637 return UNICODE::as_utf8(position, len);
638 } else {
639 jbyte* position = value->byte_at_addr(start);
640 return UNICODE::as_utf8(position, len);
641 }
642 }
643
644 char* java_lang_String::as_utf8_string(oop java_string, typeArrayOop value, int start, int len, char* buf, int buflen) {
645 assert(values_equal(value, java_lang_String::value(java_string)),
646 "value must be same as java_lang_String::value(java_string)");
647 assert(start + len <= java_lang_String::length(java_string), "just checking");
648 bool is_latin1 = java_lang_String::is_latin1(java_string);
649 if (!is_latin1) {
650 jchar* position = value->char_at_addr(start);
651 return UNICODE::as_utf8(position, len, buf, buflen);
652 } else {
653 jbyte* position = value->byte_at_addr(start);
654 return UNICODE::as_utf8(position, len, buf, buflen);
655 }
656 }
657
658 bool java_lang_String::equals(oop java_string, const jchar* chars, int len) {
659 assert(java_string->klass() == SystemDictionary::String_klass(),
660 "must be java_string");
661 typeArrayOop value = java_lang_String::value_no_keepalive(java_string);
662 int length = java_lang_String::length(java_string, value);
663 if (length != len) {
664 return false;
665 }
669 if (value->char_at(i) != chars[i]) {
670 return false;
671 }
672 }
673 } else {
674 for (int i = 0; i < len; i++) {
675 if ((((jchar) value->byte_at(i)) & 0xff) != chars[i]) {
676 return false;
677 }
678 }
679 }
680 return true;
681 }
682
683 bool java_lang_String::equals(oop str1, oop str2) {
684 assert(str1->klass() == SystemDictionary::String_klass(),
685 "must be java String");
686 assert(str2->klass() == SystemDictionary::String_klass(),
687 "must be java String");
688 typeArrayOop value1 = java_lang_String::value_no_keepalive(str1);
689 bool is_latin1 = java_lang_String::is_latin1(str1);
690 typeArrayOop value2 = java_lang_String::value_no_keepalive(str2);
691 bool is_latin2 = java_lang_String::is_latin1(str2);
692
693 if (is_latin1 != is_latin2) {
694 // Strings with different coders are never equal.
695 return false;
696 }
697 return values_equal(value1, value2);
698 }
699
700 void java_lang_String::print(oop java_string, outputStream* st) {
701 assert(java_string->klass() == SystemDictionary::String_klass(), "must be java_string");
702 typeArrayOop value = java_lang_String::value_no_keepalive(java_string);
703
704 if (value == NULL) {
705 // This can happen if, e.g., printing a String
706 // object before its initializer has been called
707 st->print("NULL");
708 return;
709 }
710
711 int length = java_lang_String::length(java_string, value);
712 bool is_latin1 = java_lang_String::is_latin1(java_string);
713
714 st->print("\"");
715 for (int index = 0; index < length; index++) {
716 st->print("%c", (!is_latin1) ? value->char_at(index) :
717 ((jchar) value->byte_at(index)) & 0xff );
|