src/share/vm/interpreter/linkResolver.cpp

changeset 4133
f6b0eb4e44cf
parent 4041
d17383603741
child 4245
4735d2c84362
child 4702
77443715ec55
     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  //------------------------------------------------------------------------------------------------------------------------

mercurial