1.1 --- a/src/share/vm/interpreter/linkResolver.cpp Fri Sep 28 14:36:20 2012 -0700 1.2 +++ b/src/share/vm/interpreter/linkResolver.cpp Mon Oct 01 14:50:10 2012 -0700 1.3 @@ -99,7 +99,7 @@ 1.4 assert(!resolved_method->is_compiled_lambda_form(), "these must be handled via an invokehandle call"); 1.5 } 1.6 1.7 -void CallInfo::set_handle(methodHandle resolved_method, Handle resolved_appendix, TRAPS) { 1.8 +void CallInfo::set_handle(methodHandle resolved_method, Handle resolved_appendix, Handle resolved_method_type, TRAPS) { 1.9 if (resolved_method.is_null()) { 1.10 THROW_MSG(vmSymbols::java_lang_InternalError(), "resolved method is null"); 1.11 } 1.12 @@ -110,7 +110,8 @@ 1.13 int vtable_index = Method::nonvirtual_vtable_index; 1.14 assert(resolved_method->vtable_index() == vtable_index, ""); 1.15 set_common(resolved_klass, resolved_klass, resolved_method, resolved_method, vtable_index, CHECK); 1.16 - _resolved_appendix = resolved_appendix; 1.17 + _resolved_appendix = resolved_appendix; 1.18 + _resolved_method_type = resolved_method_type; 1.19 } 1.20 1.21 void CallInfo::set_common(KlassHandle resolved_klass, KlassHandle selected_klass, methodHandle resolved_method, methodHandle selected_method, int vtable_index, TRAPS) { 1.22 @@ -221,7 +222,8 @@ 1.23 void LinkResolver::lookup_polymorphic_method(methodHandle& result, 1.24 KlassHandle klass, Symbol* name, Symbol* full_signature, 1.25 KlassHandle current_klass, 1.26 - Handle* appendix_result_or_null, 1.27 + Handle *appendix_result_or_null, 1.28 + Handle *method_type_result, 1.29 TRAPS) { 1.30 vmIntrinsics::ID iid = MethodHandles::signature_polymorphic_name_id(name); 1.31 if (TraceMethodHandles) { 1.32 @@ -275,10 +277,12 @@ 1.33 } 1.34 1.35 Handle appendix; 1.36 + Handle method_type; 1.37 result = SystemDictionary::find_method_handle_invoker(name, 1.38 full_signature, 1.39 current_klass, 1.40 &appendix, 1.41 + &method_type, 1.42 CHECK); 1.43 if (TraceMethodHandles) { 1.44 tty->print("lookup_polymorphic_method => (via Java) "); 1.45 @@ -307,6 +311,7 @@ 1.46 1.47 assert(appendix_result_or_null != NULL, ""); 1.48 (*appendix_result_or_null) = appendix; 1.49 + (*method_type_result) = method_type; 1.50 return; 1.51 } 1.52 } 1.53 @@ -419,7 +424,7 @@ 1.54 if (resolved_method.is_null()) { 1.55 // JSR 292: see if this is an implicitly generated method MethodHandle.linkToVirtual(*...), etc 1.56 lookup_polymorphic_method(resolved_method, resolved_klass, method_name, method_signature, 1.57 - current_klass, (Handle*)NULL, THREAD); 1.58 + current_klass, (Handle*)NULL, (Handle*)NULL, THREAD); 1.59 if (HAS_PENDING_EXCEPTION) { 1.60 nested_exception = Handle(THREAD, PENDING_EXCEPTION); 1.61 CLEAR_PENDING_EXCEPTION; 1.62 @@ -1207,11 +1212,12 @@ 1.63 assert(resolved_klass() == SystemDictionary::MethodHandle_klass(), ""); 1.64 assert(MethodHandles::is_signature_polymorphic_name(method_name), ""); 1.65 methodHandle resolved_method; 1.66 - Handle resolved_appendix; 1.67 + Handle resolved_appendix; 1.68 + Handle resolved_method_type; 1.69 lookup_polymorphic_method(resolved_method, resolved_klass, 1.70 method_name, method_signature, 1.71 - current_klass, &resolved_appendix, CHECK); 1.72 - result.set_handle(resolved_method, resolved_appendix, CHECK); 1.73 + current_klass, &resolved_appendix, &resolved_method_type, CHECK); 1.74 + result.set_handle(resolved_method, resolved_appendix, resolved_method_type, CHECK); 1.75 } 1.76 1.77 1.78 @@ -1219,7 +1225,7 @@ 1.79 assert(EnableInvokeDynamic, ""); 1.80 pool->set_invokedynamic(); // mark header to flag active call sites 1.81 1.82 - //resolve_pool(<resolved_klass>, method_name, method_signature, current_klass, pool, index, CHECK); 1.83 + //resolve_pool(<resolved_klass>, method_name, method_signature, current_klass, pool, index, CHECK); 1.84 Symbol* method_name = pool->name_ref_at(index); 1.85 Symbol* method_signature = pool->signature_ref_at(index); 1.86 KlassHandle current_klass = KlassHandle(THREAD, pool->pool_holder()); 1.87 @@ -1236,9 +1242,10 @@ 1.88 bootstrap_specifier = Handle(THREAD, bsm_info); 1.89 } 1.90 if (!cpce->is_f1_null()) { 1.91 - methodHandle method(THREAD, cpce->f1_as_method()); 1.92 - Handle appendix(THREAD, cpce->appendix_if_resolved(pool)); 1.93 - result.set_handle(method, appendix, CHECK); 1.94 + methodHandle method( THREAD, cpce->f1_as_method()); 1.95 + Handle appendix( THREAD, cpce->appendix_if_resolved(pool)); 1.96 + Handle method_type(THREAD, cpce->method_type_if_resolved(pool)); 1.97 + result.set_handle(method, appendix, method_type, CHECK); 1.98 return; 1.99 } 1.100 1.101 @@ -1260,11 +1267,13 @@ 1.102 // JSR 292: this must resolve to an implicitly generated method MH.linkToCallSite(*...) 1.103 // The appendix argument is likely to be a freshly-created CallSite. 1.104 Handle resolved_appendix; 1.105 + Handle resolved_method_type; 1.106 methodHandle resolved_method = 1.107 SystemDictionary::find_dynamic_call_site_invoker(current_klass, 1.108 bootstrap_specifier, 1.109 method_name, method_signature, 1.110 &resolved_appendix, 1.111 + &resolved_method_type, 1.112 THREAD); 1.113 if (HAS_PENDING_EXCEPTION) { 1.114 if (TraceMethodHandles) { 1.115 @@ -1284,7 +1293,7 @@ 1.116 CLEAR_PENDING_EXCEPTION; 1.117 THROW_CAUSE(vmSymbols::java_lang_BootstrapMethodError(), nested_exception) 1.118 } 1.119 - result.set_handle(resolved_method, resolved_appendix, CHECK); 1.120 + result.set_handle(resolved_method, resolved_appendix, resolved_method_type, CHECK); 1.121 } 1.122 1.123 //------------------------------------------------------------------------------------------------------------------------