let apply_change_call proj ff call f_to_call =
  SlicingParameters.debug ~level:1 "[Fct_Slice.apply_change_call]";
  let pdg = M.get_ff_pdg ff in
  let to_call, to_prop =
    match f_to_call with
      | T.CallSlice ff_to_call ->
          (* let to_call_sig = FctMarks.get_sgn ff_to_call in
          let top = match to_call_sig with None -> false
            | Some to_call_sig -> Marks.is_topin_visible to_call_sig
          in
          if top then begin
            Cil.log "[slicing] top input in %s -> call source function"
              (M.ff_name ff_to_call);
            let to_prop = FctMarks.mark_spare_call_nodes ff call in
              T.CallSrc (Some (M.ff_fi ff_to_call)), to_prop
          end
          else *)
 begin
            let f = match check_outputs (ff, call) ff_to_call false with
              | ([], false-> f_to_call
              | _ -> raise (SlicingTypes.ChangeCallErr
                              "not enough computed output")
            in
            (* find [f_to_call] input marks *)
            let marks = FctMarks.get_ff_marks ff_to_call in
            let input_marks = FctMarks.get_all_input_marks marks in
            let ff_marks = FctMarks.get_ff_marks ff in
            let missing_inputs, _more =
              FctMarks.marks_for_caller_inputs pdg ff_marks call input_marks
                                               (M.ff_fi ff_to_call)
            in
            let to_prop = modif_call_inputs ff call missing_inputs in
              f, to_prop
          end
      | T.CallSrc _ ->
          let to_prop = FctMarks.mark_spare_call_nodes ff call in
          f_to_call, to_prop
  in
    FctMarks.change_call proj ff call (Some to_call);
    let new_filters = after_marks_modifications ff to_prop in
    new_filters