8048353: jstack -l crashes VM when a Java mirror for a primitive type is locked
authorvkempik
Mon, 20 Jul 2015 18:57:07 +0300
changeset 31970 4bb8e8a13f6a
parent 31966 aa9c386e1240
child 31971 773b0491804c
8048353: jstack -l crashes VM when a Java mirror for a primitive type is locked Reviewed-by: coleenp, dcubed
hotspot/src/share/vm/classfile/javaClasses.cpp
hotspot/src/share/vm/classfile/javaClasses.hpp
hotspot/src/share/vm/runtime/vframe.cpp
--- a/hotspot/src/share/vm/classfile/javaClasses.cpp	Wed Jul 22 08:00:38 2015 -0400
+++ b/hotspot/src/share/vm/classfile/javaClasses.cpp	Mon Jul 20 18:57:07 2015 +0300
@@ -809,6 +809,22 @@
   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* k = ((Klass*)java_class->metadata_field(_array_klass_offset));
--- a/hotspot/src/share/vm/classfile/javaClasses.hpp	Wed Jul 22 08:00:38 2015 -0400
+++ b/hotspot/src/share/vm/classfile/javaClasses.hpp	Mon Jul 20 18:57:07 2015 +0300
@@ -276,6 +276,7 @@
   }
   static Symbol* as_signature(oop java_class, bool intern_if_not_found, TRAPS);
   static void print_signature(oop java_class, outputStream *st);
+  static const char* as_external_name(oop java_class);
   // Testing
   static bool is_instance(oop obj);
 
--- a/hotspot/src/share/vm/runtime/vframe.cpp	Wed Jul 22 08:00:38 2015 -0400
+++ b/hotspot/src/share/vm/runtime/vframe.cpp	Mon Jul 20 18:57:07 2015 +0300
@@ -148,8 +148,7 @@
   if (obj.not_null()) {
     st->print("\t- %s <" INTPTR_FORMAT "> ", lock_state, (address)obj());
     if (obj->klass() == SystemDictionary::Class_klass()) {
-      Klass* target_klass = java_lang_Class::as_Klass(obj());
-      st->print_cr("(a java.lang.Class for %s)", InstanceKlass::cast(target_klass)->external_name());
+      st->print_cr("(a java.lang.Class for %s)", java_lang_Class::as_external_name(obj()));
     } else {
       Klass* k = obj->klass();
       st->print_cr("(a %s)", k->external_name());