< prev index next >

src/hotspot/share/classfile/javaClasses.inline.hpp

Print this page
rev 54069 : 8220496: Race in java_lang_String::length() when deduplicating
Reviewed-by: shade


  22  *
  23  */
  24 
  25 #ifndef SHARE_CLASSFILE_JAVACLASSES_INLINE_HPP
  26 #define SHARE_CLASSFILE_JAVACLASSES_INLINE_HPP
  27 
  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 void java_lang_String::set_value(oop string, typeArrayOop buffer) {
  43   assert(initialized && (value_offset > 0), "Must be initialized");
  44   string->obj_field_put(value_offset, (oop)buffer);
  45 }

  46 void java_lang_String::set_hash(oop string, unsigned int hash) {
  47   assert(initialized && (hash_offset > 0), "Must be initialized");
  48   string->int_field_put(hash_offset, hash);
  49 }
  50 
  51 // Accessors








  52 typeArrayOop java_lang_String::value(oop java_string) {
  53   assert(initialized && (value_offset > 0), "Must be initialized");
  54   assert(is_instance(java_string), "must be java_string");
  55   return (typeArrayOop) java_string->obj_field(value_offset);
  56 }

  57 typeArrayOop java_lang_String::value_no_keepalive(oop java_string) {
  58   assert(initialized && (value_offset > 0), "Must be initialized");
  59   assert(is_instance(java_string), "must be java_string");
  60   return (typeArrayOop) java_string->obj_field_access<AS_NO_KEEPALIVE>(value_offset);
  61 }

  62 unsigned int java_lang_String::hash(oop java_string) {
  63   assert(initialized && (hash_offset > 0), "Must be initialized");
  64   assert(is_instance(java_string), "must be java_string");
  65   return java_string->int_field(hash_offset);
  66 }

  67 bool java_lang_String::is_latin1(oop java_string) {
  68   assert(initialized && (coder_offset > 0), "Must be initialized");
  69   assert(is_instance(java_string), "must be java_string");
  70   jbyte coder = java_string->byte_field(coder_offset);
  71   assert(CompactStrings || coder == CODER_UTF16, "Must be UTF16 without CompactStrings");
  72   return coder == CODER_LATIN1;
  73 }

  74 int java_lang_String::length(oop java_string, typeArrayOop value) {
  75   assert(initialized, "Must be initialized");
  76   assert(is_instance(java_string), "must be java_string");
  77   assert(oopDesc::equals(value, java_lang_String::value(java_string)),
  78          "value must be same as java_lang_String::value(java_string)");
  79   if (value == NULL) {
  80     return 0;
  81   }
  82   int arr_length = value->length();
  83   if (!is_latin1(java_string)) {
  84     assert((arr_length & 1) == 0, "should be even for UTF16 string");
  85     arr_length >>= 1; // convert number of bytes to number of elements
  86   }
  87   return arr_length;
  88 }

  89 int java_lang_String::length(oop java_string) {
  90   assert(initialized, "Must be initialized");
  91   assert(is_instance(java_string), "must be java_string");
  92   typeArrayOop value = java_lang_String::value_no_keepalive(java_string);
  93   return length(java_string, value);
  94 }
  95 
  96 bool java_lang_String::is_instance_inlined(oop obj) {
  97   return obj != NULL && obj->klass() == SystemDictionary::String_klass();
  98 }
  99 
 100 // Accessors
 101 oop java_lang_ref_Reference::referent(oop ref) {
 102   return ref->obj_field(referent_offset);
 103 }

 104 void java_lang_ref_Reference::set_referent(oop ref, oop value) {
 105   ref->obj_field_put(referent_offset, value);
 106 }

 107 void java_lang_ref_Reference::set_referent_raw(oop ref, oop value) {
 108   ref->obj_field_put_raw(referent_offset, value);
 109 }

 110 HeapWord* java_lang_ref_Reference::referent_addr_raw(oop ref) {
 111   return ref->obj_field_addr_raw<HeapWord>(referent_offset);
 112 }

 113 oop java_lang_ref_Reference::next(oop ref) {
 114   return ref->obj_field(next_offset);
 115 }

 116 void java_lang_ref_Reference::set_next(oop ref, oop value) {
 117   ref->obj_field_put(next_offset, value);
 118 }

 119 void java_lang_ref_Reference::set_next_raw(oop ref, oop value) {
 120   ref->obj_field_put_raw(next_offset, value);
 121 }

 122 HeapWord* java_lang_ref_Reference::next_addr_raw(oop ref) {
 123   return ref->obj_field_addr_raw<HeapWord>(next_offset);
 124 }

 125 oop java_lang_ref_Reference::discovered(oop ref) {
 126   return ref->obj_field(discovered_offset);
 127 }

 128 void java_lang_ref_Reference::set_discovered(oop ref, oop value) {
 129   ref->obj_field_put(discovered_offset, value);
 130 }

 131 void java_lang_ref_Reference::set_discovered_raw(oop ref, oop value) {
 132   ref->obj_field_put_raw(discovered_offset, value);
 133 }

 134 HeapWord* java_lang_ref_Reference::discovered_addr_raw(oop ref) {
 135   return ref->obj_field_addr_raw<HeapWord>(discovered_offset);
 136 }

 137 bool java_lang_ref_Reference::is_final(oop ref) {
 138   return InstanceKlass::cast(ref->klass())->reference_type() == REF_FINAL;
 139 }

 140 bool java_lang_ref_Reference::is_phantom(oop ref) {
 141   return InstanceKlass::cast(ref->klass())->reference_type() == REF_PHANTOM;
 142 }
 143 
 144 inline void java_lang_invoke_CallSite::set_target_volatile(oop site, oop target) {
 145   site->obj_field_put_volatile(_target_offset, target);
 146 }
 147 
 148 inline oop  java_lang_invoke_CallSite::target(oop site) {
 149   return site->obj_field(_target_offset);
 150 }
 151 
 152 inline void java_lang_invoke_CallSite::set_target(oop site, oop target) {
 153   site->obj_field_put(_target_offset, target);
 154 }
 155 
 156 inline bool java_lang_invoke_CallSite::is_instance(oop obj) {
 157   return obj != NULL && is_subclass(obj->klass());
 158 }
 159 




  22  *
  23  */
  24 
  25 #ifndef SHARE_CLASSFILE_JAVACLASSES_INLINE_HPP
  26 #define SHARE_CLASSFILE_JAVACLASSES_INLINE_HPP
  27 
  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::values_equal(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(values_equal(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)) {
  98     assert((arr_length & 1) == 0, "should be even for UTF16 string");
  99     arr_length >>= 1; // convert number of bytes to number of elements
 100   }
 101   return arr_length;
 102 }
 103 
 104 int java_lang_String::length(oop java_string) {
 105   assert(initialized, "Must be initialized");
 106   assert(is_instance(java_string), "must be java_string");
 107   typeArrayOop value = java_lang_String::value_no_keepalive(java_string);
 108   return length(java_string, value);
 109 }
 110 
 111 bool java_lang_String::is_instance_inlined(oop obj) {
 112   return obj != NULL && obj->klass() == SystemDictionary::String_klass();
 113 }
 114 
 115 // Accessors
 116 oop java_lang_ref_Reference::referent(oop ref) {
 117   return ref->obj_field(referent_offset);
 118 }
 119 
 120 void java_lang_ref_Reference::set_referent(oop ref, oop value) {
 121   ref->obj_field_put(referent_offset, value);
 122 }
 123 
 124 void java_lang_ref_Reference::set_referent_raw(oop ref, oop value) {
 125   ref->obj_field_put_raw(referent_offset, value);
 126 }
 127 
 128 HeapWord* java_lang_ref_Reference::referent_addr_raw(oop ref) {
 129   return ref->obj_field_addr_raw<HeapWord>(referent_offset);
 130 }
 131 
 132 oop java_lang_ref_Reference::next(oop ref) {
 133   return ref->obj_field(next_offset);
 134 }
 135 
 136 void java_lang_ref_Reference::set_next(oop ref, oop value) {
 137   ref->obj_field_put(next_offset, value);
 138 }
 139 
 140 void java_lang_ref_Reference::set_next_raw(oop ref, oop value) {
 141   ref->obj_field_put_raw(next_offset, value);
 142 }
 143 
 144 HeapWord* java_lang_ref_Reference::next_addr_raw(oop ref) {
 145   return ref->obj_field_addr_raw<HeapWord>(next_offset);
 146 }
 147 
 148 oop java_lang_ref_Reference::discovered(oop ref) {
 149   return ref->obj_field(discovered_offset);
 150 }
 151 
 152 void java_lang_ref_Reference::set_discovered(oop ref, oop value) {
 153   ref->obj_field_put(discovered_offset, value);
 154 }
 155 
 156 void java_lang_ref_Reference::set_discovered_raw(oop ref, oop value) {
 157   ref->obj_field_put_raw(discovered_offset, value);
 158 }
 159 
 160 HeapWord* java_lang_ref_Reference::discovered_addr_raw(oop ref) {
 161   return ref->obj_field_addr_raw<HeapWord>(discovered_offset);
 162 }
 163 
 164 bool java_lang_ref_Reference::is_final(oop ref) {
 165   return InstanceKlass::cast(ref->klass())->reference_type() == REF_FINAL;
 166 }
 167 
 168 bool java_lang_ref_Reference::is_phantom(oop ref) {
 169   return InstanceKlass::cast(ref->klass())->reference_type() == REF_PHANTOM;
 170 }
 171 
 172 inline void java_lang_invoke_CallSite::set_target_volatile(oop site, oop target) {
 173   site->obj_field_put_volatile(_target_offset, target);
 174 }
 175 
 176 inline oop  java_lang_invoke_CallSite::target(oop site) {
 177   return site->obj_field(_target_offset);
 178 }
 179 
 180 inline void java_lang_invoke_CallSite::set_target(oop site, oop target) {
 181   site->obj_field_put(_target_offset, target);
 182 }
 183 
 184 inline bool java_lang_invoke_CallSite::is_instance(oop obj) {
 185   return obj != NULL && is_subclass(obj->klass());
 186 }
 187 


< prev index next >