28 #include "classfile/javaClasses.hpp" 29 #include "oops/access.inline.hpp" 30 #include "oops/oop.inline.hpp" 31 #include "oops/oopsHierarchy.hpp" 32 33 void java_lang_String::set_coder(oop string, jbyte coder) { 34 assert(initialized && (coder_offset > 0), "Must be initialized"); 35 string->byte_field_put(coder_offset, coder); 36 } 37 38 void java_lang_String::set_value_raw(oop string, typeArrayOop buffer) { 39 assert(initialized, "Must be initialized"); 40 string->obj_field_put_raw(value_offset, buffer); 41 } 42 43 void java_lang_String::set_value(oop string, typeArrayOop buffer) { 44 assert(initialized && (value_offset > 0), "Must be initialized"); 45 string->obj_field_put(value_offset, (oop)buffer); 46 } 47 48 bool java_lang_String::hash_is_set(oop java_string) { 49 assert(initialized && (hash_offset > 0) && (hashIsZero_offset > 0), "Must be initialized"); 50 return java_string->int_field(hash_offset) != 0 || java_string->bool_field(hashIsZero_offset) != 0; 51 } 52 53 // Accessors 54 bool java_lang_String::value_equals(typeArrayOop str_value1, typeArrayOop str_value2) { 55 return (oopDesc::equals(str_value1, str_value2) || 56 (str_value1->length() == str_value2->length() && 57 (!memcmp(str_value1->base(T_BYTE), 58 str_value2->base(T_BYTE), 59 str_value2->length() * sizeof(jbyte))))); 60 } 61 62 typeArrayOop java_lang_String::value(oop java_string) { 63 assert(initialized && (value_offset > 0), "Must be initialized"); 64 assert(is_instance(java_string), "must be java_string"); 65 return (typeArrayOop) java_string->obj_field(value_offset); 66 } 67 68 typeArrayOop java_lang_String::value_no_keepalive(oop java_string) { 69 assert(initialized && (value_offset > 0), "Must be initialized"); 70 assert(is_instance(java_string), "must be java_string"); 71 return (typeArrayOop) java_string->obj_field_access<AS_NO_KEEPALIVE>(value_offset); 72 } 73 74 bool java_lang_String::is_latin1(oop java_string) { 75 assert(initialized && (coder_offset > 0), "Must be initialized"); 76 assert(is_instance(java_string), "must be java_string"); 77 jbyte coder = java_string->byte_field(coder_offset); 78 assert(CompactStrings || coder == CODER_UTF16, "Must be UTF16 without CompactStrings"); 79 return coder == CODER_LATIN1; 80 } 81 82 int java_lang_String::length(oop java_string, typeArrayOop value) { 83 assert(initialized, "Must be initialized"); 84 assert(is_instance(java_string), "must be java_string"); 85 assert(value_equals(value, java_lang_String::value(java_string)), 86 "value must be equal to java_lang_String::value(java_string)"); 87 if (value == NULL) { 88 return 0; 89 } 90 int arr_length = value->length(); 91 if (!is_latin1(java_string)) { | 28 #include "classfile/javaClasses.hpp" 29 #include "oops/access.inline.hpp" 30 #include "oops/oop.inline.hpp" 31 #include "oops/oopsHierarchy.hpp" 32 33 void java_lang_String::set_coder(oop string, jbyte coder) { 34 assert(initialized && (coder_offset > 0), "Must be initialized"); 35 string->byte_field_put(coder_offset, coder); 36 } 37 38 void java_lang_String::set_value_raw(oop string, typeArrayOop buffer) { 39 assert(initialized, "Must be initialized"); 40 string->obj_field_put_raw(value_offset, buffer); 41 } 42 43 void java_lang_String::set_value(oop string, typeArrayOop buffer) { 44 assert(initialized && (value_offset > 0), "Must be initialized"); 45 string->obj_field_put(value_offset, (oop)buffer); 46 } 47 48 void java_lang_String::set_hash(oop string, unsigned int hash) { 49 assert(initialized && (hash_offset > 0), "Must be initialized"); 50 string->int_field_put(hash_offset, hash); 51 } 52 53 // Accessors 54 bool java_lang_String::value_equals(typeArrayOop str_value1, typeArrayOop str_value2) { 55 return (oopDesc::equals(str_value1, str_value2) || 56 (str_value1->length() == str_value2->length() && 57 (!memcmp(str_value1->base(T_BYTE), 58 str_value2->base(T_BYTE), 59 str_value2->length() * sizeof(jbyte))))); 60 } 61 62 typeArrayOop java_lang_String::value(oop java_string) { 63 assert(initialized && (value_offset > 0), "Must be initialized"); 64 assert(is_instance(java_string), "must be java_string"); 65 return (typeArrayOop) java_string->obj_field(value_offset); 66 } 67 68 typeArrayOop java_lang_String::value_no_keepalive(oop java_string) { 69 assert(initialized && (value_offset > 0), "Must be initialized"); 70 assert(is_instance(java_string), "must be java_string"); 71 return (typeArrayOop) java_string->obj_field_access<AS_NO_KEEPALIVE>(value_offset); 72 } 73 74 unsigned int java_lang_String::hash(oop java_string) { 75 assert(initialized && (hash_offset > 0), "Must be initialized"); 76 assert(is_instance(java_string), "must be java_string"); 77 return java_string->int_field(hash_offset); 78 } 79 80 bool java_lang_String::is_latin1(oop java_string) { 81 assert(initialized && (coder_offset > 0), "Must be initialized"); 82 assert(is_instance(java_string), "must be java_string"); 83 jbyte coder = java_string->byte_field(coder_offset); 84 assert(CompactStrings || coder == CODER_UTF16, "Must be UTF16 without CompactStrings"); 85 return coder == CODER_LATIN1; 86 } 87 88 int java_lang_String::length(oop java_string, typeArrayOop value) { 89 assert(initialized, "Must be initialized"); 90 assert(is_instance(java_string), "must be java_string"); 91 assert(value_equals(value, java_lang_String::value(java_string)), 92 "value must be equal to java_lang_String::value(java_string)"); 93 if (value == NULL) { 94 return 0; 95 } 96 int arr_length = value->length(); 97 if (!is_latin1(java_string)) { |