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