@@ -347,7 +347,7 @@ Handle java_lang_String::create_from_str(const char* utf8_str, TRAPS) {
347
347
#ifdef ASSERT
348
348
// This check is too strict when the input string is not a valid UTF8.
349
349
// For example, it may be created with arbitrary content via jni_NewStringUTF.
350
- if (UTF8::is_legal_utf8 ((const unsigned char *)utf8_str, strlen (utf8_str), false )) {
350
+ if (UTF8::is_legal_utf8 ((const unsigned char *)utf8_str, strlen (utf8_str), /* version_leq_47 */ false )) {
351
351
ResourceMark rm;
352
352
const char * expected = utf8_str;
353
353
char * actual = as_utf8_string (h_obj ());
@@ -365,7 +365,7 @@ oop java_lang_String::create_oop_from_str(const char* utf8_str, TRAPS) {
365
365
return h_obj ();
366
366
}
367
367
368
- Handle java_lang_String::create_from_symbol (Symbol* symbol, TRAPS) {
368
+ Handle java_lang_String::create_from_symbol (const Symbol* symbol, TRAPS) {
369
369
const char * utf8_str = (char *)symbol->bytes ();
370
370
int utf8_len = symbol->utf8_length ();
371
371
@@ -389,6 +389,8 @@ Handle java_lang_String::create_from_symbol(Symbol* symbol, TRAPS) {
389
389
}
390
390
391
391
#ifdef ASSERT
392
+ // This check is too strict on older classfile versions
393
+ if (UTF8::is_legal_utf8 ((const unsigned char *)utf8_str, utf8_len, /* version_leq_47*/ false ))
392
394
{
393
395
ResourceMark rm;
394
396
const char * expected = symbol->as_utf8 ();
@@ -755,6 +757,35 @@ bool java_lang_String::equals(oop java_string, const jchar* chars, int len) {
755
757
return true ;
756
758
}
757
759
760
+ bool java_lang_String::equals (oop java_string, const char * utf8_string, size_t utf8_len) {
761
+ assert (java_string->klass () == vmClasses::String_klass (),
762
+ " must be java_string" );
763
+ typeArrayOop value = java_lang_String::value_no_keepalive (java_string);
764
+ int length = java_lang_String::length (java_string, value);
765
+ int unicode_length = UTF8::unicode_length (utf8_string, utf8_len);
766
+ if (length != unicode_length) {
767
+ return false ;
768
+ }
769
+ bool is_latin1 = java_lang_String::is_latin1 (java_string);
770
+ jchar c;
771
+ if (!is_latin1) {
772
+ for (int i = 0 ; i < unicode_length; i++) {
773
+ utf8_string = UTF8::next (utf8_string, &c);
774
+ if (value->char_at (i) != c) {
775
+ return false ;
776
+ }
777
+ }
778
+ } else {
779
+ for (int i = 0 ; i < unicode_length; i++) {
780
+ utf8_string = UTF8::next (utf8_string, &c);
781
+ if ((((jchar) value->byte_at (i)) & 0xff ) != c) {
782
+ return false ;
783
+ }
784
+ }
785
+ }
786
+ return true ;
787
+ }
788
+
758
789
bool java_lang_String::equals (oop str1, oop str2) {
759
790
assert (str1->klass () == vmClasses::String_klass (),
760
791
" must be java String" );
0 commit comments