src/hotspot/share/gc/shared/stringdedup/stringDedupTable.cpp
changeset 54102 fab8496eb541
parent 52070 e4d72440d60e
child 54486 7fd299216e97
equal deleted inserted replaced
54101:195309a6c7d5 54102:fab8496eb541
   267   StringDedupEntry** list = dest->bucket(index);
   267   StringDedupEntry** list = dest->bucket(index);
   268   entry->set_next(*list);
   268   entry->set_next(*list);
   269   *list = entry;
   269   *list = entry;
   270 }
   270 }
   271 
   271 
   272 bool StringDedupTable::equals(typeArrayOop value1, typeArrayOop value2) {
       
   273   return (oopDesc::equals(value1, value2) ||
       
   274           (value1->length() == value2->length() &&
       
   275           (!memcmp(value1->base(T_BYTE),
       
   276                     value2->base(T_BYTE),
       
   277                     value1->length() * sizeof(jbyte)))));
       
   278 }
       
   279 
       
   280 typeArrayOop StringDedupTable::lookup(typeArrayOop value, bool latin1, unsigned int hash,
   272 typeArrayOop StringDedupTable::lookup(typeArrayOop value, bool latin1, unsigned int hash,
   281                                       StringDedupEntry** list, uintx &count) {
   273                                       StringDedupEntry** list, uintx &count) {
   282   for (StringDedupEntry* entry = *list; entry != NULL; entry = entry->next()) {
   274   for (StringDedupEntry* entry = *list; entry != NULL; entry = entry->next()) {
   283     if (entry->hash() == hash && entry->latin1() == latin1) {
   275     if (entry->hash() == hash && entry->latin1() == latin1) {
   284       oop* obj_addr = (oop*)entry->obj_addr();
   276       oop* obj_addr = (oop*)entry->obj_addr();
   285       oop obj = NativeAccess<ON_PHANTOM_OOP_REF | AS_NO_KEEPALIVE>::oop_load(obj_addr);
   277       oop obj = NativeAccess<ON_PHANTOM_OOP_REF | AS_NO_KEEPALIVE>::oop_load(obj_addr);
   286       if (equals(value, static_cast<typeArrayOop>(obj))) {
   278       if (java_lang_String::value_equals(value, static_cast<typeArrayOop>(obj))) {
   287         obj = NativeAccess<ON_PHANTOM_OOP_REF>::oop_load(obj_addr);
   279         obj = NativeAccess<ON_PHANTOM_OOP_REF>::oop_load(obj_addr);
   288         return static_cast<typeArrayOop>(obj);
   280         return static_cast<typeArrayOop>(obj);
   289       }
   281       }
   290     }
   282     }
   291     count++;
   283     count++;
   631       bool latin1_1 = (*entry1)->latin1();
   623       bool latin1_1 = (*entry1)->latin1();
   632       StringDedupEntry** entry2 = (*entry1)->next_addr();
   624       StringDedupEntry** entry2 = (*entry1)->next_addr();
   633       while (*entry2 != NULL) {
   625       while (*entry2 != NULL) {
   634         typeArrayOop value2 = (*entry2)->obj();
   626         typeArrayOop value2 = (*entry2)->obj();
   635         bool latin1_2 = (*entry2)->latin1();
   627         bool latin1_2 = (*entry2)->latin1();
   636         guarantee(latin1_1 != latin1_2 || !equals(value1, value2), "Table entries must not have identical arrays");
   628         guarantee(latin1_1 != latin1_2 || !java_lang_String::value_equals(value1, value2), "Table entries must not have identical arrays");
   637         entry2 = (*entry2)->next_addr();
   629         entry2 = (*entry2)->next_addr();
   638       }
   630       }
   639       entry1 = (*entry1)->next_addr();
   631       entry1 = (*entry1)->next_addr();
   640     }
   632     }
   641   }
   633   }