1301 trace_method_resolution("invokevirtual resolved method: caller-class:", 1302 current_klass, resolved_klass, resolved_method, false); 1303 } 1304 1305 return resolved_method; 1306 } 1307 1308 // throws runtime exceptions 1309 void LinkResolver::runtime_resolve_virtual_method(CallInfo& result, 1310 const methodHandle& resolved_method, 1311 Klass* resolved_klass, 1312 Handle recv, 1313 Klass* recv_klass, 1314 bool check_null_and_abstract, 1315 TRAPS) { 1316 1317 // setup default return values 1318 int vtable_index = Method::invalid_vtable_index; 1319 methodHandle selected_method; 1320 1321 assert(recv.is_null() || recv->is_oop(), "receiver is not an oop"); 1322 1323 // runtime method resolution 1324 if (check_null_and_abstract && recv.is_null()) { // check if receiver exists 1325 THROW(vmSymbols::java_lang_NullPointerException()); 1326 } 1327 1328 // Virtual methods cannot be resolved before its klass has been linked, for otherwise the Method*'s 1329 // has not been rewritten, and the vtable initialized. Make sure to do this after the nullcheck, since 1330 // a missing receiver might result in a bogus lookup. 1331 assert(resolved_method->method_holder()->is_linked(), "must be linked"); 1332 1333 // do lookup based on receiver klass using the vtable index 1334 if (resolved_method->method_holder()->is_interface()) { // default or miranda method 1335 vtable_index = vtable_index_of_interface_method(resolved_klass, 1336 resolved_method); 1337 assert(vtable_index >= 0 , "we should have valid vtable index at this point"); 1338 1339 selected_method = methodHandle(THREAD, recv_klass->method_at_vtable(vtable_index)); 1340 } else { 1341 // at this point we are sure that resolved_method is virtual and not 1342 // a default or miranda method; therefore, it must have a valid vtable index. | 1301 trace_method_resolution("invokevirtual resolved method: caller-class:", 1302 current_klass, resolved_klass, resolved_method, false); 1303 } 1304 1305 return resolved_method; 1306 } 1307 1308 // throws runtime exceptions 1309 void LinkResolver::runtime_resolve_virtual_method(CallInfo& result, 1310 const methodHandle& resolved_method, 1311 Klass* resolved_klass, 1312 Handle recv, 1313 Klass* recv_klass, 1314 bool check_null_and_abstract, 1315 TRAPS) { 1316 1317 // setup default return values 1318 int vtable_index = Method::invalid_vtable_index; 1319 methodHandle selected_method; 1320 1321 // runtime method resolution 1322 if (check_null_and_abstract && recv.is_null()) { // check if receiver exists 1323 THROW(vmSymbols::java_lang_NullPointerException()); 1324 } 1325 1326 // Virtual methods cannot be resolved before its klass has been linked, for otherwise the Method*'s 1327 // has not been rewritten, and the vtable initialized. Make sure to do this after the nullcheck, since 1328 // a missing receiver might result in a bogus lookup. 1329 assert(resolved_method->method_holder()->is_linked(), "must be linked"); 1330 1331 // do lookup based on receiver klass using the vtable index 1332 if (resolved_method->method_holder()->is_interface()) { // default or miranda method 1333 vtable_index = vtable_index_of_interface_method(resolved_klass, 1334 resolved_method); 1335 assert(vtable_index >= 0 , "we should have valid vtable index at this point"); 1336 1337 selected_method = methodHandle(THREAD, recv_klass->method_at_vtable(vtable_index)); 1338 } else { 1339 // at this point we are sure that resolved_method is virtual and not 1340 // a default or miranda method; therefore, it must have a valid vtable index. |