--- a/src/hotspot/share/classfile/javaClasses.cpp Tue Jan 22 10:12:05 2019 +0100
+++ b/src/hotspot/share/classfile/javaClasses.cpp Tue Jan 22 11:22:44 2019 +0100
@@ -421,7 +421,7 @@
oop obj = java_string();
// Typical usage is to convert all '/' to '.' in string.
typeArrayOop value = java_lang_String::value(obj);
- int length = java_lang_String::length(obj);
+ int length = java_lang_String::length(obj, value);
bool is_latin1 = java_lang_String::is_latin1(obj);
// First check if any from_char exist
@@ -485,7 +485,7 @@
jchar* java_lang_String::as_unicode_string(oop java_string, int& length, TRAPS) {
typeArrayOop value = java_lang_String::value(java_string);
- length = java_lang_String::length(java_string);
+ length = java_lang_String::length(java_string, value);
bool is_latin1 = java_lang_String::is_latin1(java_string);
jchar* result = NEW_RESOURCE_ARRAY_RETURN_NULL(jchar, length);
@@ -506,11 +506,11 @@
}
unsigned int java_lang_String::hash_code(oop java_string) {
- int length = java_lang_String::length(java_string);
+ typeArrayOop value = java_lang_String::value(java_string);
+ int length = java_lang_String::length(java_string, value);
// Zero length string will hash to zero with String.hashCode() function.
if (length == 0) return 0;
- typeArrayOop value = java_lang_String::value(java_string);
bool is_latin1 = java_lang_String::is_latin1(java_string);
if (is_latin1) {
@@ -522,7 +522,7 @@
char* java_lang_String::as_quoted_ascii(oop java_string) {
typeArrayOop value = java_lang_String::value(java_string);
- int length = java_lang_String::length(java_string);
+ int length = java_lang_String::length(java_string, value);
bool is_latin1 = java_lang_String::is_latin1(java_string);
if (length == 0) return NULL;
@@ -547,7 +547,7 @@
Symbol* java_lang_String::as_symbol(oop java_string, TRAPS) {
typeArrayOop value = java_lang_String::value(java_string);
- int length = java_lang_String::length(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* base = (length == 0) ? NULL : value->char_at_addr(0);
@@ -564,7 +564,7 @@
Symbol* java_lang_String::as_symbol_or_null(oop java_string) {
typeArrayOop value = java_lang_String::value(java_string);
- int length = java_lang_String::length(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* base = (length == 0) ? NULL : value->char_at_addr(0);
@@ -577,23 +577,28 @@
}
}
-int java_lang_String::utf8_length(oop java_string) {
- typeArrayOop value = java_lang_String::value(java_string);
- int length = java_lang_String::length(java_string);
- bool is_latin1 = java_lang_String::is_latin1(java_string);
+int java_lang_String::utf8_length(oop java_string, typeArrayOop value) {
+ assert(oopDesc::equals_raw(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;
}
- if (!is_latin1) {
+ if (!java_lang_String::is_latin1(java_string)) {
return UNICODE::utf8_length(value->char_at_addr(0), length);
} else {
return UNICODE::utf8_length(value->byte_at_addr(0), length);
}
}
+int java_lang_String::utf8_length(oop java_string) {
+ typeArrayOop value = java_lang_String::value(java_string);
+ return utf8_length(java_string, value);
+}
+
char* java_lang_String::as_utf8_string(oop java_string) {
typeArrayOop value = java_lang_String::value(java_string);
- int length = java_lang_String::length(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);
@@ -604,10 +609,11 @@
}
}
-char* java_lang_String::as_utf8_string(oop java_string, char* buf, int buflen) {
- typeArrayOop value = java_lang_String::value(java_string);
- int length = java_lang_String::length(java_string);
- bool is_latin1 = java_lang_String::is_latin1(java_string);
+char* java_lang_String::as_utf8_string(oop java_string, typeArrayOop value, char* buf, int buflen) {
+ assert(oopDesc::equals_raw(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);
return UNICODE::as_utf8(position, length, buf, buflen);
@@ -617,11 +623,15 @@
}
}
+char* java_lang_String::as_utf8_string(oop java_string, char* buf, int buflen) {
+ typeArrayOop value = java_lang_String::value(java_string);
+ return as_utf8_string(java_string, value, buf, buflen);
+}
+
char* java_lang_String::as_utf8_string(oop java_string, int start, int len) {
typeArrayOop value = java_lang_String::value(java_string);
- int length = java_lang_String::length(java_string);
- assert(start + len <= length, "just checking");
bool is_latin1 = java_lang_String::is_latin1(java_string);
+ assert(start + len <= java_lang_String::length(java_string), "just checking");
if (!is_latin1) {
jchar* position = value->char_at_addr(start);
return UNICODE::as_utf8(position, len);
@@ -631,11 +641,11 @@
}
}
-char* java_lang_String::as_utf8_string(oop java_string, int start, int len, char* buf, int buflen) {
- typeArrayOop value = java_lang_String::value(java_string);
- int length = java_lang_String::length(java_string);
- assert(start + len <= length, "just checking");
- bool is_latin1 = java_lang_String::is_latin1(java_string);
+char* java_lang_String::as_utf8_string(oop java_string, typeArrayOop value, int start, int len, char* buf, int buflen) {
+ assert(oopDesc::equals_raw(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);
return UNICODE::as_utf8(position, len, buf, buflen);
@@ -649,7 +659,7 @@
assert(java_string->klass() == SystemDictionary::String_klass(),
"must be java_string");
typeArrayOop value = java_lang_String::value_no_keepalive(java_string);
- int length = java_lang_String::length(java_string);
+ int length = java_lang_String::length(java_string, value);
if (length != len) {
return false;
}
@@ -676,10 +686,10 @@
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);
+ 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);
+ int length2 = java_lang_String::length(str2, value2);
bool is_latin2 = java_lang_String::is_latin1(str2);
if ((length1 != length2) || (is_latin1 != is_latin2)) {
@@ -707,7 +717,7 @@
return;
}
- int length = java_lang_String::length(java_string);
+ int length = java_lang_String::length(java_string, value);
bool is_latin1 = java_lang_String::is_latin1(java_string);
st->print("\"");