src/share/vm/interpreter/linkResolver.cpp

changeset 2015
083fde3b838e
parent 1907
c18cbe5936b8
child 2138
d5d065957597
     1.1 --- a/src/share/vm/interpreter/linkResolver.cpp	Thu Jul 15 08:54:48 2010 -0700
     1.2 +++ b/src/share/vm/interpreter/linkResolver.cpp	Thu Jul 15 18:40:45 2010 -0700
     1.3 @@ -67,6 +67,15 @@
     1.4    set_common(resolved_klass, selected_klass, resolved_method, selected_method, vtable_index, CHECK);
     1.5  }
     1.6  
     1.7 +void CallInfo::set_dynamic(methodHandle resolved_method, TRAPS) {
     1.8 +  assert(resolved_method->is_method_handle_invoke(), "");
     1.9 +  KlassHandle resolved_klass = SystemDictionaryHandles::MethodHandle_klass();
    1.10 +  assert(resolved_klass == resolved_method->method_holder(), "");
    1.11 +  int vtable_index = methodOopDesc::nonvirtual_vtable_index;
    1.12 +  assert(resolved_method->vtable_index() == vtable_index, "");
    1.13 +  set_common(resolved_klass, KlassHandle(), resolved_method, resolved_method, vtable_index, CHECK);
    1.14 +}
    1.15 +
    1.16  void CallInfo::set_common(KlassHandle resolved_klass, KlassHandle selected_klass, methodHandle resolved_method, methodHandle selected_method, int vtable_index, TRAPS) {
    1.17    assert(resolved_method->signature() == selected_method->signature(), "signatures must correspond");
    1.18    _resolved_klass  = resolved_klass;
    1.19 @@ -176,9 +185,20 @@
    1.20                                            KlassHandle klass, symbolHandle name, symbolHandle signature,
    1.21                                            KlassHandle current_klass,
    1.22                                            TRAPS) {
    1.23 -  if (EnableMethodHandles && MethodHandles::enabled() &&
    1.24 +  if (EnableMethodHandles &&
    1.25        klass() == SystemDictionary::MethodHandle_klass() &&
    1.26        methodOopDesc::is_method_handle_invoke_name(name())) {
    1.27 +    if (!MethodHandles::enabled()) {
    1.28 +      // Make sure the Java part of the runtime has been booted up.
    1.29 +      klassOop natives = SystemDictionary::MethodHandleNatives_klass();
    1.30 +      if (natives == NULL || instanceKlass::cast(natives)->is_not_initialized()) {
    1.31 +        SystemDictionary::resolve_or_fail(vmSymbolHandles::sun_dyn_MethodHandleNatives(),
    1.32 +                                          Handle(),
    1.33 +                                          Handle(),
    1.34 +                                          true,
    1.35 +                                          CHECK);
    1.36 +      }
    1.37 +    }
    1.38      methodOop result_oop = SystemDictionary::find_method_handle_invoke(name,
    1.39                                                                         signature,
    1.40                                                                         current_klass,
    1.41 @@ -1065,7 +1085,7 @@
    1.42    if (resolved_method.is_null()) {
    1.43      THROW(vmSymbols::java_lang_InternalError());
    1.44    }
    1.45 -  result.set_virtual(resolved_klass, KlassHandle(), resolved_method, resolved_method, resolved_method->vtable_index(), CHECK);
    1.46 +  result.set_dynamic(resolved_method, CHECK);
    1.47  }
    1.48  
    1.49  //------------------------------------------------------------------------------------------------------------------------

mercurial