hotspot/src/share/vm/runtime/sharedRuntime.cpp
changeset 19710 2f8ca425504e
parent 18434 2932166737d5
child 20072 6da61000acff
child 20282 7f9cbdf89af2
equal deleted inserted replaced
19709:33aa3e85cc75 19710:2f8ca425504e
  1049   bc = bytecode.invoke_code();
  1049   bc = bytecode.invoke_code();
  1050   int bytecode_index = bytecode.index();
  1050   int bytecode_index = bytecode.index();
  1051 
  1051 
  1052   // Find receiver for non-static call
  1052   // Find receiver for non-static call
  1053   if (bc != Bytecodes::_invokestatic &&
  1053   if (bc != Bytecodes::_invokestatic &&
  1054       bc != Bytecodes::_invokedynamic) {
  1054       bc != Bytecodes::_invokedynamic &&
       
  1055       bc != Bytecodes::_invokehandle) {
  1055     // This register map must be update since we need to find the receiver for
  1056     // This register map must be update since we need to find the receiver for
  1056     // compiled frames. The receiver might be in a register.
  1057     // compiled frames. The receiver might be in a register.
  1057     RegisterMap reg_map2(thread);
  1058     RegisterMap reg_map2(thread);
  1058     frame stubFrame   = thread->last_frame();
  1059     frame stubFrame   = thread->last_frame();
  1059     // Caller-frame is a compiled frame
  1060     // Caller-frame is a compiled frame
  1076   assert(receiver.is_null() || receiver->is_oop(), "wrong receiver");
  1077   assert(receiver.is_null() || receiver->is_oop(), "wrong receiver");
  1077   LinkResolver::resolve_invoke(callinfo, receiver, constants, bytecode_index, bc, CHECK_(nullHandle));
  1078   LinkResolver::resolve_invoke(callinfo, receiver, constants, bytecode_index, bc, CHECK_(nullHandle));
  1078 
  1079 
  1079 #ifdef ASSERT
  1080 #ifdef ASSERT
  1080   // Check that the receiver klass is of the right subtype and that it is initialized for virtual calls
  1081   // Check that the receiver klass is of the right subtype and that it is initialized for virtual calls
  1081   if (bc != Bytecodes::_invokestatic && bc != Bytecodes::_invokedynamic) {
  1082   if (bc != Bytecodes::_invokestatic && bc != Bytecodes::_invokedynamic && bc != Bytecodes::_invokehandle) {
  1082     assert(receiver.not_null(), "should have thrown exception");
  1083     assert(receiver.not_null(), "should have thrown exception");
  1083     KlassHandle receiver_klass(THREAD, receiver->klass());
  1084     KlassHandle receiver_klass(THREAD, receiver->klass());
  1084     Klass* rk = constants->klass_ref_at(bytecode_index, CHECK_(nullHandle));
  1085     Klass* rk = constants->klass_ref_at(bytecode_index, CHECK_(nullHandle));
  1085                             // klass is already loaded
  1086                             // klass is already loaded
  1086     KlassHandle static_receiver_klass(THREAD, rk);
  1087     KlassHandle static_receiver_klass(THREAD, rk);
  1238 #ifdef ASSERT
  1239 #ifdef ASSERT
  1239   address dest_entry_point = callee_nm == NULL ? 0 : callee_nm->entry_point(); // used below
  1240   address dest_entry_point = callee_nm == NULL ? 0 : callee_nm->entry_point(); // used below
  1240 #endif
  1241 #endif
  1241 
  1242 
  1242   if (is_virtual) {
  1243   if (is_virtual) {
  1243     assert(receiver.not_null(), "sanity check");
  1244     assert(receiver.not_null() || invoke_code == Bytecodes::_invokehandle, "sanity check");
  1244     bool static_bound = call_info.resolved_method()->can_be_statically_bound();
  1245     bool static_bound = call_info.resolved_method()->can_be_statically_bound();
  1245     KlassHandle h_klass(THREAD, receiver->klass());
  1246     KlassHandle h_klass(THREAD, invoke_code == Bytecodes::_invokehandle ? NULL : receiver->klass());
  1246     CompiledIC::compute_monomorphic_entry(callee_method, h_klass,
  1247     CompiledIC::compute_monomorphic_entry(callee_method, h_klass,
  1247                      is_optimized, static_bound, virtual_call_info,
  1248                      is_optimized, static_bound, virtual_call_info,
  1248                      CHECK_(methodHandle()));
  1249                      CHECK_(methodHandle()));
  1249   } else {
  1250   } else {
  1250     // static call
  1251     // static call