let collect_arg_array_call s x n b p =
  if AnyVar.mem x then 
    (oracle "%s %a AnyVar" s pp_var_type x ;())
  else
    try 
      let (arr,calls) = ArgAReference.find x in
      oracle "%s %a ArfARef" s pp_var_type x;
      if n <= arr then
        (oracle "%s %a + call(%a,%d,%s)" s pp_var_type x
           pp_var_type p n (string_addr b);
         ArgAReference.replace x (arr,((n,(b,p))::calls)))
      else 
        (oracle "%s %a remove %d used %d" s pp_var_type x arr n;
         remove_array_reference_arg x)
  with Not_found ->
    oracle "%s %a not yet in ArgAref" s pp_var_type x;
    oracle "%s %a try to collect with %d" 
      s pp_var_type x n;
    if isVarTypePointerType x then collect_arg_ptr_call s x n b p
    else
    (if n <> 0 then
       (oracle"%s %a + call(%a,%d,%s)" 
          s pp_var_type x pp_var_type p n (string_addr b); 
        add_array_reference_arg x n;
        try let (n,calls) = ArgAReference.find x in  
          ArgAReference.replace x (n,(n,(b,p))::calls)
        with Not_found -> ())
    else ())