< prev index next >

src/share/vm/classfile/stringTable.cpp

Print this page

        

@@ -109,18 +109,33 @@
   // use the hash value from StringTable::hash_string() as it might use alternate hashcode.
   return _shared_table.lookup((const char*)name,
                               java_lang_String::hash_code(name, len), len);
 }
 
+// Tell the GC that this string was looked up in the StringTable.
+static void ensure_string_alive(oop string) {
+  // A lookup in the StringTable could return an object that was previously
+  // considered dead. The SATB part of G1 needs to get notified about this
+  // potential resurrection, otherwise the marking might not find the object.
+#if INCLUDE_ALL_GCS
+  assert(string != NULL, "should only be called when string found in table");
+  if (UseG1GC) {
+    G1SATBCardTableModRefBS::enqueue(string);
+  }
+#endif
+}
+
 oop StringTable::lookup_in_main_table(int index, jchar* name,
                                 int len, unsigned int hash) {
   int count = 0;
   for (HashtableEntry<oop, mtSymbol>* l = bucket(index); l != NULL; l = l->next()) {
     count++;
     if (l->hash() == hash) {
       if (java_lang_String::equals(l->literal(), name, len)) {
-        return l->literal();
+        oop result = l->literal();
+        ensure_string_alive(result);
+        return result;
       }
     }
   }
   // If the bucket size is too deep check if this hash code is insufficient.
   if (count >= rehash_count && !needs_rehashing()) {

@@ -171,34 +186,19 @@
   int length;
   jchar* chars = symbol->as_unicode(length);
   return lookup(chars, length);
 }
 
-// Tell the GC that this string was looked up in the StringTable.
-static void ensure_string_alive(oop string) {
-  // A lookup in the StringTable could return an object that was previously
-  // considered dead. The SATB part of G1 needs to get notified about this
-  // potential resurrection, otherwise the marking might not find the object.
-#if INCLUDE_ALL_GCS
-  if (UseG1GC && string != NULL) {
-    G1SATBCardTableModRefBS::enqueue(string);
-  }
-#endif
-}
-
 oop StringTable::lookup(jchar* name, int len) {
   oop string = lookup_shared(name, len);
   if (string != NULL) {
     return string;
   }
 
   unsigned int hash = hash_string(name, len);
   int index = the_table()->hash_to_index(hash);
   string = the_table()->lookup_in_main_table(index, name, len, hash);
-
-  ensure_string_alive(string);
-
   return string;
 }
 
 
 oop StringTable::intern(Handle string_or_null, jchar* name,

@@ -212,11 +212,10 @@
   int index = the_table()->hash_to_index(hashValue);
   found_string = the_table()->lookup_in_main_table(index, name, len, hashValue);
 
   // Found
   if (found_string != NULL) {
-    ensure_string_alive(found_string);
     return found_string;
   }
 
   debug_only(StableMemoryChecker smc(name, len * sizeof(name[0])));
   assert(!Universe::heap()->is_in_reserved(name),

@@ -247,12 +246,10 @@
     // Otherwise, add to symbol to table
     added_or_found = the_table()->basic_add(index, string, name, len,
                                   hashValue, CHECK_NULL);
   }
 
-  ensure_string_alive(added_or_found);
-
   return added_or_found;
 }
 
 oop StringTable::intern(Symbol* symbol, TRAPS) {
   if (symbol == NULL) return NULL;
< prev index next >