let add_current_event event env cond =
let is_empty tbl = Cil_datatype.Varinfo.Hashtbl.length tbl = 0 in
match env with
[] -> assert false
| old_event :: tl ->
match event, old_event with
| ENone, _ -> env, cond
| _, ENone -> event::tl, cond
| ECall (kf1,_,_), ECall (kf2,_,_)
when Kernel_function.equal kf1 kf2 -> env, cond
| ECall (kf1,tbl1,_), ECall (kf2,tbl2,_)->
if is_empty tbl1 && is_empty tbl2 then ENone::tl, TFalse
else
Aorai_option.abort
"specification is inconsistent: two call events for distinct functions %a and %a at the same time."
Kernel_function.pretty kf1 Kernel_function.pretty kf2
| ECall (_,_,_), EMulti -> event::tl, cond
| ECall (kf1,tbl1,_), EReturn kf2 ->
if is_empty tbl1 then ENone::tl, TFalse
else
Aorai_option.abort
"specification is inconsistent: trying to call %a and return from %a at the same time."
Kernel_function.pretty kf1 Kernel_function.pretty kf2
| ECall(kf1,_,_), ECOR kf2
when Kernel_function.equal kf1 kf2 ->
event::tl, cond
| ECall (kf1,tbl1,_), ECOR kf2 ->
if is_empty tbl1 then ENone::tl, TFalse
else
Aorai_option.abort
"specification is inconsistent: trying to call %a and call or return from %a at the same time."
Kernel_function.pretty kf1 Kernel_function.pretty kf2
| EReturn kf1, ECall(kf2,tbl2,_) ->
if is_empty tbl2 then ENone::tl, TFalse
else
Aorai_option.abort
"specification is inconsistent: trying to call %a and return from %a at the same time."
Kernel_function.pretty kf2 Kernel_function.pretty kf1
| EReturn kf1, (ECOR kf2 | EReturn kf2)
when Kernel_function.equal kf1 kf2 -> event::tl, cond
| EReturn _, EReturn _ -> ENone::tl, TFalse
| EReturn _, ECOR _ -> ENone::tl, TFalse
| EReturn _, EMulti -> ENone::tl, TFalse
| (EMulti | ECOR _), _ -> assert false