hotspot/src/share/vm/ci/ciMethod.cpp
changeset 21099 46e6bbecd9e5
parent 20695 4f5a5e95090b
child 22243 91944eab7b92
equal deleted inserted replaced
21098:1820670a3362 21099:46e6bbecd9e5
   563   _receiver[i] = receiver;
   563   _receiver[i] = receiver;
   564   _receiver_count[i] = receiver_count;
   564   _receiver_count[i] = receiver_count;
   565   if (_limit < MorphismLimit) _limit++;
   565   if (_limit < MorphismLimit) _limit++;
   566 }
   566 }
   567 
   567 
       
   568 
       
   569 void ciMethod::assert_virtual_call_type_ok(int bci) {
       
   570   assert(java_code_at_bci(bci) == Bytecodes::_invokevirtual ||
       
   571          java_code_at_bci(bci) == Bytecodes::_invokeinterface, err_msg("unexpected bytecode %s", Bytecodes::name(java_code_at_bci(bci))));
       
   572 }
       
   573 
       
   574 void ciMethod::assert_call_type_ok(int bci) {
       
   575   assert(java_code_at_bci(bci) == Bytecodes::_invokestatic ||
       
   576          java_code_at_bci(bci) == Bytecodes::_invokespecial ||
       
   577          java_code_at_bci(bci) == Bytecodes::_invokedynamic, err_msg("unexpected bytecode %s", Bytecodes::name(java_code_at_bci(bci))));
       
   578 }
       
   579 
       
   580 /**
       
   581  * Check whether profiling provides a type for the argument i to the
       
   582  * call at bci bci
       
   583  *
       
   584  * @param bci  bci of the call
       
   585  * @param i    argument number
       
   586  * @return     profiled type
       
   587  *
       
   588  * If the profile reports that the argument may be null, return false
       
   589  * at least for now.
       
   590  */
       
   591 ciKlass* ciMethod::argument_profiled_type(int bci, int i) {
       
   592   if (MethodData::profile_parameters() && method_data() != NULL && method_data()->is_mature()) {
       
   593     ciProfileData* data = method_data()->bci_to_data(bci);
       
   594     if (data != NULL) {
       
   595       if (data->is_VirtualCallTypeData()) {
       
   596         assert_virtual_call_type_ok(bci);
       
   597         ciVirtualCallTypeData* call = (ciVirtualCallTypeData*)data->as_VirtualCallTypeData();
       
   598         if (i >= call->number_of_arguments()) {
       
   599           return NULL;
       
   600         }
       
   601         ciKlass* type = call->valid_argument_type(i);
       
   602         if (type != NULL && !call->argument_maybe_null(i)) {
       
   603           return type;
       
   604         }
       
   605       } else if (data->is_CallTypeData()) {
       
   606         assert_call_type_ok(bci);
       
   607         ciCallTypeData* call = (ciCallTypeData*)data->as_CallTypeData();
       
   608         if (i >= call->number_of_arguments()) {
       
   609           return NULL;
       
   610         }
       
   611         ciKlass* type = call->valid_argument_type(i);
       
   612         if (type != NULL && !call->argument_maybe_null(i)) {
       
   613           return type;
       
   614         }
       
   615       }
       
   616     }
       
   617   }
       
   618   return NULL;
       
   619 }
       
   620 
       
   621 /**
       
   622  * Check whether profiling provides a type for the return value from
       
   623  * the call at bci bci
       
   624  *
       
   625  * @param bci  bci of the call
       
   626  * @return     profiled type
       
   627  *
       
   628  * If the profile reports that the argument may be null, return false
       
   629  * at least for now.
       
   630  */
       
   631 ciKlass* ciMethod::return_profiled_type(int bci) {
       
   632   if (MethodData::profile_return() && method_data() != NULL && method_data()->is_mature()) {
       
   633     ciProfileData* data = method_data()->bci_to_data(bci);
       
   634     if (data != NULL) {
       
   635       if (data->is_VirtualCallTypeData()) {
       
   636         assert_virtual_call_type_ok(bci);
       
   637         ciVirtualCallTypeData* call = (ciVirtualCallTypeData*)data->as_VirtualCallTypeData();
       
   638         ciKlass* type = call->valid_return_type();
       
   639         if (type != NULL && !call->return_maybe_null()) {
       
   640           return type;
       
   641         }
       
   642       } else if (data->is_CallTypeData()) {
       
   643         assert_call_type_ok(bci);
       
   644         ciCallTypeData* call = (ciCallTypeData*)data->as_CallTypeData();
       
   645         ciKlass* type = call->valid_return_type();
       
   646         if (type != NULL && !call->return_maybe_null()) {
       
   647           return type;
       
   648         }
       
   649       }
       
   650     }
       
   651   }
       
   652   return NULL;
       
   653 }
       
   654 
       
   655 /**
       
   656  * Check whether profiling provides a type for the parameter i
       
   657  *
       
   658  * @param i    parameter number
       
   659  * @return     profiled type
       
   660  *
       
   661  * If the profile reports that the argument may be null, return false
       
   662  * at least for now.
       
   663  */
       
   664 ciKlass* ciMethod::parameter_profiled_type(int i) {
       
   665   if (MethodData::profile_parameters() && method_data() != NULL && method_data()->is_mature()) {
       
   666     ciParametersTypeData* parameters = method_data()->parameters_type_data();
       
   667     if (parameters != NULL && i < parameters->number_of_parameters()) {
       
   668       ciKlass* type = parameters->valid_parameter_type(i);
       
   669       if (type != NULL && !parameters->parameter_maybe_null(i)) {
       
   670         return type;
       
   671       }
       
   672     }
       
   673   }
       
   674   return NULL;
       
   675 }
       
   676 
       
   677 
   568 // ------------------------------------------------------------------
   678 // ------------------------------------------------------------------
   569 // ciMethod::find_monomorphic_target
   679 // ciMethod::find_monomorphic_target
   570 //
   680 //
   571 // Given a certain calling environment, find the monomorphic target
   681 // Given a certain calling environment, find the monomorphic target
   572 // for the call.  Return NULL if the call is not monomorphic in
   682 // for the call.  Return NULL if the call is not monomorphic in