6932480: Fix crash in CompilerThread/Parser. Unloaded array klass?
Summary: Restore code deleted in 6626217
Reviewed-by: asaha, kevinw
--- 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();