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 } |