/** * 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; }
/** * 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; }