let change_call proj ff_marks call_id to_call =
SlicingParameters.debug ~level:2 "[Fct_Slice.CallInfo.change_call]";
let call_info = get_info_call call_id in
let something_to_do = is_call_to_change call_info to_call in
if something_to_do then
begin
SlicingParameters.debug ~level:2 " -> remove old_called";
let _ = remove_called_by proj call_id call_info in
SlicingParameters.debug ~level:2 " -> add new_called";
let _ = match to_call with
| None -> ()
| Some f ->
begin match f with
| (T.CallSrc None) ->
let called = indirectely_called_src_functions call_id in
let update kf =
let fi = M.get_kf_fi proj kf in
fi.T.f_called_by <- call_id :: fi.T.f_called_by
in List.iter update called
| (T.CallSlice g) ->
g.T.ff_called_by <- call_id :: g.T.ff_called_by
| (T.CallSrc (Some fi)) ->
fi.T.f_called_by <- call_id :: fi.T.f_called_by
end
in
let _ff, call = call_id in
let new_call_info = to_call in
PdgIndex.FctIndex.add_info_call ff_marks call new_call_info true
end