< prev index next >

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

Print this page
rev 54472 : 8221836: Avoid recalculating String.hash when zero
Reviewed-by: jrose, adinn
Contributed-by: peter.levart@gmail.com, claes.redestad@oracle.com


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


< prev index next >