6932480: Fix crash in CompilerThread/Parser. Unloaded array klass?
authoracorn
Mon, 15 Mar 2010 15:51:36 -0400
changeset 5123 63268b13ffeb
parent 5122 ae5e0d902355
child 5124 9dd40e895ad1
6932480: Fix crash in CompilerThread/Parser. Unloaded array klass? Summary: Restore code deleted in 6626217 Reviewed-by: asaha, kevinw
hotspot/src/share/vm/ci/ciEnv.cpp
--- a/hotspot/src/share/vm/ci/ciEnv.cpp	Thu Jan 28 13:59:18 2010 -0500
+++ b/hotspot/src/share/vm/ci/ciEnv.cpp	Mon Mar 15 15:51:36 2010 -0400
@@ -370,6 +370,30 @@
                                                      KILL_COMPILE_ON_FATAL_(fail_type));
   }
 
+  // If we fail to find an array klass, look again for its element type.
+  // The element type may be available either locally or via constraints.
+  // In either case, if we can find the element type in the system dictionary,
+  // we must build an array type around it.  The CI requires array klasses
+  // to be loaded if their element klasses are loaded, except when memory
+  // is exhausted.
+  if (sym->byte_at(0) == '[' &&
+      (sym->byte_at(1) == '[' || sym->byte_at(1) == 'L')) {
+    // We have an unloaded array.
+    // Build it on the fly if the element class exists.
+    symbolOop elem_sym = oopFactory::new_symbol(sym->as_utf8()+1,
+                                                sym->utf8_length()-1,
+                                                KILL_COMPILE_ON_FATAL_(fail_type));
+    // Get element ciKlass recursively.
+    ciKlass* elem_klass =
+      get_klass_by_name_impl(accessing_klass,
+                             get_object(elem_sym)->as_symbol(),
+                             require_local);
+    if (elem_klass != NULL && elem_klass->is_loaded()) {
+      // Now make an array for it
+      return ciObjArrayKlass::make_impl(elem_klass);
+    }
+  }
+
   if (found_klass != NULL) {
     // Found it.  Build a CI handle.
     return get_object(found_klass)->as_klass();