let collect_signature profile filter env =
let closures = ref [] in
let references = ref Logic_var.Map.empty in
let get_refs lv refs =
try Logic_var.Map.find lv refs
with Not_found -> []
in
Lmap.iter
(fun label mem ->
match label with
| LabelParam label ->
begin
List.iter
(fun (x,lv,formal) -> if filter x then
let refs =
(x,formal,label) :: (get_refs lv !references) in
references := Logic_var.Map.add lv refs !references)
(M.userdef_ref_signature mem) ;
List.iter
(fun (x,clos) -> if filter x then
closures := UF_closure(x,clos,label) :: !closures)
(M.userdef_mem_signature mem) ;
end
| _ -> ())
env.frame.states ;
begin
List.rev !closures @
List.map
(function
| (UF_logic _ | UF_closure _) as p -> p
| UF_references(lv,opt_cx,_) ->
UF_references(lv, opt_cx, List.rev (get_refs lv !references))
) profile
end