< 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

*** 576,586 **** return SymbolTable::probe(base, length); } } int java_lang_String::utf8_length(oop java_string, typeArrayOop value) { ! assert(oopDesc::equals(value, java_lang_String::value(java_string)), "value must be same as java_lang_String::value(java_string)"); int length = java_lang_String::length(java_string, value); if (length == 0) { return 0; } --- 576,586 ---- return SymbolTable::probe(base, length); } } int java_lang_String::utf8_length(oop java_string, typeArrayOop value) { ! assert(values_equal(value, java_lang_String::value(java_string)), "value must be same as java_lang_String::value(java_string)"); int length = java_lang_String::length(java_string, value); if (length == 0) { return 0; }
*** 608,618 **** return UNICODE::as_utf8(position, length); } } char* java_lang_String::as_utf8_string(oop java_string, typeArrayOop value, char* buf, int buflen) { ! assert(oopDesc::equals(value, java_lang_String::value(java_string)), "value must be same as java_lang_String::value(java_string)"); int length = java_lang_String::length(java_string, value); bool is_latin1 = java_lang_String::is_latin1(java_string); if (!is_latin1) { jchar* position = (length == 0) ? NULL : value->char_at_addr(0); --- 608,618 ---- return UNICODE::as_utf8(position, length); } } char* java_lang_String::as_utf8_string(oop java_string, typeArrayOop value, char* buf, int buflen) { ! assert(values_equal(value, java_lang_String::value(java_string)), "value must be same as java_lang_String::value(java_string)"); int length = java_lang_String::length(java_string, value); bool is_latin1 = java_lang_String::is_latin1(java_string); if (!is_latin1) { jchar* position = (length == 0) ? NULL : value->char_at_addr(0);
*** 640,650 **** return UNICODE::as_utf8(position, len); } } char* java_lang_String::as_utf8_string(oop java_string, typeArrayOop value, int start, int len, char* buf, int buflen) { ! assert(oopDesc::equals(value, java_lang_String::value(java_string)), "value must be same as java_lang_String::value(java_string)"); assert(start + len <= java_lang_String::length(java_string), "just checking"); bool is_latin1 = java_lang_String::is_latin1(java_string); if (!is_latin1) { jchar* position = value->char_at_addr(start); --- 640,650 ---- return UNICODE::as_utf8(position, len); } } char* java_lang_String::as_utf8_string(oop java_string, typeArrayOop value, int start, int len, char* buf, int buflen) { ! assert(values_equal(value, java_lang_String::value(java_string)), "value must be same as java_lang_String::value(java_string)"); assert(start + len <= java_lang_String::length(java_string), "just checking"); bool is_latin1 = java_lang_String::is_latin1(java_string); if (!is_latin1) { jchar* position = value->char_at_addr(start);
*** 684,711 **** assert(str1->klass() == SystemDictionary::String_klass(), "must be java String"); assert(str2->klass() == SystemDictionary::String_klass(), "must be java String"); typeArrayOop value1 = java_lang_String::value_no_keepalive(str1); - int length1 = java_lang_String::length(str1, value1); bool is_latin1 = java_lang_String::is_latin1(str1); typeArrayOop value2 = java_lang_String::value_no_keepalive(str2); - int length2 = java_lang_String::length(str2, value2); bool is_latin2 = java_lang_String::is_latin1(str2); ! if ((length1 != length2) || (is_latin1 != is_latin2)) { ! // Strings of different size or with different ! // coders are never equal. return false; } ! int blength1 = value1->length(); ! for (int i = 0; i < blength1; i++) { ! if (value1->byte_at(i) != value2->byte_at(i)) { ! return false; ! } ! } ! return true; } void java_lang_String::print(oop java_string, outputStream* st) { assert(java_string->klass() == SystemDictionary::String_klass(), "must be java_string"); typeArrayOop value = java_lang_String::value_no_keepalive(java_string); --- 684,702 ---- assert(str1->klass() == SystemDictionary::String_klass(), "must be java String"); assert(str2->klass() == SystemDictionary::String_klass(), "must be java String"); typeArrayOop value1 = java_lang_String::value_no_keepalive(str1); bool is_latin1 = java_lang_String::is_latin1(str1); typeArrayOop value2 = java_lang_String::value_no_keepalive(str2); bool is_latin2 = java_lang_String::is_latin1(str2); ! if (is_latin1 != is_latin2) { ! // Strings with different coders are never equal. return false; } ! return values_equal(value1, value2); } void java_lang_String::print(oop java_string, outputStream* st) { assert(java_string->klass() == SystemDictionary::String_klass(), "must be java_string"); typeArrayOop value = java_lang_String::value_no_keepalive(java_string);
< prev index next >