提交 e14af3c8 编写于 作者: V vkempik

8048353: jstack -l crashes VM when a Java mirror for a primitive type is locked

Reviewed-by: coleenp, dcubed
上级 9faf16d9
...@@ -782,6 +782,22 @@ Symbol* java_lang_Class::as_signature(oop java_class, bool intern_if_not_found, ...@@ -782,6 +782,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));
......
...@@ -270,6 +270,7 @@ class java_lang_Class : AllStatic { ...@@ -270,6 +270,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) {
return obj != NULL && obj->klass() == SystemDictionary::Class_klass(); return obj != NULL && obj->klass() == SystemDictionary::Class_klass();
......
...@@ -148,8 +148,7 @@ static void print_locked_object_class_name(outputStream* st, Handle obj, const c ...@@ -148,8 +148,7 @@ static void print_locked_object_class_name(outputStream* st, Handle obj, const c
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());
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册