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 //------------------------------------------------------------------------------------------------------------------------