--- a/hotspot/src/share/vm/interpreter/linkResolver.cpp Thu Jul 15 08:54:48 2010 -0700
+++ b/hotspot/src/share/vm/interpreter/linkResolver.cpp Thu Jul 15 18:40:45 2010 -0700
@@ -67,6 +67,15 @@
set_common(resolved_klass, selected_klass, resolved_method, selected_method, vtable_index, CHECK);
}
+void CallInfo::set_dynamic(methodHandle resolved_method, TRAPS) {
+ assert(resolved_method->is_method_handle_invoke(), "");
+ KlassHandle resolved_klass = SystemDictionaryHandles::MethodHandle_klass();
+ assert(resolved_klass == resolved_method->method_holder(), "");
+ int vtable_index = methodOopDesc::nonvirtual_vtable_index;
+ assert(resolved_method->vtable_index() == vtable_index, "");
+ set_common(resolved_klass, KlassHandle(), resolved_method, resolved_method, vtable_index, CHECK);
+}
+
void CallInfo::set_common(KlassHandle resolved_klass, KlassHandle selected_klass, methodHandle resolved_method, methodHandle selected_method, int vtable_index, TRAPS) {
assert(resolved_method->signature() == selected_method->signature(), "signatures must correspond");
_resolved_klass = resolved_klass;
@@ -176,9 +185,20 @@
KlassHandle klass, symbolHandle name, symbolHandle signature,
KlassHandle current_klass,
TRAPS) {
- if (EnableMethodHandles && MethodHandles::enabled() &&
+ if (EnableMethodHandles &&
klass() == SystemDictionary::MethodHandle_klass() &&
methodOopDesc::is_method_handle_invoke_name(name())) {
+ if (!MethodHandles::enabled()) {
+ // Make sure the Java part of the runtime has been booted up.
+ klassOop natives = SystemDictionary::MethodHandleNatives_klass();
+ if (natives == NULL || instanceKlass::cast(natives)->is_not_initialized()) {
+ SystemDictionary::resolve_or_fail(vmSymbolHandles::sun_dyn_MethodHandleNatives(),
+ Handle(),
+ Handle(),
+ true,
+ CHECK);
+ }
+ }
methodOop result_oop = SystemDictionary::find_method_handle_invoke(name,
signature,
current_klass,
@@ -1065,7 +1085,7 @@
if (resolved_method.is_null()) {
THROW(vmSymbols::java_lang_InternalError());
}
- result.set_virtual(resolved_klass, KlassHandle(), resolved_method, resolved_method, resolved_method->vtable_index(), CHECK);
+ result.set_dynamic(resolved_method, CHECK);
}
//------------------------------------------------------------------------------------------------------------------------