Mercurial > hg > graal-compiler
comparison src/share/vm/interpreter/linkResolver.cpp @ 1508:2ffde6cfe049
6939196: method handle signatures off the boot class path get linkage errors
Summary: Adjust MethodType lookup logic to search off the BCP, but not to cache those results
Reviewed-by: twisti
author | jrose |
---|---|
date | Sat, 01 May 2010 21:57:35 -0700 |
parents | cd5dbf694d45 |
children | c18cbe5936b8 |
comparison
equal
deleted
inserted
replaced
1507:cd5dbf694d45 | 1508:2ffde6cfe049 |
---|---|
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 } |