let check_and_add first elt kind pdg len already =
try
let v = M.find elt already in
let found, dir, up, down = match kind with
| Direct -> true, true, false, false
| Indirect_Backward -> v.indirect_backward, v.direct, true, false
| Forward _ -> v.forward, v.direct, v.indirect_backward, true
in
v.callstack_length <- min v.callstack_length len;
v.direct <- dir;
v.indirect_backward <- up;
v.forward <- down;
found, already
with Not_found ->
let dir, up, down = match kind with
| Direct -> true, false, false
| Indirect_Backward -> false, true, false
| Forward _ -> false, false, true
in
let v =
{ pdg = pdg; callstack_length = len;
direct = dir; indirect_backward = up; forward = down }
in
false,
if first && kind = Forward Impact then
already
else
M.add elt v already