src/share/vm/ci/ciMethod.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File
*** old/src/share/vm/ci/ciMethod.cpp	Tue Mar 25 15:47:06 2014
--- new/src/share/vm/ci/ciMethod.cpp	Tue Mar 25 15:47:05 2014

*** 579,679 **** --- 579,674 ---- /** * Check whether profiling provides a type for the argument i to the * call at bci bci * ! * @param [in]bci bci of the call ! * @param [in]i argument number * @return profiled type + * @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 * * 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) { ! bool ciMethod::argument_profiled_type(int bci, int i, ciKlass*& type, bool& maybe_null) { 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; ! return false; } + type = call->valid_argument_type(i); + maybe_null = call->argument_maybe_null(i); + return true; } 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 false; } + type = call->valid_argument_type(i); + maybe_null = call->argument_maybe_null(i); + return true; } } } ! return NULL; ! return false; } /** * Check whether profiling provides a type for the return value from * the call at bci bci * ! * @param [in]bci bci of the call * @return profiled type + * @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 * * If the profile reports that the argument may be null, return false * at least for now. */ ! ciKlass* ciMethod::return_profiled_type(int bci) { ! 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(); - ciKlass* type = call->valid_return_type(); if (type != NULL && !call->return_maybe_null()) { ! 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(); - ciKlass* type = call->valid_return_type(); if (type != NULL && !call->return_maybe_null()) { ! return type; + maybe_null = call->return_maybe_null(); ! return true; } } } } return NULL; + return false; } /** * Check whether profiling provides a type for the parameter i * ! * @param [in]i parameter number * @return profiled type + * @param [out]type profiled type of parameter, NULL if none + * @param [out]maybe_null true if null was seen for parameter + * @return true if profiling exists * * If the profile reports that the argument may be null, return false * at least for now. */ ! ciKlass* ciMethod::parameter_profiled_type(int i) { ! bool ciMethod::parameter_profiled_type(int i, ciKlass*& type, bool& maybe_null) { if (MethodData::profile_parameters() && method_data() != NULL && method_data()->is_mature()) { ciParametersTypeData* parameters = method_data()->parameters_type_data(); if (parameters != NULL && i < parameters->number_of_parameters()) { - ciKlass* type = parameters->valid_parameter_type(i); if (type != NULL && !parameters->parameter_maybe_null(i)) { ! return type; } + maybe_null = parameters->parameter_maybe_null(i); ! return true; } } ! return NULL; ! return false; } // ------------------------------------------------------------------ // ciMethod::find_monomorphic_target

src/share/vm/ci/ciMethod.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File