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