let set strategy wenv res e obj =
try
match (HE.find res.tbl e) with
| None -> raise Not_found
| Some obj -> obj
with Not_found ->
begin
let e_annot = WpStrategy.get_annots strategy e in
let h_prop = WpStrategy.get_hyp_only e_annot in
let g_prop = WpStrategy.get_goal_only e_annot in
let bh_prop, bg_prop = WpStrategy.get_both_hyp_goals e_annot in
let h_assigns = WpStrategy.get_asgn_hyp e_annot in
let g_assigns = WpStrategy.get_asgn_goal e_annot in
let obj = collect_oblig wenv res e obj in
let is_loop_head =
match Cil2cfg.node_type (Cil2cfg.edge_src e) with
| Cil2cfg.Vloop (Some _, _) -> true
| _ -> false
in
let compute ~goal obj =
let local_add_goal obj g =
if goal then add_goal wenv obj g else obj
in
let obj = List.fold_left (local_add_goal) obj g_prop in
let obj = List.fold_left (add_hyp wenv) obj bh_prop in
let obj =
if goal then add_assigns_goal wenv obj g_assigns else obj
in
let obj = List.fold_left (local_add_goal) obj bg_prop in
let obj = List.fold_left (add_hyp wenv) obj h_prop in
obj
in
let obj = match res.mode with
| Pass1 -> compute ~goal:true obj
| Pass2 -> compute ~goal:false obj
in
let obj = do_labels wenv e obj in
let obj =
if is_loop_head then obj
else use_assigns wenv res obj h_assigns
in
debug "[set_wp_edge] %a@." Cil2cfg.pp_edge e;
debug " = @[<hov2> %a@]@." W.pretty obj;
Format.print_flush ();
HE.replace res.tbl e (Some obj);
find res e
end