@ -22,9 +22,7 @@ type proc_callback_args =
type proc_callback_t = proc_callback_args -> Specs . summary
type cluster_callback_t =
Exe_env . t -> Typ . Procname . t list -> ( Typ . Procname . t -> Procdesc . t option )
-> ( Tenv . t * Typ . Procname . t * Procdesc . t ) list -> unit
type cluster_callback_t = ( Tenv . t * Procdesc . t ) list -> unit
let procedure_callbacks = ref []
@ -39,9 +37,7 @@ let register_cluster_callback language (callback: cluster_callback_t) =
(* * Collect what we need to know about a procedure for the analysis. *)
let get_procedure_definition exe_env proc_name =
let tenv = Exe_env . get_tenv exe_env proc_name in
Option . map
~ f : ( fun proc_desc -> ( tenv , proc_name , proc_desc ) )
( Exe_env . get_proc_desc exe_env proc_name )
Option . map ~ f : ( fun proc_desc -> ( tenv , proc_desc ) ) ( Exe_env . get_proc_desc exe_env proc_name )
let get_language proc_name = if Typ . Procname . is_java proc_name then Config . Java else Config . Clang
@ -60,7 +56,7 @@ let iterate_procedure_callbacks exe_env summary caller_pname =
match get_procedure_definition exe_env caller_pname with
| None
-> summary
| Some ( tenv , _ , proc_desc )
| Some ( tenv , proc_desc )
-> List . fold ~ init : summary
~ f : ( fun summary ( language , proc_callback ) ->
if Config . equal_language language procedure_language then
@ -70,18 +66,17 @@ let iterate_procedure_callbacks exe_env summary caller_pname =
(* * Invoke all registered cluster callbacks on a cluster of procedures. *)
let iterate_cluster_callbacks all_procs exe_env =
let get_procdesc = Exe_env . get_proc_desc exe_env in
let environment = List . filter_map ~ f : ( get_procedure_definition exe_env ) all_procs in
let language_matches language =
match environment with
| ( _ , p name, _ ) :: _
-> Config . equal_language language ( get_language pname)
| ( _ , p desc ) :: _
-> Config . equal_language language ( get_language ( Procdesc . get_ proc_ name pdesc ) )
| _
-> true
in
List . iter
~ f : ( fun ( language , cluster_callback ) ->
if language_matches language then cluster_callback exe_env all_procs get_procdesc environment )
~ f : ( fun ( language _opt , cluster_callback ) ->
if language_matches language _opt then cluster_callback environment )
! cluster_callbacks
(* * Invoke all procedure and cluster callbacks on a given environment. *)