170 void LinkResolver::lookup_method_in_interfaces(methodHandle& result, KlassHandle klass, symbolHandle name, symbolHandle signature, TRAPS) { |
170 void LinkResolver::lookup_method_in_interfaces(methodHandle& result, KlassHandle klass, symbolHandle name, symbolHandle signature, TRAPS) { |
171 instanceKlass *ik = instanceKlass::cast(klass()); |
171 instanceKlass *ik = instanceKlass::cast(klass()); |
172 result = methodHandle(THREAD, ik->lookup_method_in_all_interfaces(name(), signature())); |
172 result = methodHandle(THREAD, ik->lookup_method_in_all_interfaces(name(), signature())); |
173 } |
173 } |
174 |
174 |
175 void LinkResolver::lookup_implicit_method(methodHandle& result, KlassHandle klass, symbolHandle name, symbolHandle signature, TRAPS) { |
175 void LinkResolver::lookup_implicit_method(methodHandle& result, |
|
176 KlassHandle klass, symbolHandle name, symbolHandle signature, |
|
177 KlassHandle current_klass, |
|
178 TRAPS) { |
176 if (EnableMethodHandles && MethodHandles::enabled() && |
179 if (EnableMethodHandles && MethodHandles::enabled() && |
177 klass() == SystemDictionary::MethodHandle_klass() && |
180 klass() == SystemDictionary::MethodHandle_klass() && |
178 methodOopDesc::is_method_handle_invoke_name(name())) { |
181 methodOopDesc::is_method_handle_invoke_name(name())) { |
179 methodOop result_oop = SystemDictionary::find_method_handle_invoke(name, |
182 methodOop result_oop = SystemDictionary::find_method_handle_invoke(name, |
180 signature, |
183 signature, |
181 Handle(), |
184 current_klass, |
182 Handle(), |
|
183 CHECK); |
185 CHECK); |
184 if (result_oop != NULL) { |
186 if (result_oop != NULL) { |
185 assert(result_oop->is_method_handle_invoke() && result_oop->signature() == signature(), "consistent"); |
187 assert(result_oop->is_method_handle_invoke() && result_oop->signature() == signature(), "consistent"); |
186 result = methodHandle(THREAD, result_oop); |
188 result = methodHandle(THREAD, result_oop); |
187 } |
189 } |
288 // 3. lookup method in all the interfaces implemented by the resolved klass |
290 // 3. lookup method in all the interfaces implemented by the resolved klass |
289 lookup_method_in_interfaces(resolved_method, resolved_klass, method_name, method_signature, CHECK); |
291 lookup_method_in_interfaces(resolved_method, resolved_klass, method_name, method_signature, CHECK); |
290 |
292 |
291 if (resolved_method.is_null()) { |
293 if (resolved_method.is_null()) { |
292 // JSR 292: see if this is an implicitly generated method MethodHandle.invoke(*...) |
294 // JSR 292: see if this is an implicitly generated method MethodHandle.invoke(*...) |
293 lookup_implicit_method(resolved_method, resolved_klass, method_name, method_signature, CHECK); |
295 lookup_implicit_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, CHECK); |
294 } |
296 } |
295 |
297 |
296 if (resolved_method.is_null()) { |
298 if (resolved_method.is_null()) { |
297 // 4. method lookup failed |
299 // 4. method lookup failed |
298 ResourceMark rm(THREAD); |
300 ResourceMark rm(THREAD); |
1056 KlassHandle resolved_klass = SystemDictionaryHandles::MethodHandle_klass(); |
1058 KlassHandle resolved_klass = SystemDictionaryHandles::MethodHandle_klass(); |
1057 |
1059 |
1058 // JSR 292: this must be an implicitly generated method MethodHandle.invokeExact(*...) |
1060 // JSR 292: this must be an implicitly generated method MethodHandle.invokeExact(*...) |
1059 // The extra MH receiver will be inserted into the stack on every call. |
1061 // The extra MH receiver will be inserted into the stack on every call. |
1060 methodHandle resolved_method; |
1062 methodHandle resolved_method; |
1061 lookup_implicit_method(resolved_method, resolved_klass, method_name, method_signature, CHECK); |
1063 KlassHandle current_klass(THREAD, pool->pool_holder()); |
|
1064 lookup_implicit_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, CHECK); |
1062 if (resolved_method.is_null()) { |
1065 if (resolved_method.is_null()) { |
1063 THROW(vmSymbols::java_lang_InternalError()); |
1066 THROW(vmSymbols::java_lang_InternalError()); |
1064 } |
1067 } |
1065 result.set_virtual(resolved_klass, KlassHandle(), resolved_method, resolved_method, resolved_method->vtable_index(), CHECK); |
1068 result.set_virtual(resolved_klass, KlassHandle(), resolved_method, resolved_method, resolved_method->vtable_index(), CHECK); |
1066 } |
1069 } |