92 volatile int StringTable::_parallel_claimed_idx = 0; |
92 volatile int StringTable::_parallel_claimed_idx = 0; |
93 |
93 |
94 CompactHashtable<oop, char> StringTable::_shared_table; |
94 CompactHashtable<oop, char> StringTable::_shared_table; |
95 |
95 |
96 // Pick hashing algorithm |
96 // Pick hashing algorithm |
97 unsigned int StringTable::hash_string(const jchar* s, int len) { |
97 template<typename T> |
|
98 unsigned int StringTable::hash_string(const T* s, int len) { |
98 return use_alternate_hashcode() ? AltHashing::murmur3_32(seed(), s, len) : |
99 return use_alternate_hashcode() ? AltHashing::murmur3_32(seed(), s, len) : |
99 java_lang_String::hash_code(s, len); |
100 java_lang_String::hash_code(s, len); |
100 } |
101 } |
|
102 |
|
103 // Explicit instantiation for all supported types. |
|
104 template unsigned int StringTable::hash_string<jchar>(const jchar* s, int len); |
|
105 template unsigned int StringTable::hash_string<jbyte>(const jbyte* s, int len); |
101 |
106 |
102 oop StringTable::lookup_shared(jchar* name, int len) { |
107 oop StringTable::lookup_shared(jchar* name, int len) { |
103 // java_lang_String::hash_code() was used to compute hash values in the shared table. Don't |
108 // java_lang_String::hash_code() was used to compute hash values in the shared table. Don't |
104 // use the hash value from StringTable::hash_string() as it might use alternate hashcode. |
109 // use the hash value from StringTable::hash_string() as it might use alternate hashcode. |
105 return _shared_table.lookup((const char*)name, |
110 return _shared_table.lookup((const char*)name, |
407 for (int i = 0; i < the_table()->table_size(); ++i) { |
412 for (int i = 0; i < the_table()->table_size(); ++i) { |
408 HashtableEntry<oop, mtSymbol>* p = the_table()->bucket(i); |
413 HashtableEntry<oop, mtSymbol>* p = the_table()->bucket(i); |
409 for ( ; p != NULL; p = p->next()) { |
414 for ( ; p != NULL; p = p->next()) { |
410 oop s = p->literal(); |
415 oop s = p->literal(); |
411 typeArrayOop value = java_lang_String::value(s); |
416 typeArrayOop value = java_lang_String::value(s); |
412 int offset = java_lang_String::offset(s); |
|
413 int length = java_lang_String::length(s); |
417 int length = java_lang_String::length(s); |
|
418 bool is_latin1 = java_lang_String::is_latin1(s); |
414 |
419 |
415 if (length <= 0) { |
420 if (length <= 0) { |
416 st->print("%d: ", length); |
421 st->print("%d: ", length); |
417 } else { |
422 } else { |
418 ResourceMark rm(THREAD); |
423 ResourceMark rm(THREAD); |
419 jchar* chars = (jchar*)value->char_at_addr(offset); |
424 int utf8_length; |
420 int utf8_length = UNICODE::utf8_length(chars, length); |
425 char* utf8_string; |
421 char* utf8_string = NEW_RESOURCE_ARRAY(char, utf8_length + 1); |
426 |
422 UNICODE::convert_to_utf8(chars, length, utf8_string); |
427 if (!is_latin1) { |
|
428 jchar* chars = value->char_at_addr(0); |
|
429 utf8_length = UNICODE::utf8_length(chars, length); |
|
430 utf8_string = UNICODE::as_utf8(chars, length); |
|
431 } else { |
|
432 jbyte* bytes = value->byte_at_addr(0); |
|
433 utf8_length = UNICODE::utf8_length(bytes, length); |
|
434 utf8_string = UNICODE::as_utf8(bytes, length); |
|
435 } |
423 |
436 |
424 st->print("%d: ", utf8_length); |
437 st->print("%d: ", utf8_length); |
425 HashtableTextDump::put_utf8(st, utf8_string, utf8_length); |
438 HashtableTextDump::put_utf8(st, utf8_string, utf8_length); |
426 } |
439 } |
427 st->cr(); |
440 st->cr(); |