--- old/src/share/vm/classfile/javaClasses.cpp 2017-04-25 16:44:15.199175883 +0200 +++ new/src/share/vm/classfile/javaClasses.cpp 2017-04-25 16:44:15.051175888 +0200 @@ -44,7 +44,8 @@ #include "oops/objArrayOop.inline.hpp" #include "oops/oop.inline.hpp" #include "oops/symbol.hpp" -#include "oops/typeArrayOop.hpp" +#include "oops/typeArrayOop.inline.hpp" +#include "runtime/access.inline.hpp" #include "runtime/fieldDescriptor.hpp" #include "runtime/handles.inline.hpp" #include "runtime/interfaceSupport.hpp" @@ -614,15 +615,13 @@ } } -bool java_lang_String::equals(oop java_string, jchar* chars, int len) { +bool java_lang_String::equals(typeArrayOop value, int length, oop java_string, jchar* chars, int len) { assert(java_string->klass() == SystemDictionary::String_klass(), "must be java_string"); - typeArrayOop value = java_lang_String::value(java_string); - int length = java_lang_String::length(java_string); if (length != len) { return false; } - bool is_latin1 = java_lang_String::is_latin1(java_string); + bool is_latin1 = java_lang_String::is_latin1(java_string); if (!is_latin1) { for (int i = 0; i < len; i++) { if (value->char_at(i) != chars[i]) { @@ -639,25 +638,30 @@ return true; } +bool java_lang_String::equals(oop java_string, jchar* chars, int len) { + typeArrayOop value = java_lang_String::value(java_string); + int length = java_lang_String::length(java_string); + return java_lang_String::equals(value, length, java_string, chars, len); +} + bool java_lang_String::equals(oop str1, oop str2) { 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(str1); - int length1 = java_lang_String::length(str1); - bool is_latin1 = java_lang_String::is_latin1(str1); + int length1 = value1->length(); + bool is_latin1 = java_lang_String::is_latin1(str1); typeArrayOop value2 = java_lang_String::value(str2); - int length2 = java_lang_String::length(str2); - bool is_latin2 = java_lang_String::is_latin1(str2); + int length2 = value2->length(); + 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 < value1->length(); i++) { + for (int i = 0; i < length1; i++) { if (value1->byte_at(i) != value2->byte_at(i)) { return false; }