/**
 * Check whether profiling provides a type for the argument i to the
 * call at bci bci
 *
 * @param bci  bci of the call
 * @param i    argument number
 * @return     profiled type
 *
 * If the profile reports that the argument may be null, return false
 * at least for now.
 */
ciKlass* ciMethod::argument_profiled_type(int bci, int i) {
  if (MethodData::profile_parameters() && method_data() != NULL && method_data()->is_mature()) {
    ciProfileData* data = method_data()->bci_to_data(bci);
    if (data != NULL) {
      if (data->is_VirtualCallTypeData()) {
        assert_virtual_call_type_ok(bci);
        ciVirtualCallTypeData* call = (ciVirtualCallTypeData*)data->as_VirtualCallTypeData();
        if (i >= call->number_of_arguments()) {
          return NULL;
        }
        ciKlass* type = call->valid_argument_type(i);
        if (type != NULL && !call->argument_maybe_null(i)) {
          return type;
        }
      } else if (data->is_CallTypeData()) {
        assert_call_type_ok(bci);
        ciCallTypeData* call = (ciCallTypeData*)data->as_CallTypeData();
        if (i >= call->number_of_arguments()) {
          return NULL;
        }
        ciKlass* type = call->valid_argument_type(i);
        if (type != NULL && !call->argument_maybe_null(i)) {
          return type;
        }
      }
    }
  }
  return NULL;
}
Exemple #2
0
/**
 * Check whether profiling provides a type for the return value from
 * the call at bci bci
 *
 * @param [in]bci         bci of the call
 * @param [out]type       profiled type of argument, NULL if none
 * @param [out]maybe_null true if null was seen for argument
 * @return                true if profiling exists
 *
 */
bool ciMethod::return_profiled_type(int bci, ciKlass*& type, bool& maybe_null) {
  if (MethodData::profile_return() && method_data() != NULL && method_data()->is_mature()) {
    ciProfileData* data = method_data()->bci_to_data(bci);
    if (data != NULL) {
      if (data->is_VirtualCallTypeData()) {
        assert_virtual_call_type_ok(bci);
        ciVirtualCallTypeData* call = (ciVirtualCallTypeData*)data->as_VirtualCallTypeData();
        type = call->valid_return_type();
        maybe_null = call->return_maybe_null();
        return true;
      } else if (data->is_CallTypeData()) {
        assert_call_type_ok(bci);
        ciCallTypeData* call = (ciCallTypeData*)data->as_CallTypeData();
        type = call->valid_return_type();
        maybe_null = call->return_maybe_null();
        return true;
      }
    }
  }
  return false;
}
/**
 * Check whether profiling provides a type for the return value from
 * the call at bci bci
 *
 * @param bci  bci of the call
 * @return     profiled type
 *
 * If the profile reports that the argument may be null, return false
 * at least for now.
 */
ciKlass* ciMethod::return_profiled_type(int bci) {
  if (MethodData::profile_return() && method_data() != NULL && method_data()->is_mature()) {
    ciProfileData* data = method_data()->bci_to_data(bci);
    if (data != NULL) {
      if (data->is_VirtualCallTypeData()) {
        assert_virtual_call_type_ok(bci);
        ciVirtualCallTypeData* call = (ciVirtualCallTypeData*)data->as_VirtualCallTypeData();
        ciKlass* type = call->valid_return_type();
        if (type != NULL && !call->return_maybe_null()) {
          return type;
        }
      } else if (data->is_CallTypeData()) {
        assert_call_type_ok(bci);
        ciCallTypeData* call = (ciCallTypeData*)data->as_CallTypeData();
        ciKlass* type = call->valid_return_type();
        if (type != NULL && !call->return_maybe_null()) {
          return type;
        }
      }
    }
  }
  return NULL;
}