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 |