--- a/src/hotspot/share/interpreter/linkResolver.cpp Thu Oct 26 11:35:09 2017 -0700
+++ b/src/hotspot/share/interpreter/linkResolver.cpp Mon Oct 30 21:23:10 2017 +0100
@@ -1075,11 +1075,7 @@
const LinkInfo& link_info,
TRAPS) {
methodHandle resolved_method = linktime_resolve_special_method(link_info, CHECK);
- runtime_resolve_special_method(result, resolved_method,
- link_info.resolved_klass(),
- link_info.current_klass(),
- recv,
- link_info.check_access(), CHECK);
+ runtime_resolve_special_method(result, link_info, resolved_method, recv, CHECK);
}
// throws linktime exceptions
@@ -1163,11 +1159,11 @@
// throws runtime exceptions
void LinkResolver::runtime_resolve_special_method(CallInfo& result,
+ const LinkInfo& link_info,
const methodHandle& resolved_method,
- Klass* resolved_klass,
- Klass* current_klass,
- Handle recv,
- bool check_access, TRAPS) {
+ Handle recv, TRAPS) {
+
+ Klass* resolved_klass = link_info.resolved_klass();
// resolved method is selected method unless we have an old-style lookup
// for a superclass method
@@ -1175,12 +1171,13 @@
// no checks for shadowing
methodHandle sel_method(THREAD, resolved_method());
- if (check_access &&
+ if (link_info.check_access() &&
// check if the method is not <init>
resolved_method->name() != vmSymbols::object_initializer_name()) {
- // check if this is an old-style super call and do a new lookup if so
+ // check if this is an old-style super call and do a new lookup if so
// a) check if ACC_SUPER flag is set for the current class
+ Klass* current_klass = link_info.current_klass();
if ((current_klass->is_super() || !AllowNonVirtualCalls) &&
// b) check if the class of the resolved_klass is a superclass
// (not supertype in order to exclude interface classes) of the current class.
@@ -1200,6 +1197,9 @@
Method::name_and_sig_as_C_string(resolved_klass,
resolved_method->name(),
resolved_method->signature()));
+ // check loader constraints if found a different method
+ } else if (sel_method() != resolved_method()) {
+ check_method_loader_constraints(link_info, sel_method, "method", CHECK);
}
}