< prev index next >

src/share/vm/interpreter/linkResolver.cpp

Print this page




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.


< prev index next >