hotspot/src/share/vm/oops/cpCache.cpp
changeset 14393 93a4dcdbebfd
parent 13929 8da0dc50a6e4
child 14396 4ac387decc03
equal deleted inserted replaced
14382:5e86124b835d 14393:93a4dcdbebfd
   241                    method()->size_of_parameters());
   241                    method()->size_of_parameters());
   242   set_bytecode_1(Bytecodes::_invokeinterface);
   242   set_bytecode_1(Bytecodes::_invokeinterface);
   243 }
   243 }
   244 
   244 
   245 
   245 
   246 void ConstantPoolCacheEntry::set_method_handle(constantPoolHandle cpool,
   246 void ConstantPoolCacheEntry::set_method_handle(constantPoolHandle cpool, const CallInfo &call_info) {
   247                                                methodHandle adapter,
   247   set_method_handle_common(cpool, Bytecodes::_invokehandle, call_info);
   248                                                Handle appendix, Handle method_type,
   248 }
   249                                                objArrayHandle resolved_references) {
   249 
   250   set_method_handle_common(cpool, Bytecodes::_invokehandle, adapter, appendix, method_type, resolved_references);
   250 void ConstantPoolCacheEntry::set_dynamic_call(constantPoolHandle cpool, const CallInfo &call_info) {
   251 }
   251   set_method_handle_common(cpool, Bytecodes::_invokedynamic, call_info);
   252 
       
   253 void ConstantPoolCacheEntry::set_dynamic_call(constantPoolHandle cpool,
       
   254                                               methodHandle adapter,
       
   255                                               Handle appendix, Handle method_type,
       
   256                                               objArrayHandle resolved_references) {
       
   257   set_method_handle_common(cpool, Bytecodes::_invokedynamic, adapter, appendix, method_type, resolved_references);
       
   258 }
   252 }
   259 
   253 
   260 void ConstantPoolCacheEntry::set_method_handle_common(constantPoolHandle cpool,
   254 void ConstantPoolCacheEntry::set_method_handle_common(constantPoolHandle cpool,
   261                                                       Bytecodes::Code invoke_code,
   255                                                       Bytecodes::Code invoke_code,
   262                                                       methodHandle adapter,
   256                                                       const CallInfo &call_info) {
   263                                                       Handle appendix, Handle method_type,
       
   264                                                       objArrayHandle resolved_references) {
       
   265   // NOTE: This CPCE can be the subject of data races.
   257   // NOTE: This CPCE can be the subject of data races.
   266   // There are three words to update: flags, refs[f2], f1 (in that order).
   258   // There are three words to update: flags, refs[f2], f1 (in that order).
   267   // Writers must store all other values before f1.
   259   // Writers must store all other values before f1.
   268   // Readers must test f1 first for non-null before reading other fields.
   260   // Readers must test f1 first for non-null before reading other fields.
   269   // Competing writers must acquire exclusive access via a lock.
   261   // Competing writers must acquire exclusive access via a lock.
   274   MonitorLockerEx ml(cpool->lock());
   266   MonitorLockerEx ml(cpool->lock());
   275   if (!is_f1_null()) {
   267   if (!is_f1_null()) {
   276     return;
   268     return;
   277   }
   269   }
   278 
   270 
       
   271   const methodHandle adapter = call_info.resolved_method();
       
   272   const Handle appendix      = call_info.resolved_appendix();
       
   273   const Handle method_type   = call_info.resolved_method_type();
   279   const bool has_appendix    = appendix.not_null();
   274   const bool has_appendix    = appendix.not_null();
   280   const bool has_method_type = method_type.not_null();
   275   const bool has_method_type = method_type.not_null();
   281 
   276 
   282   // Write the flags.
   277   // Write the flags.
   283   set_method_flags(as_TosState(adapter->result_type()),
   278   set_method_flags(as_TosState(adapter->result_type()),
   313   // not '(Ljava/lang/String;)Ljava/util/List;'.
   308   // not '(Ljava/lang/String;)Ljava/util/List;'.
   314   // The fact that String and List are involved is encoded in the MethodType in refs[f2].
   309   // The fact that String and List are involved is encoded in the MethodType in refs[f2].
   315   // This allows us to create fewer method oops, while keeping type safety.
   310   // This allows us to create fewer method oops, while keeping type safety.
   316   //
   311   //
   317 
   312 
       
   313   objArrayHandle resolved_references = cpool->resolved_references();
   318   // Store appendix, if any.
   314   // Store appendix, if any.
   319   if (has_appendix) {
   315   if (has_appendix) {
   320     const int appendix_index = f2_as_index() + _indy_resolved_references_appendix_offset;
   316     const int appendix_index = f2_as_index() + _indy_resolved_references_appendix_offset;
   321     assert(appendix_index >= 0 && appendix_index < resolved_references->length(), "oob");
   317     assert(appendix_index >= 0 && appendix_index < resolved_references->length(), "oob");
   322     assert(resolved_references->obj_at(appendix_index) == NULL, "init just once");
   318     assert(resolved_references->obj_at(appendix_index) == NULL, "init just once");