hotspot/src/share/vm/interpreter/linkResolver.cpp
changeset 6062 bab93afe9df7
parent 5547 f4b087cbb361
child 6453 970dc585ab63
equal deleted inserted replaced
5929:279fd26a4b68 6062:bab93afe9df7
    65 void CallInfo::set_virtual(KlassHandle resolved_klass, KlassHandle selected_klass, methodHandle resolved_method, methodHandle selected_method, int vtable_index, TRAPS) {
    65 void CallInfo::set_virtual(KlassHandle resolved_klass, KlassHandle selected_klass, methodHandle resolved_method, methodHandle selected_method, int vtable_index, TRAPS) {
    66   assert(vtable_index >= 0 || vtable_index == methodOopDesc::nonvirtual_vtable_index, "valid index");
    66   assert(vtable_index >= 0 || vtable_index == methodOopDesc::nonvirtual_vtable_index, "valid index");
    67   set_common(resolved_klass, selected_klass, resolved_method, selected_method, vtable_index, CHECK);
    67   set_common(resolved_klass, selected_klass, resolved_method, selected_method, vtable_index, CHECK);
    68 }
    68 }
    69 
    69 
       
    70 void CallInfo::set_dynamic(methodHandle resolved_method, TRAPS) {
       
    71   assert(resolved_method->is_method_handle_invoke(), "");
       
    72   KlassHandle resolved_klass = SystemDictionaryHandles::MethodHandle_klass();
       
    73   assert(resolved_klass == resolved_method->method_holder(), "");
       
    74   int vtable_index = methodOopDesc::nonvirtual_vtable_index;
       
    75   assert(resolved_method->vtable_index() == vtable_index, "");
       
    76   set_common(resolved_klass, KlassHandle(), resolved_method, resolved_method, vtable_index, CHECK);
       
    77 }
       
    78 
    70 void CallInfo::set_common(KlassHandle resolved_klass, KlassHandle selected_klass, methodHandle resolved_method, methodHandle selected_method, int vtable_index, TRAPS) {
    79 void CallInfo::set_common(KlassHandle resolved_klass, KlassHandle selected_klass, methodHandle resolved_method, methodHandle selected_method, int vtable_index, TRAPS) {
    71   assert(resolved_method->signature() == selected_method->signature(), "signatures must correspond");
    80   assert(resolved_method->signature() == selected_method->signature(), "signatures must correspond");
    72   _resolved_klass  = resolved_klass;
    81   _resolved_klass  = resolved_klass;
    73   _selected_klass  = selected_klass;
    82   _selected_klass  = selected_klass;
    74   _resolved_method = resolved_method;
    83   _resolved_method = resolved_method;
   174 
   183 
   175 void LinkResolver::lookup_implicit_method(methodHandle& result,
   184 void LinkResolver::lookup_implicit_method(methodHandle& result,
   176                                           KlassHandle klass, symbolHandle name, symbolHandle signature,
   185                                           KlassHandle klass, symbolHandle name, symbolHandle signature,
   177                                           KlassHandle current_klass,
   186                                           KlassHandle current_klass,
   178                                           TRAPS) {
   187                                           TRAPS) {
   179   if (EnableMethodHandles && MethodHandles::enabled() &&
   188   if (EnableMethodHandles &&
   180       klass() == SystemDictionary::MethodHandle_klass() &&
   189       klass() == SystemDictionary::MethodHandle_klass() &&
   181       methodOopDesc::is_method_handle_invoke_name(name())) {
   190       methodOopDesc::is_method_handle_invoke_name(name())) {
       
   191     if (!MethodHandles::enabled()) {
       
   192       // Make sure the Java part of the runtime has been booted up.
       
   193       klassOop natives = SystemDictionary::MethodHandleNatives_klass();
       
   194       if (natives == NULL || instanceKlass::cast(natives)->is_not_initialized()) {
       
   195         SystemDictionary::resolve_or_fail(vmSymbolHandles::sun_dyn_MethodHandleNatives(),
       
   196                                           Handle(),
       
   197                                           Handle(),
       
   198                                           true,
       
   199                                           CHECK);
       
   200       }
       
   201     }
   182     methodOop result_oop = SystemDictionary::find_method_handle_invoke(name,
   202     methodOop result_oop = SystemDictionary::find_method_handle_invoke(name,
   183                                                                        signature,
   203                                                                        signature,
   184                                                                        current_klass,
   204                                                                        current_klass,
   185                                                                        CHECK);
   205                                                                        CHECK);
   186     if (result_oop != NULL) {
   206     if (result_oop != NULL) {
  1063   KlassHandle current_klass(THREAD, pool->pool_holder());
  1083   KlassHandle current_klass(THREAD, pool->pool_holder());
  1064   lookup_implicit_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, CHECK);
  1084   lookup_implicit_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, CHECK);
  1065   if (resolved_method.is_null()) {
  1085   if (resolved_method.is_null()) {
  1066     THROW(vmSymbols::java_lang_InternalError());
  1086     THROW(vmSymbols::java_lang_InternalError());
  1067   }
  1087   }
  1068   result.set_virtual(resolved_klass, KlassHandle(), resolved_method, resolved_method, resolved_method->vtable_index(), CHECK);
  1088   result.set_dynamic(resolved_method, CHECK);
  1069 }
  1089 }
  1070 
  1090 
  1071 //------------------------------------------------------------------------------------------------------------------------
  1091 //------------------------------------------------------------------------------------------------------------------------
  1072 #ifndef PRODUCT
  1092 #ifndef PRODUCT
  1073 
  1093