let update_action_call kf pre_ki ki called_func pre_call_st post_call_st =
let ret_called = Kstmt (Kernel_function.find_return called_func) in
let (_,pre_trans) =
Data_for_aorai.get_func_pre (Kernel_function.get_name kf)
in
let (_,call_trans) =
Data_for_aorai.get_func_pre (Kernel_function.get_name called_func)
in
let treat_one_state_post pre pre_call post_call =
let current_actions =
Data_for_aorai.get_action_bindings kf pre_ki pre pre_call in
let post_actions =
Data_for_aorai.get_action_bindings
called_func ret_called pre_call post_call
in
let res = compose_actions current_actions post_actions in
Data_for_aorai.merge_action_bindings kf ki pre post_call res
in
let treat_one_trans_call pre pre_call trans =
if call_trans.(trans.numt) then begin
Array.iteri
(fun index b ->
if b then begin
let state = Data_for_aorai.getState index in
treat_one_state_post pre pre_call state
end)
post_call_st.(trans.stop.nums)
end
in
let auto = Data_for_aorai.getAutomata () in
let treat_one_call_state pre pre_call =
let trans = Path_analysis.get_transitions_of_state pre_call auto in
List.iter (treat_one_trans_call pre pre_call) trans
in
let treat_one_trans_pre pre trans =
if pre_trans.(trans.numt) then begin
Array.iteri
(fun index b ->
if b then begin
let state = Data_for_aorai.getState index in
treat_one_call_state pre state
end)
pre_call_st.(trans.stop.nums)
end
in
let update_one_action pre =
let trans = Path_analysis.get_transitions_of_state pre auto in
List.iter (treat_one_trans_pre pre) trans
in
let my_pre = active_before_call kf in
Data_for_aorai.Aorai_state.Set.iter update_one_action my_pre