Skip to content
Closed
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions src/hotspot/share/classfile/javaClasses.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -213,6 +213,7 @@ class java_lang_String : AllStatic {

// Tester
static inline bool is_instance(oop obj);
static inline bool is_instance_without_asserts(oop obj);

// Debugging
static void print(oop java_string, outputStream* st, int max_length = MaxStringPrintSize);
Expand Down
7 changes: 7 additions & 0 deletions src/hotspot/share/classfile/javaClasses.inline.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,13 @@ bool java_lang_String::is_instance(oop obj) {
return obj != nullptr && obj->klass() == vmClasses::String_klass();
}

// We need to be able to check if this is a string even when we are in an
// erroneous state where the klass is corrupted/can't be read safely.
// This happens when printing an oop during GC error reporting.
bool java_lang_String::is_instance_without_asserts(oop obj) {
return obj != nullptr && obj->klass_without_asserts() == vmClasses::String_klass();
}

// Accessors

oop java_lang_ref_Reference::weak_referent_no_keepalive(oop ref) {
Expand Down
2 changes: 1 addition & 1 deletion src/hotspot/share/oops/oop.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ char* oopDesc::print_value_string() {

void oopDesc::print_value_on(outputStream* st) const {
oop obj = const_cast<oopDesc*>(this);
if (java_lang_String::is_instance(obj)) {
if (java_lang_String::is_instance_without_asserts(obj)) {
java_lang_String::print(obj, st);
print_address_on(st);
} else {
Expand Down