From 5b9138e2c71fd0697c4998a6b967c44c49f38c59 Mon Sep 17 00:00:00 2001
From: Valentin Perrelle <valentin.perrelle@cea.fr>
Date: Sat, 18 Sep 2021 14:24:45 +0200
Subject: [PATCH] [Eva] api: Add results folding by callstack

---
 src/plugins/value/utils/results.ml  | 38 ++++++++++++++++++++++++++---
 src/plugins/value/utils/results.mli |  6 ++++-
 2 files changed, 40 insertions(+), 4 deletions(-)

diff --git a/src/plugins/value/utils/results.ml b/src/plugins/value/utils/results.ml
index 278822ec43f..3d3beffa9c0 100644
--- a/src/plugins/value/utils/results.ml
+++ b/src/plugins/value/utils/results.ml
@@ -159,8 +159,16 @@ struct
   (* Accessors *)
 
   let callstacks : ('a, restricted_to_callstack) t -> callstack list = function
-    | ByCallstack l -> List.map fst l
     | Top | Bottom -> [] (* What else to do when Top is given ? *)
+    | ByCallstack l -> List.map fst l
+
+  (* Fold *)
+
+  let fold (f  : callstack -> 'a -> 'b -> 'b) (acc : 'b) :
+    ('a, restricted_to_callstack) t -> 'b =
+    function
+    | Top | Bottom -> acc (* What else to do when Top is given ? *)
+    | ByCallstack l -> List.fold_left (fun acc (cs,x) -> f cs x acc) acc l
 
   (* Map *)
 
@@ -255,7 +263,19 @@ struct
     | `Value v -> Result.ok v
 
   let callstacks req =
-    Response.callstacks (get_by_callstack req)
+    get_by_callstack req |> Response.callstacks
+
+  let fold_callstacks f acc req =
+    let f' cs _res acc =
+      f cs (in_callstack cs req) acc
+    in
+    get_by_callstack req |> Response.fold f' acc
+
+  let by_callstack req =
+    let f cs _res acc =
+      (cs, in_callstack cs req) :: acc
+    in
+    get_by_callstack req |> Response.fold f []
 
   let is_reachable req =
     match get req with
@@ -428,12 +448,23 @@ struct
 end
 
 
-(* State requests *)
+(* Working with callstacks *)
 
 let callstacks req =
   let module E = Make () in
   E.callstacks req
 
+let fold_callstacks f acc req =
+  let module E = Make () in
+  E.fold_callstacks f acc req
+
+let by_callstack req =
+  let module E = Make () in
+  E.by_callstack req
+
+
+(* State requests *)
+
 let equality_class exp req =
   let module E = Make () in
   E.equality_class exp req
@@ -442,6 +473,7 @@ let as_cvalue_model req =
   let module E = Make () in
   E.as_cvalue_model req
 
+
 (* Evaluation *)
 
 module type Evaluator =
diff --git a/src/plugins/value/utils/results.mli b/src/plugins/value/utils/results.mli
index f3444b2c722..0e0a0c69391 100644
--- a/src/plugins/value/utils/results.mli
+++ b/src/plugins/value/utils/results.mli
@@ -53,8 +53,12 @@ val in_callstack : callstack -> request -> request
 val in_callstacks : callstack list -> request -> request
 val filter_callstack : (callstack -> bool) -> request -> request
 
-(* State requests *)
+(* Working with callstacks *)
 val callstacks : request -> callstack list
+val fold_callstacks : (callstack -> request -> 'a -> 'a) -> 'a -> request -> 'a
+val by_callstack : request -> (callstack * request) list
+
+(* State requests *)
 val equality_class : Cil_types.exp -> request -> Cil_types.exp list result
 val as_cvalue_model : request -> Cvalue.Model.t result
 
-- 
GitLab