From a0d331fd5821298f7e5b98e82ba7dd755d51b0cc Mon Sep 17 00:00:00 2001
From: Valentin Perrelle <valentin.perrelle@cea.fr>
Date: Mon, 3 Jan 2022 17:12:08 +0100
Subject: [PATCH] [Eva] api: Add a result conversion helper

---
 src/plugins/value/Eva.mli           | 8 +++++++-
 src/plugins/value/utils/results.ml  | 6 ++++++
 src/plugins/value/utils/results.mli | 8 +++++++-
 3 files changed, 20 insertions(+), 2 deletions(-)

diff --git a/src/plugins/value/Eva.mli b/src/plugins/value/Eva.mli
index ea31e6b674f..4a483f2b21d 100644
--- a/src/plugins/value/Eva.mli
+++ b/src/plugins/value/Eva.mli
@@ -20,7 +20,7 @@ end
 module Results: sig
   (* Usage sketch :
   
-     Eva.Results.(before stmt |> in_callstack cs |> eval_var vi |> as_int)
+     Eva.Results.(before stmt |> in_callstack cs |> eval_var vi |> as_int |> value ~default:0)
   
      or, if you prefer
   
@@ -124,6 +124,12 @@ module Results: sig
      Raises [Stdlib.Invalid_argument] if the statement is not a [Call]
      instruction or a [Local_init] with [ConsInit] initializer. *)
   val callee : Cil_types.stmt -> Kernel_function.t list
+  
+  (* Result conversion *)
+  (** [default d r] extract the value of r if r is Ok or use the default value d
+      otherwise.
+      Equivalent to [Result.value ~default:d r] *)
+  val default : 'a -> 'a result -> 'a
 end
 
 module Value_results: sig
diff --git a/src/plugins/value/utils/results.ml b/src/plugins/value/utils/results.ml
index ff6b6aa67c5..dbb120d24ad 100644
--- a/src/plugins/value/utils/results.ml
+++ b/src/plugins/value/utils/results.ml
@@ -756,3 +756,9 @@ let callsites kf =
   at_start_of kf |> callstacks |>
   List.fold_left f Map.empty |> Map.to_seq |> List.of_seq |>
   List.map (fun (kf,sites) -> kf, uniq_sites sites)
+
+
+(* Result conversion *)
+
+let default default_value result =
+  Result.value ~default:default_value result
diff --git a/src/plugins/value/utils/results.mli b/src/plugins/value/utils/results.mli
index f4782eacf16..6db2025dfb7 100644
--- a/src/plugins/value/utils/results.mli
+++ b/src/plugins/value/utils/results.mli
@@ -23,7 +23,7 @@
 [@@@ api_start]
 (* Usage sketch :
 
-   Eva.Results.(before stmt |> in_callstack cs |> eval_var vi |> as_int)
+   Eva.Results.(before stmt |> in_callstack cs |> eval_var vi |> as_int |> value ~default:0)
 
    or, if you prefer
 
@@ -127,4 +127,10 @@ val callsites : Cil_types.kernel_function ->
    Raises [Stdlib.Invalid_argument] if the statement is not a [Call]
    instruction or a [Local_init] with [ConsInit] initializer. *)
 val callee : Cil_types.stmt -> Kernel_function.t list
+
+(* Result conversion *)
+(** [default d r] extract the value of r if r is Ok or use the default value d
+    otherwise.
+    Equivalent to [Result.value ~default:d r] *)
+val default : 'a -> 'a result -> 'a
 [@@@ api_end]
-- 
GitLab