let local_scope m vars scope_kind p =
let vmh = m.vbits in
let mh = F.var vmh in
let do_var p v =
let alloc v p =
Wp_parameters.debug ~dkey "[local_scope] alloc %s@." v.vname;
let ma = RtLib.alloc mh (name_of_var v) in
let p = L.subst vmh ma p in
p
in
(*
let init v p = (* initialize parameter : v@Here = v@Pre *)
let m_pre = mem_at env Clabels.Pre in
let v_loc = cvar m_here v in
let v_pre = load m_pre t v_loc in
let p = subst_lval env t v_loc v_pre p in
p
in
*)
let p = match scope_kind with
| Mcfg.SC_Function_in ->
let p = alloc v p in p
(*
let p = match logic_of_mem (mem_at env Clabels.Pre) with
| None -> p
| Some tbl ->
try let lv = Varinfo.Hashtbl.find tbl v in
L.forall [lv] p
with Not_found -> p
in p *)
| Mcfg.SC_Function_frame ->
(* let p = init v p in *)
let p = alloc v p in
p
| Mcfg.SC_Block_in ->
let p = alloc v p in
(*let h = add_int_format_hyp (name_of_var v) t F.p_true in
F.p_implies h p
*) p
| Mcfg.SC_Block_out | Mcfg.SC_Function_out ->
Wp_parameters.debug ~dkey "[local_scope] free %s@." v.vname;
L.subst vmh (RtLib.free mh (name_of_var v)) p
| Mcfg.SC_Global -> (* nothing to do *) p
in p
in List.fold_left do_var p vars