hotspot/src/share/vm/oops/cpCache.cpp
changeset 20017 81eba62e9048
parent 17858 c292f8791cca
child 20282 7f9cbdf89af2
equal deleted inserted replaced
20014:b34a9fa1931a 20017:81eba62e9048
   138   }
   138   }
   139   guarantee(parameter_size() == value,
   139   guarantee(parameter_size() == value,
   140             err_msg("size must not change: parameter_size=%d, value=%d", parameter_size(), value));
   140             err_msg("size must not change: parameter_size=%d, value=%d", parameter_size(), value));
   141 }
   141 }
   142 
   142 
   143 void ConstantPoolCacheEntry::set_method(Bytecodes::Code invoke_code,
   143 void ConstantPoolCacheEntry::set_direct_or_vtable_call(Bytecodes::Code invoke_code,
   144                                         methodHandle method,
   144                                                        methodHandle method,
   145                                         int vtable_index) {
   145                                                        int vtable_index) {
       
   146   bool is_vtable_call = (vtable_index >= 0);  // FIXME: split this method on this boolean
   146   assert(method->interpreter_entry() != NULL, "should have been set at this point");
   147   assert(method->interpreter_entry() != NULL, "should have been set at this point");
   147   assert(!method->is_obsolete(),  "attempt to write obsolete method to cpCache");
   148   assert(!method->is_obsolete(),  "attempt to write obsolete method to cpCache");
   148 
   149 
   149   int byte_no = -1;
   150   int byte_no = -1;
   150   bool change_to_virtual = false;
   151   bool change_to_virtual = false;
   158       change_to_virtual = true;
   159       change_to_virtual = true;
   159 
   160 
   160       // ...and fall through as if we were handling invokevirtual:
   161       // ...and fall through as if we were handling invokevirtual:
   161     case Bytecodes::_invokevirtual:
   162     case Bytecodes::_invokevirtual:
   162       {
   163       {
   163         if (method->can_be_statically_bound()) {
   164         if (!is_vtable_call) {
       
   165           assert(method->can_be_statically_bound(), "");
   164           // set_f2_as_vfinal_method checks if is_vfinal flag is true.
   166           // set_f2_as_vfinal_method checks if is_vfinal flag is true.
   165           set_method_flags(as_TosState(method->result_type()),
   167           set_method_flags(as_TosState(method->result_type()),
   166                            (                             1      << is_vfinal_shift) |
   168                            (                             1      << is_vfinal_shift) |
   167                            ((method->is_final_method() ? 1 : 0) << is_final_shift)  |
   169                            ((method->is_final_method() ? 1 : 0) << is_final_shift)  |
   168                            ((change_to_virtual         ? 1 : 0) << is_forced_virtual_shift),
   170                            ((change_to_virtual         ? 1 : 0) << is_forced_virtual_shift),
   169                            method()->size_of_parameters());
   171                            method()->size_of_parameters());
   170           set_f2_as_vfinal_method(method());
   172           set_f2_as_vfinal_method(method());
   171         } else {
   173         } else {
       
   174           assert(!method->can_be_statically_bound(), "");
   172           assert(vtable_index >= 0, "valid index");
   175           assert(vtable_index >= 0, "valid index");
   173           assert(!method->is_final_method(), "sanity");
   176           assert(!method->is_final_method(), "sanity");
   174           set_method_flags(as_TosState(method->result_type()),
   177           set_method_flags(as_TosState(method->result_type()),
   175                            ((change_to_virtual ? 1 : 0) << is_forced_virtual_shift),
   178                            ((change_to_virtual ? 1 : 0) << is_forced_virtual_shift),
   176                            method()->size_of_parameters());
   179                            method()->size_of_parameters());
   180         break;
   183         break;
   181       }
   184       }
   182 
   185 
   183     case Bytecodes::_invokespecial:
   186     case Bytecodes::_invokespecial:
   184     case Bytecodes::_invokestatic:
   187     case Bytecodes::_invokestatic:
       
   188       assert(!is_vtable_call, "");
   185       // Note:  Read and preserve the value of the is_vfinal flag on any
   189       // Note:  Read and preserve the value of the is_vfinal flag on any
   186       // invokevirtual bytecode shared with this constant pool cache entry.
   190       // invokevirtual bytecode shared with this constant pool cache entry.
   187       // It is cheap and safe to consult is_vfinal() at all times.
   191       // It is cheap and safe to consult is_vfinal() at all times.
   188       // Once is_vfinal is set, it must stay that way, lest we get a dangling oop.
   192       // Once is_vfinal is set, it must stay that way, lest we get a dangling oop.
   189       set_method_flags(as_TosState(method->result_type()),
   193       set_method_flags(as_TosState(method->result_type()),
   230     ShouldNotReachHere();
   234     ShouldNotReachHere();
   231   }
   235   }
   232   NOT_PRODUCT(verify(tty));
   236   NOT_PRODUCT(verify(tty));
   233 }
   237 }
   234 
   238 
   235 
   239 void ConstantPoolCacheEntry::set_direct_call(Bytecodes::Code invoke_code, methodHandle method) {
   236 void ConstantPoolCacheEntry::set_interface_call(methodHandle method, int index) {
   240   int index = Method::nonvirtual_vtable_index;
       
   241   // index < 0; FIXME: inline and customize set_direct_or_vtable_call
       
   242   set_direct_or_vtable_call(invoke_code, method, index);
       
   243 }
       
   244 
       
   245 void ConstantPoolCacheEntry::set_vtable_call(Bytecodes::Code invoke_code, methodHandle method, int index) {
       
   246   // either the method is a miranda or its holder should accept the given index
       
   247   assert(method->method_holder()->is_interface() || method->method_holder()->verify_vtable_index(index), "");
       
   248   // index >= 0; FIXME: inline and customize set_direct_or_vtable_call
       
   249   set_direct_or_vtable_call(invoke_code, method, index);
       
   250 }
       
   251 
       
   252 void ConstantPoolCacheEntry::set_itable_call(Bytecodes::Code invoke_code, methodHandle method, int index) {
       
   253   assert(method->method_holder()->verify_itable_index(index), "");
       
   254   assert(invoke_code == Bytecodes::_invokeinterface, "");
   237   InstanceKlass* interf = method->method_holder();
   255   InstanceKlass* interf = method->method_holder();
   238   assert(interf->is_interface(), "must be an interface");
   256   assert(interf->is_interface(), "must be an interface");
   239   assert(!method->is_final_method(), "interfaces do not have final methods; cannot link to one here");
   257   assert(!method->is_final_method(), "interfaces do not have final methods; cannot link to one here");
   240   set_f1(interf);
   258   set_f1(interf);
   241   set_f2(index);
   259   set_f2(index);