let get_internal =
  Internals.memo
    (fun kf ->
      !Value.compute ();
      let result_with_spurious_locals =
        match kf.fundec with
       | Definition (f,_) ->
           (try
              Stack.iter
                (fun g -> if kf == g then begin
                   Cil.warn
                     "recursive call detected during out analysis of %a. Ignoring it is safe if the value analysis suceeded without problem."
                     Kernel_function.pretty_name kf;
                   raise Ignore
                 end
                )
                call_stack;

              (* No out to compute if the values were not computed for [kf] *)
              (* if not (Value.is_accessible kf) then raise Ignore; *)

              Stack.push kf call_stack;
              let computer = new do_it in
              ignore (visitFramacFunction (computer:>frama_c_visitor) f);
              let _ = Stack.pop call_stack in
              computer#result
            with Ignore -> Zone.bottom)
       | Declaration (_,_,_,_) ->
           let behaviors =
             !Value.valid_behaviors kf (Value.get_initial_state kf)
           in
           let assigns = Ast_info.merge_assigns behaviors in
           (try
              let state = Value.get_initial_state kf in
              List.fold_left
                (fun acc (loc,_) ->
                   match loc with
                       Location loc ->
                         let c = loc.it_content in
                         if (Logic_utils.is_result c)
                         then acc
                         else
                           let loc =
                             !Properties.Interp.loc_to_loc ~result:None
                               state
                               c
                           in
                              Zone.join
                               acc
                               (Locations.valid_enumerate_bits loc)
                     | Nothing -> acc
                )
                Zone.bottom
                assigns
            with Invalid_argument "not an lvalue" ->
              Cil.warn "unsupported assigns clause for function %a; Ignoring it."
                Kernel_function.pretty_name kf;
              Zone.bottom)
      in
      Zone.filter_base (Db.accept_base_internal kf) result_with_spurious_locals
    )