let local_scope env vars scope_kind p =
let m_here = mem_at env Clabels.Here in
let vmh = valloc_of_mem m_here in
let mh = F.var vmh in
let do_var p v =
let t = Ctypes.object_of v.vtype in
let alloc v p =
Wp_parameters.debug ~level:3 "[local_scope] alloc %s@." v.vname;
let sz = sizeof_c_object t in
let sz = Tint.term_of_xsize sz in
let ma = RtLib.alloc mh (name_of_var v) sz in
let p = D.subst vmh ma p in
p
in
let init v p =
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 = match logic_of_mem (mem_at env Clabels.Pre) with
| None -> p
| Some tbl ->
try let lv = Varinfo.Hashtbl.find tbl v in
D.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
p
| Mcfg.SC_Block_out | Mcfg.SC_Function_out ->
Wp_parameters.debug ~level:3 "[local_scope] free %s@." v.vname;
D.subst vmh (RtLib.free mh (name_of_var v)) p
| Mcfg.SC_Global -> p
in p
in List.fold_left do_var p vars