src/share/vm/oops/constantPoolOop.cpp
Print this page
rev 3 : [mq]: anonk.patch
*** 331,342 ****
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 {
return java_lang_String::as_utf8_string(entry);
}
}
symbolOop constantPoolOopDesc::name_ref_at(int which) {
--- 331,345 ----
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 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,374 ****
this_oop->string_at(index, CHECK);
}
}
}
! oop constantPoolOopDesc::string_at_impl(constantPoolHandle this_oop, int which, 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
--- 367,377 ----
this_oop->string_at(index, CHECK);
}
}
}
! 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,391 ****
--- 381,408 ----
} 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);