hotspot/src/share/vm/classfile/stringTable.cpp
changeset 33628 09241459a8b8
parent 33148 68fa8b6c4340
child 34659 3a7071043457
equal deleted inserted replaced
33627:c5b7455f846e 33628:09241459a8b8
    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();