let user_env pdef =
let context = push_context "user" in
try
let frame = user_frame () in
let lvars = ref Logic_var.Map.empty in
let laddr = ref Logic_var.Map.empty in
let profile = List.map
(fun lv ->
if M.userdef_is_ref_param lv then
begin
lvars := Logic_var.Map.add lv Logic_byref !lvars ;
let opt_cx =
if M.userdef_ref_has_cvar lv
then
let x = fresh_addr lv in
laddr := Logic_var.Map.add lv x !laddr ;
Some x else None
in
UF_references ( lv ,opt_cx, [] )
end
else
begin
let x = fresh_local lv in
lvars := Logic_var.Map.add lv (Logic_term (F.var x)) !lvars ;
UF_logic ( lv , x )
end)
pdef.l_profile
in
let env = {
formals_in_pre = false ;
frame = frame ;
label = user_default_label pdef.l_labels ;
lvars = !lvars ;
xvars = Varinfo.Map.empty ;
laddr = !laddr;
}
in ( context , profile , env )
with err ->
kill_context "user env" context; raise err