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 }