提交 d4c2eaa5 编写于 作者: A acorn

6932480: Fix crash in CompilerThread/Parser. Unloaded array klass?

Summary: Restore code deleted in 6626217
Reviewed-by: asaha, kevinw
上级 dab05f32
......@@ -370,6 +370,30 @@ ciKlass* ciEnv::get_klass_by_name_impl(ciKlass* accessing_klass,
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();
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册