136 // |
136 // |
137 // According to JVM spec. $5.4.3c & $5.4.3d |
137 // According to JVM spec. $5.4.3c & $5.4.3d |
138 |
138 |
139 void LinkResolver::lookup_method_in_klasses(methodHandle& result, KlassHandle klass, symbolHandle name, symbolHandle signature, TRAPS) { |
139 void LinkResolver::lookup_method_in_klasses(methodHandle& result, KlassHandle klass, symbolHandle name, symbolHandle signature, TRAPS) { |
140 methodOop result_oop = klass->uncached_lookup_method(name(), signature()); |
140 methodOop result_oop = klass->uncached_lookup_method(name(), signature()); |
|
141 if (EnableMethodHandles && result_oop != NULL) { |
|
142 switch (result_oop->intrinsic_id()) { |
|
143 case vmIntrinsics::_invokeExact: |
|
144 case vmIntrinsics::_invokeGeneric: |
|
145 case vmIntrinsics::_invokeDynamic: |
|
146 // Do not link directly to these. The VM must produce a synthetic one using lookup_implicit_method. |
|
147 return; |
|
148 } |
|
149 } |
141 result = methodHandle(THREAD, result_oop); |
150 result = methodHandle(THREAD, result_oop); |
142 } |
151 } |
143 |
152 |
144 // returns first instance method |
153 // returns first instance method |
145 void LinkResolver::lookup_instance_method_in_klasses(methodHandle& result, KlassHandle klass, symbolHandle name, symbolHandle signature, TRAPS) { |
154 void LinkResolver::lookup_instance_method_in_klasses(methodHandle& result, KlassHandle klass, symbolHandle name, symbolHandle signature, TRAPS) { |
163 result = methodHandle(THREAD, ik->lookup_method_in_all_interfaces(name(), signature())); |
172 result = methodHandle(THREAD, ik->lookup_method_in_all_interfaces(name(), signature())); |
164 } |
173 } |
165 |
174 |
166 void LinkResolver::lookup_implicit_method(methodHandle& result, KlassHandle klass, symbolHandle name, symbolHandle signature, TRAPS) { |
175 void LinkResolver::lookup_implicit_method(methodHandle& result, KlassHandle klass, symbolHandle name, symbolHandle signature, TRAPS) { |
167 if (EnableMethodHandles && MethodHandles::enabled() && |
176 if (EnableMethodHandles && MethodHandles::enabled() && |
168 name == vmSymbolHandles::invoke_name() && klass() == SystemDictionary::MethodHandle_klass()) { |
177 klass() == SystemDictionary::MethodHandle_klass() && |
169 methodOop result_oop = SystemDictionary::find_method_handle_invoke(signature, |
178 methodOopDesc::is_method_handle_invoke_name(name())) { |
|
179 methodOop result_oop = SystemDictionary::find_method_handle_invoke(name, |
|
180 signature, |
170 Handle(), |
181 Handle(), |
171 Handle(), |
182 Handle(), |
172 CHECK); |
183 CHECK); |
173 if (result_oop != NULL) { |
184 if (result_oop != NULL) { |
174 assert(result_oop->is_method_handle_invoke() && result_oop->signature() == signature(), "consistent"); |
185 assert(result_oop->is_method_handle_invoke() && result_oop->signature() == signature(), "consistent"); |
237 |
248 |
238 void LinkResolver::resolve_dynamic_method(methodHandle& resolved_method, KlassHandle& resolved_klass, constantPoolHandle pool, int index, TRAPS) { |
249 void LinkResolver::resolve_dynamic_method(methodHandle& resolved_method, KlassHandle& resolved_klass, constantPoolHandle pool, int index, TRAPS) { |
239 // The class is java.dyn.MethodHandle |
250 // The class is java.dyn.MethodHandle |
240 resolved_klass = SystemDictionaryHandles::MethodHandle_klass(); |
251 resolved_klass = SystemDictionaryHandles::MethodHandle_klass(); |
241 |
252 |
242 symbolHandle method_name = vmSymbolHandles::invoke_name(); |
253 symbolHandle method_name = vmSymbolHandles::invokeExact_name(); |
243 |
254 |
244 symbolHandle method_signature(THREAD, pool->signature_ref_at(index)); |
255 symbolHandle method_signature(THREAD, pool->signature_ref_at(index)); |
245 KlassHandle current_klass (THREAD, pool->pool_holder()); |
256 KlassHandle current_klass (THREAD, pool->pool_holder()); |
246 |
257 |
247 resolve_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, true, CHECK); |
258 resolve_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, true, CHECK); |
1039 |
1050 |
1040 // This guy is reached from InterpreterRuntime::resolve_invokedynamic. |
1051 // This guy is reached from InterpreterRuntime::resolve_invokedynamic. |
1041 |
1052 |
1042 // At this point, we only need the signature, and can ignore the name. |
1053 // At this point, we only need the signature, and can ignore the name. |
1043 symbolHandle method_signature(THREAD, pool->signature_ref_at(raw_index)); // raw_index works directly |
1054 symbolHandle method_signature(THREAD, pool->signature_ref_at(raw_index)); // raw_index works directly |
1044 symbolHandle method_name = vmSymbolHandles::invoke_name(); |
1055 symbolHandle method_name = vmSymbolHandles::invokeExact_name(); |
1045 KlassHandle resolved_klass = SystemDictionaryHandles::MethodHandle_klass(); |
1056 KlassHandle resolved_klass = SystemDictionaryHandles::MethodHandle_klass(); |
1046 |
1057 |
1047 // JSR 292: this must be an implicitly generated method MethodHandle.invoke(*...) |
1058 // JSR 292: this must be an implicitly generated method MethodHandle.invokeExact(*...) |
1048 // The extra MH receiver will be inserted into the stack on every call. |
1059 // The extra MH receiver will be inserted into the stack on every call. |
1049 methodHandle resolved_method; |
1060 methodHandle resolved_method; |
1050 lookup_implicit_method(resolved_method, resolved_klass, method_name, method_signature, CHECK); |
1061 lookup_implicit_method(resolved_method, resolved_klass, method_name, method_signature, CHECK); |
1051 if (resolved_method.is_null()) { |
1062 if (resolved_method.is_null()) { |
1052 THROW(vmSymbols::java_lang_InternalError()); |
1063 THROW(vmSymbols::java_lang_InternalError()); |