From 47f377430d04b4e1f3d8ece967890a20e6e6b17e Mon Sep 17 00:00:00 2001
From: Maxime Jacquemin <maxime2.jacquemin@gmail.com>
Date: Wed, 20 Apr 2022 11:34:48 +0200
Subject: [PATCH] [ivette] Adding a cache system to the <markerFromTerm>
 request

---
 src/plugins/server/kernel_ast.ml | 29 +++++++++++++++++++++++------
 1 file changed, 23 insertions(+), 6 deletions(-)

diff --git a/src/plugins/server/kernel_ast.ml b/src/plugins/server/kernel_ast.ml
index 79f0e41a068..f307b9babc1 100644
--- a/src/plugins/server/kernel_ast.ml
+++ b/src/plugins/server/kernel_ast.ml
@@ -751,6 +751,17 @@ let () =
 
 type marker_term_input = { atStmt : stmt ; term : string }
 
+module MarkerTermInputAsKey = struct
+  type t = marker_term_input
+  let compare x y =
+    let c = Cil_datatype.Stmt.compare x.atStmt y.atStmt in
+    if c = 0 then String.compare x.term y.term else c
+  let equal x y = compare x y = 0
+  let hash x = 17 * Cil_datatype.Stmt.hash x.atStmt + Hashtbl.hash x.term
+end
+
+module MarkerTermInputCache = Hashtbl.Make(MarkerTermInputAsKey)
+
 module MarkerTermInput = struct
   type record
   let record : record Record.signature = Record.signature ()
@@ -792,12 +803,18 @@ let logic_environment () =
   let open Logic_typing in
   Lenv.empty () |> append_pre_label |> append_init_label |> append_here_label
 
-let build_marker = Option.map @@ fun input ->
-  let env = logic_environment () in
-  let kf = Kernel_function.find_englobing_kf input.atStmt in
-  let term = !Db.Properties.Interp.term ~env kf input.term in
-  let exp = !Db.Properties.Interp.term_to_exp ~result:None term in
-  Printer_tag.PExp (Some kf, Kstmt input.atStmt, exp)
+let build_marker =
+  let table = MarkerTermInputCache.create 10 in
+  Option.map @@ fun input ->
+  match MarkerTermInputCache.find_opt table input with
+  | Some tag -> tag
+  | None ->
+    let env = logic_environment () in
+    let kf = Kernel_function.find_englobing_kf input.atStmt in
+    let term = !Db.Properties.Interp.term ~env kf input.term in
+    let exp = !Db.Properties.Interp.term_to_exp ~result:None term in
+    let tag = Printer_tag.PExp (Some kf, Kstmt input.atStmt, exp) in
+    MarkerTermInputCache.add table input tag ; tag
 
 let descr = "Build a marker from an ACSL term."
 
-- 
GitLab