mirror of
https://github.com/openjdk/jdk.git
synced 2025-08-27 23:04:50 +02:00
8048353: jstack -l crashes VM when a Java mirror for a primitive type is locked
Reviewed-by: coleenp, dcubed
This commit is contained in:
parent
9ba9e4aecb
commit
6ab7533af1
3 changed files with 18 additions and 2 deletions
|
@ -809,6 +809,22 @@ Symbol* java_lang_Class::as_signature(oop java_class, bool intern_if_not_found,
|
||||||
return name;
|
return name;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Returns the Java name for this Java mirror (Resource allocated)
|
||||||
|
// See Klass::external_name().
|
||||||
|
// For primitive type Java mirrors, its type name is returned.
|
||||||
|
const char* java_lang_Class::as_external_name(oop java_class) {
|
||||||
|
assert(java_lang_Class::is_instance(java_class), "must be a Class object");
|
||||||
|
const char* name = NULL;
|
||||||
|
if (is_primitive(java_class)) {
|
||||||
|
name = type2name(primitive_type(java_class));
|
||||||
|
} else {
|
||||||
|
name = as_Klass(java_class)->external_name();
|
||||||
|
}
|
||||||
|
if (name == NULL) {
|
||||||
|
name = "<null>";
|
||||||
|
}
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
Klass* java_lang_Class::array_klass(oop java_class) {
|
Klass* java_lang_Class::array_klass(oop java_class) {
|
||||||
Klass* k = ((Klass*)java_class->metadata_field(_array_klass_offset));
|
Klass* k = ((Klass*)java_class->metadata_field(_array_klass_offset));
|
||||||
|
|
|
@ -276,6 +276,7 @@ class java_lang_Class : AllStatic {
|
||||||
}
|
}
|
||||||
static Symbol* as_signature(oop java_class, bool intern_if_not_found, TRAPS);
|
static Symbol* as_signature(oop java_class, bool intern_if_not_found, TRAPS);
|
||||||
static void print_signature(oop java_class, outputStream *st);
|
static void print_signature(oop java_class, outputStream *st);
|
||||||
|
static const char* as_external_name(oop java_class);
|
||||||
// Testing
|
// Testing
|
||||||
static bool is_instance(oop obj);
|
static bool is_instance(oop obj);
|
||||||
|
|
||||||
|
|
|
@ -148,8 +148,7 @@ void javaVFrame::print_locked_object_class_name(outputStream* st, Handle obj, co
|
||||||
if (obj.not_null()) {
|
if (obj.not_null()) {
|
||||||
st->print("\t- %s <" INTPTR_FORMAT "> ", lock_state, (address)obj());
|
st->print("\t- %s <" INTPTR_FORMAT "> ", lock_state, (address)obj());
|
||||||
if (obj->klass() == SystemDictionary::Class_klass()) {
|
if (obj->klass() == SystemDictionary::Class_klass()) {
|
||||||
Klass* target_klass = java_lang_Class::as_Klass(obj());
|
st->print_cr("(a java.lang.Class for %s)", java_lang_Class::as_external_name(obj()));
|
||||||
st->print_cr("(a java.lang.Class for %s)", InstanceKlass::cast(target_klass)->external_name());
|
|
||||||
} else {
|
} else {
|
||||||
Klass* k = obj->klass();
|
Klass* k = obj->klass();
|
||||||
st->print_cr("(a %s)", k->external_name());
|
st->print_cr("(a %s)", k->external_name());
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue