--- a/hotspot/src/share/vm/interpreter/linkResolver.cpp Thu Jul 27 15:36:15 2017 +0200
+++ b/hotspot/src/share/vm/interpreter/linkResolver.cpp Thu Jul 27 18:06:41 2017 -0400
@@ -235,7 +235,7 @@
//------------------------------------------------------------------------------------------------------------------------
// Implementation of LinkInfo
-LinkInfo::LinkInfo(const constantPoolHandle& pool, int index, methodHandle current_method, TRAPS) {
+LinkInfo::LinkInfo(const constantPoolHandle& pool, int index, const methodHandle& current_method, TRAPS) {
// resolve klass
_resolved_klass = pool->klass_ref_at(index, CHECK);
@@ -315,9 +315,11 @@
// Look up method in klasses, including static methods
// Then look up local default methods
-methodHandle LinkResolver::lookup_method_in_klasses(const LinkInfo& link_info,
- bool checkpolymorphism,
- bool in_imethod_resolve, TRAPS) {
+Method* LinkResolver::lookup_method_in_klasses(const LinkInfo& link_info,
+ bool checkpolymorphism,
+ bool in_imethod_resolve) {
+ NoSafepointVerifier nsv; // Method* returned may not be reclaimed
+
Klass* klass = link_info.resolved_klass();
Symbol* name = link_info.name();
Symbol* signature = link_info.signature();
@@ -327,7 +329,7 @@
if (klass->is_array_klass()) {
// Only consider klass and super klass for arrays
- return methodHandle(THREAD, result);
+ return result;
}
InstanceKlass* ik = InstanceKlass::cast(klass);
@@ -363,7 +365,7 @@
return NULL;
}
}
- return methodHandle(THREAD, result);
+ return result;
}
// returns first instance method
@@ -418,15 +420,13 @@
return vtable_index;
}
-methodHandle LinkResolver::lookup_method_in_interfaces(const LinkInfo& cp_info, TRAPS) {
+Method* LinkResolver::lookup_method_in_interfaces(const LinkInfo& cp_info) {
InstanceKlass *ik = InstanceKlass::cast(cp_info.resolved_klass());
// Specify 'true' in order to skip default methods when searching the
// interfaces. Function lookup_method_in_klasses() already looked for
// the method in the default methods table.
- return methodHandle(THREAD,
- ik->lookup_method_in_all_interfaces(cp_info.name(), cp_info.signature(),
- Klass::skip_defaults));
+ return ik->lookup_method_in_all_interfaces(cp_info.name(), cp_info.signature(), Klass::skip_defaults);
}
methodHandle LinkResolver::lookup_polymorphic_method(
@@ -713,13 +713,12 @@
THROW_MSG_NULL(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
}
-
// 3. lookup method in resolved klass and its super klasses
- methodHandle resolved_method = lookup_method_in_klasses(link_info, true, false, CHECK_NULL);
+ methodHandle resolved_method(THREAD, lookup_method_in_klasses(link_info, true, false));
// 4. lookup method in all the interfaces implemented by the resolved klass
if (resolved_method.is_null() && !resolved_klass->is_array_klass()) { // not found in the class hierarchy
- resolved_method = lookup_method_in_interfaces(link_info, CHECK_NULL);
+ resolved_method = methodHandle(THREAD, lookup_method_in_interfaces(link_info));
if (resolved_method.is_null()) {
// JSR 292: see if this is an implicitly generated method MethodHandle.linkToVirtual(*...), etc
@@ -817,11 +816,11 @@
// lookup method in this interface or its super, java.lang.Object
// JDK8: also look for static methods
- methodHandle resolved_method = lookup_method_in_klasses(link_info, false, true, CHECK_NULL);
+ methodHandle resolved_method(THREAD, lookup_method_in_klasses(link_info, false, true));
if (resolved_method.is_null() && !resolved_klass->is_array_klass()) {
// lookup method in all the super-interfaces
- resolved_method = lookup_method_in_interfaces(link_info, CHECK_NULL);
+ resolved_method = methodHandle(THREAD, lookup_method_in_interfaces(link_info));
}
if (resolved_method.is_null()) {