src/share/vm/oops/constantPoolOop.cpp

Print this page
rev 3 : [mq]: anonk.patch

@@ -331,12 +331,15 @@
 char* constantPoolOopDesc::string_at_noresolve(int which) {
   // Test entry type in case string is resolved while in here.
   oop entry = *(obj_at_addr(which));
   if (entry->is_symbol()) {
     return ((symbolOop)entry)->as_C_string();
-  } else {
+  } else if (java_lang_String::is_instance(entry)) {
     return java_lang_String::as_utf8_string(entry);
+  } else {
+    assert(false, "pseudo-string");
+    return (char*)"<pseudo-string>";
   }
 }
 
 
 symbolOop constantPoolOopDesc::name_ref_at(int which) {

@@ -364,11 +367,11 @@
       this_oop->string_at(index, CHECK);
     }
   }
 }
 
-oop constantPoolOopDesc::string_at_impl(constantPoolHandle this_oop, int which, TRAPS) {
+oop constantPoolOopDesc::string_at_impl(constantPoolHandle this_oop, int which, bool pseudo_ok, TRAPS) {
   oop entry = *(this_oop->obj_at_addr(which));
   if (entry->is_symbol()) {
     ObjectLocker ol(this_oop, THREAD);
     if (this_oop->tag_at(which).is_unresolved_string()) {
       // Intern string

@@ -378,14 +381,28 @@
     } else {
       // Another thread beat us and interned string, read string from constant pool
       entry = this_oop->resolved_string_at(which);
     }
   }
+  if (!pseudo_ok)
   assert(java_lang_String::is_instance(entry), "must be string");
   return entry;
 }
 
+
+bool constantPoolOopDesc::is_pseudo_string_at(int which) {
+  oop entry = *(obj_at_addr(which));
+  if (entry->is_symbol())
+    // Not yet resolved, but it will resolve to a string.
+    return false;
+  else if (java_lang_String::is_instance(entry))
+    return false;
+  else
+    // truly pseudo
+    return true;
+}
+
 
 bool constantPoolOopDesc::klass_name_at_matches(instanceKlassHandle k,
                                                 int which) {
   // Names are interned, so we can compare symbolOops directly
   symbolOop cp_name = klass_name_at(which);