let user_env pdef =
let context = push_context "user" in
try
let frame = M.userdef_frame () in
let formals = List.map
(fun lv ->
let x = D.fresh lv.lv_name (Mdata.Vacsl lv.lv_type) in
lv , x
) pdef.l_profile
in
let here =
match pdef.l_labels with
| [] -> Clabels.LabelParam "WP_nowhere"
| LogicLabel (None, first) :: _ -> Clabels.LabelParam first
| LogicLabel (Some _, _) :: _ ->
Wp_parameters.fatal
"Unexpected redefined labels in user-defined predicates"
| StmtLabel _ :: _ ->
Wp_parameters.fatal
"Unexpected stmt-labels in user-defined predicates"
in
context , formals,
{
formals_in_pre = false ;
frame = frame ;
label = here ;
lvars =
List.fold_right
(fun (lv,x) t -> Logic_var.Map.add lv (F.var x) t) formals Logic_var.Map.empty;
xvars = Varinfo.Map.empty ;
}
with err ->
kill_context "user env" context; raise err