# HG changeset patch # User acorn # Date 1268682696 14400 # Node ID f5dd08ad65df192c74279f734f95f2eb1d19410c # Parent 3d531bbe5917dae572af0373b3d8975997adb72d 6932480: Fix crash in CompilerThread/Parser. Unloaded array klass? Summary: Restore code deleted in 6626217 Reviewed-by: asaha, kevinw diff -r 3d531bbe5917 -r f5dd08ad65df src/share/vm/ci/ciEnv.cpp --- a/src/share/vm/ci/ciEnv.cpp Thu Jan 28 13:59:18 2010 -0500 +++ b/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();