159 160 void LinkResolver::resolve_klass(KlassHandle& result, constantPoolHandle pool, int index, TRAPS) { 161 klassOop result_oop = pool->klass_ref_at(index, CHECK); 162 result = KlassHandle(THREAD, result_oop); 163 } 164 165 void LinkResolver::resolve_klass_no_update(KlassHandle& result, constantPoolHandle pool, int index, TRAPS) { 166 klassOop result_oop = 167 constantPoolOopDesc::klass_ref_at_if_loaded_check(pool, index, CHECK); 168 result = KlassHandle(THREAD, result_oop); 169 } 170 171 172 //------------------------------------------------------------------------------------------------------------------------ 173 // Method resolution 174 // 175 // According to JVM spec. $5.4.3c & $5.4.3d 176 177 void LinkResolver::lookup_method_in_klasses(methodHandle& result, KlassHandle klass, Symbol* name, Symbol* signature, TRAPS) { 178 methodOop result_oop = klass->uncached_lookup_method(name, signature); 179 if (EnableMethodHandles && result_oop != NULL) { 180 switch (result_oop->intrinsic_id()) { 181 case vmIntrinsics::_invokeExact: 182 case vmIntrinsics::_invokeGeneric: 183 case vmIntrinsics::_invokeDynamic: 184 // Do not link directly to these. The VM must produce a synthetic one using lookup_implicit_method. 185 return; 186 } 187 } 188 result = methodHandle(THREAD, result_oop); 189 } 190 191 // returns first instance method 192 void LinkResolver::lookup_instance_method_in_klasses(methodHandle& result, KlassHandle klass, Symbol* name, Symbol* signature, TRAPS) { 193 methodOop result_oop = klass->uncached_lookup_method(name, signature); 194 result = methodHandle(THREAD, result_oop); 195 while (!result.is_null() && result->is_static()) { 196 klass = KlassHandle(THREAD, Klass::cast(result->method_holder())->super()); 197 result = methodHandle(THREAD, klass->uncached_lookup_method(name, signature)); 198 } 199 } 200 201 202 int LinkResolver::vtable_index_of_miranda_method(KlassHandle klass, Symbol* name, Symbol* signature, TRAPS) { 203 ResourceMark rm(THREAD); 204 klassVtable *vt = instanceKlass::cast(klass())->vtable(); 205 return vt->index_of_miranda(name, signature); 206 } 207 208 void LinkResolver::lookup_method_in_interfaces(methodHandle& result, KlassHandle klass, Symbol* name, Symbol* signature, TRAPS) { 209 instanceKlass *ik = instanceKlass::cast(klass()); 210 result = methodHandle(THREAD, ik->lookup_method_in_all_interfaces(name, signature)); 211 } 212 213 void LinkResolver::lookup_implicit_method(methodHandle& result, 214 KlassHandle klass, Symbol* name, Symbol* signature, 215 KlassHandle current_klass, 216 TRAPS) { 217 if (EnableMethodHandles && 218 klass() == SystemDictionary::MethodHandle_klass() && 219 methodOopDesc::is_method_handle_invoke_name(name)) { 220 if (!THREAD->is_Compiler_thread() && !MethodHandles::enabled()) { 221 // Make sure the Java part of the runtime has been booted up. 222 klassOop natives = SystemDictionary::MethodHandleNatives_klass(); 223 if (natives == NULL || instanceKlass::cast(natives)->is_not_initialized()) { 224 Symbol* natives_name = vmSymbols::java_lang_invoke_MethodHandleNatives(); 225 if (natives != NULL && AllowTransitionalJSR292) natives_name = Klass::cast(natives)->name(); 226 SystemDictionary::resolve_or_fail(natives_name, 227 Handle(), 228 Handle(), 229 true, 230 CHECK); 231 } 232 } 233 methodOop result_oop = SystemDictionary::find_method_handle_invoke(name, 234 signature, 235 current_klass, 236 CHECK); 237 if (result_oop != NULL) { | 159 160 void LinkResolver::resolve_klass(KlassHandle& result, constantPoolHandle pool, int index, TRAPS) { 161 klassOop result_oop = pool->klass_ref_at(index, CHECK); 162 result = KlassHandle(THREAD, result_oop); 163 } 164 165 void LinkResolver::resolve_klass_no_update(KlassHandle& result, constantPoolHandle pool, int index, TRAPS) { 166 klassOop result_oop = 167 constantPoolOopDesc::klass_ref_at_if_loaded_check(pool, index, CHECK); 168 result = KlassHandle(THREAD, result_oop); 169 } 170 171 172 //------------------------------------------------------------------------------------------------------------------------ 173 // Method resolution 174 // 175 // According to JVM spec. $5.4.3c & $5.4.3d 176 177 void LinkResolver::lookup_method_in_klasses(methodHandle& result, KlassHandle klass, Symbol* name, Symbol* signature, TRAPS) { 178 methodOop result_oop = klass->uncached_lookup_method(name, signature); 179 if (EnableInvokeDynamic && result_oop != NULL) { 180 switch (result_oop->intrinsic_id()) { 181 case vmIntrinsics::_invokeExact: 182 case vmIntrinsics::_invokeGeneric: 183 case vmIntrinsics::_invokeDynamic: 184 // Do not link directly to these. The VM must produce a synthetic one using lookup_implicit_method. 185 return; 186 } 187 } 188 result = methodHandle(THREAD, result_oop); 189 } 190 191 // returns first instance method 192 void LinkResolver::lookup_instance_method_in_klasses(methodHandle& result, KlassHandle klass, Symbol* name, Symbol* signature, TRAPS) { 193 methodOop result_oop = klass->uncached_lookup_method(name, signature); 194 result = methodHandle(THREAD, result_oop); 195 while (!result.is_null() && result->is_static()) { 196 klass = KlassHandle(THREAD, Klass::cast(result->method_holder())->super()); 197 result = methodHandle(THREAD, klass->uncached_lookup_method(name, signature)); 198 } 199 } 200 201 202 int LinkResolver::vtable_index_of_miranda_method(KlassHandle klass, Symbol* name, Symbol* signature, TRAPS) { 203 ResourceMark rm(THREAD); 204 klassVtable *vt = instanceKlass::cast(klass())->vtable(); 205 return vt->index_of_miranda(name, signature); 206 } 207 208 void LinkResolver::lookup_method_in_interfaces(methodHandle& result, KlassHandle klass, Symbol* name, Symbol* signature, TRAPS) { 209 instanceKlass *ik = instanceKlass::cast(klass()); 210 result = methodHandle(THREAD, ik->lookup_method_in_all_interfaces(name, signature)); 211 } 212 213 void LinkResolver::lookup_implicit_method(methodHandle& result, 214 KlassHandle klass, Symbol* name, Symbol* signature, 215 KlassHandle current_klass, 216 TRAPS) { 217 if (EnableInvokeDynamic && 218 klass() == SystemDictionary::MethodHandle_klass() && 219 methodOopDesc::is_method_handle_invoke_name(name)) { 220 if (!THREAD->is_Compiler_thread() && !MethodHandles::enabled()) { 221 // Make sure the Java part of the runtime has been booted up. 222 klassOop natives = SystemDictionary::MethodHandleNatives_klass(); 223 if (natives == NULL || instanceKlass::cast(natives)->is_not_initialized()) { 224 Symbol* natives_name = vmSymbols::java_lang_invoke_MethodHandleNatives(); 225 if (natives != NULL && AllowTransitionalJSR292) natives_name = Klass::cast(natives)->name(); 226 SystemDictionary::resolve_or_fail(natives_name, 227 Handle(), 228 Handle(), 229 true, 230 CHECK); 231 } 232 } 233 methodOop result_oop = SystemDictionary::find_method_handle_invoke(name, 234 signature, 235 current_klass, 236 CHECK); 237 if (result_oop != NULL) { |