< prev index next >

src/hotspot/share/interpreter/linkResolver.cpp

Print this page
rev 58565 : 8238358: Implementation of JEP 371: Hidden Classes
Reviewed-by: duke
Contributed-by: mandy.chung@oracle.com, lois.foltan@oracle.com, david.holmes@oracle.com, harold.seigel@oracle.com, serguei.spitsyn@oracle.com, alex.buckley@oracle.com, jamsheed.c.m@oracle.com

*** 545,554 **** --- 545,569 ---- } } return NULL; } + static void print_nest_host_error_on(stringStream* ss, Klass* ref_klass, Klass* sel_klass, TRAPS) { + assert(ref_klass->is_instance_klass(), "must be"); + assert(sel_klass->is_instance_klass(), "must be"); + InstanceKlass* ref_ik = InstanceKlass::cast(ref_klass); + InstanceKlass* sel_ik = InstanceKlass::cast(sel_klass); + const char* nest_host_error_1 = ref_ik->nest_host_error(THREAD); + const char* nest_host_error_2 = sel_ik->nest_host_error(THREAD); + if (nest_host_error_1 != NULL || nest_host_error_2 != NULL) { + ss->print(", (%s%s%s)", + (nest_host_error_1 != NULL) ? nest_host_error_1 : "", + (nest_host_error_1 != NULL && nest_host_error_2 != NULL) ? ", " : "", + (nest_host_error_2 != NULL) ? nest_host_error_2 : ""); + } + } + void LinkResolver::check_method_accessability(Klass* ref_klass, Klass* resolved_klass, Klass* sel_klass, const methodHandle& sel_method, TRAPS) {
*** 577,604 **** bool can_access = Reflection::verify_member_access(ref_klass, resolved_klass, sel_klass, flags, true, false, CHECK); ! // Any existing exceptions that may have been thrown, for example LinkageErrors ! // from nest-host resolution, have been allowed to propagate. if (!can_access) { ResourceMark rm(THREAD); bool same_module = (sel_klass->module() == ref_klass->module()); ! Exceptions::fthrow( ! THREAD_AND_LOCATION, ! vmSymbols::java_lang_IllegalAccessError(), ! "class %s tried to access %s%s%smethod '%s' (%s%s%s)", ref_klass->external_name(), sel_method->is_abstract() ? "abstract " : "", sel_method->is_protected() ? "protected " : "", sel_method->is_private() ? "private " : "", sel_method->external_name(), (same_module) ? ref_klass->joint_in_module_of_loader(sel_klass) : ref_klass->class_in_module_of_loader(), (same_module) ? "" : "; ", (same_module) ? "" : sel_klass->class_in_module_of_loader() ); return; } } Method* LinkResolver::resolve_method_statically(Bytecodes::Code code, --- 592,629 ---- bool can_access = Reflection::verify_member_access(ref_klass, resolved_klass, sel_klass, flags, true, false, CHECK); ! // Any existing exceptions that may have been thrown ! // have been allowed to propagate. if (!can_access) { ResourceMark rm(THREAD); + stringStream ss; bool same_module = (sel_klass->module() == ref_klass->module()); ! ss.print("class %s tried to access %s%s%smethod '%s' (%s%s%s)", ref_klass->external_name(), sel_method->is_abstract() ? "abstract " : "", sel_method->is_protected() ? "protected " : "", sel_method->is_private() ? "private " : "", sel_method->external_name(), (same_module) ? ref_klass->joint_in_module_of_loader(sel_klass) : ref_klass->class_in_module_of_loader(), (same_module) ? "" : "; ", (same_module) ? "" : sel_klass->class_in_module_of_loader() ); + + // For private access check if there was a problem with nest host + // resolution, and if so report that as part of the message. + if (sel_method->is_private()) { + print_nest_host_error_on(&ss, ref_klass, sel_klass, THREAD); + } + + Exceptions::fthrow(THREAD_AND_LOCATION, + vmSymbols::java_lang_IllegalAccessError(), + "%s", + ss.as_string() + ); return; } } Method* LinkResolver::resolve_method_statically(Bytecodes::Code code,
*** 913,935 **** // Any existing exceptions that may have been thrown, for example LinkageErrors // from nest-host resolution, have been allowed to propagate. if (!can_access) { bool same_module = (sel_klass->module() == ref_klass->module()); ResourceMark rm(THREAD); ! Exceptions::fthrow( ! THREAD_AND_LOCATION, ! vmSymbols::java_lang_IllegalAccessError(), ! "class %s tried to access %s%sfield %s.%s (%s%s%s)", ref_klass->external_name(), fd.is_protected() ? "protected " : "", fd.is_private() ? "private " : "", sel_klass->external_name(), fd.name()->as_C_string(), (same_module) ? ref_klass->joint_in_module_of_loader(sel_klass) : ref_klass->class_in_module_of_loader(), (same_module) ? "" : "; ", (same_module) ? "" : sel_klass->class_in_module_of_loader() ); return; } } void LinkResolver::resolve_field_access(fieldDescriptor& fd, const constantPoolHandle& pool, int index, const methodHandle& method, Bytecodes::Code byte, TRAPS) { --- 938,968 ---- // Any existing exceptions that may have been thrown, for example LinkageErrors // from nest-host resolution, have been allowed to propagate. if (!can_access) { bool same_module = (sel_klass->module() == ref_klass->module()); ResourceMark rm(THREAD); ! stringStream ss; ! ss.print("class %s tried to access %s%sfield %s.%s (%s%s%s)", ref_klass->external_name(), fd.is_protected() ? "protected " : "", fd.is_private() ? "private " : "", sel_klass->external_name(), fd.name()->as_C_string(), (same_module) ? ref_klass->joint_in_module_of_loader(sel_klass) : ref_klass->class_in_module_of_loader(), (same_module) ? "" : "; ", (same_module) ? "" : sel_klass->class_in_module_of_loader() ); + // For private access check if there was a problem with nest host + // resolution, and if so report that as part of the message. + if (fd.is_private()) { + print_nest_host_error_on(&ss, ref_klass, sel_klass, THREAD); + } + Exceptions::fthrow(THREAD_AND_LOCATION, + vmSymbols::java_lang_IllegalAccessError(), + "%s", + ss.as_string() + ); return; } } void LinkResolver::resolve_field_access(fieldDescriptor& fd, const constantPoolHandle& pool, int index, const methodHandle& method, Bytecodes::Code byte, TRAPS) {
< prev index next >