< prev index next >

src/hotspot/share/classfile/javaClasses.cpp

Print this page
rev 54069 : 8220496: Race in java_lang_String::length() when deduplicating
Reviewed-by: shade


 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 );


< prev index next >