From 0acd43ee0d6e9332459825cfd4f74c49c0ee76ab Mon Sep 17 00:00:00 2001
From: Julien Signoles <julien.signoles@cea.fr>
Date: Thu, 26 May 2011 09:17:20 +0000
Subject: [PATCH] [e-acsl] fix bugs of sharing between the old AST and the new
 one

---
 src/plugins/e-acsl/visit.ml | 36 ++++++++++++++++++++++++------------
 1 file changed, 24 insertions(+), 12 deletions(-)

diff --git a/src/plugins/e-acsl/visit.ml b/src/plugins/e-acsl/visit.ml
index 0e72131f5b7..681eaf4d5d6 100644
--- a/src/plugins/e-acsl/visit.ml
+++ b/src/plugins/e-acsl/visit.ml
@@ -340,7 +340,7 @@ let convert_named_predicate env p =
   assert (Typ.equal (typeOf e) intType);
   Env.add_stmt env (Misc.mk_e_acsl_guard ~reverse:true e p)
 
-let convert_annotation env annot =
+let convert_code_annotation env annot =
   try
     match annot.annot_content with
     | AAssert(l, p) -> 
@@ -368,8 +368,6 @@ let convert_annotation env annot =
     else Options.warning ~current:true "%s@\nignoring annotation." msg;
     env, None
 
-let convert_rooted env (User a | AI(_, a)) = convert_annotation env a
-
 (* ************************************************************************** *)
 (* Visitor *)
 (* ************************************************************************** *)
@@ -402,10 +400,14 @@ class e_acsl_visitor prj generate = object (self)
   method vvdec vi = 
     (* TODO: handle functions without code *)
     try
-      let kf = Globals.Functions.get vi in
-      let pre_b, post_b, env = 
-	convert_spec Env.empty (Kernel_function.get_spec kf) 
+      let old_vi = get_original_varinfo self#behavior vi in
+      let old_kf = Globals.Functions.get old_vi in
+      let spec = 
+	Visitor.visitFramacFunspec
+	  (self :> Visitor.frama_c_visitor) 
+	  (Kernel_function.get_spec old_kf)
       in
+      let pre_b, post_b, env = convert_spec Env.empty spec in
       pre_block <- pre_b;
       post_block <- post_b;
       gen_vars <- Env.generated_function_variables env;
@@ -425,17 +427,24 @@ class e_acsl_visitor prj generate = object (self)
 
   method vstmt_aux stmt =
 (*    Options.debug ~level:2 "proceeding stmt %d@." stmt.sid;*)
+    (* [TODO] BUG HERE since the annotations tbl is the one of the old
+       project. *)
     let env, post_stmts =
       Annotations.single_fold_stmt
-	(fun ba (env, post_stmts) -> 
-	  let env, post_block = convert_rooted env ba in
+	(fun (User old_a | AI(_, old_a)) (env, post_stmts) -> 
+	  let a = 
+	    Visitor.visitFramacCodeAnnotation
+	      (self :> Visitor.frama_c_visitor)
+	      old_a
+	  in
+	  let env, post_block = convert_code_annotation env a in
 	  let post_stmts = match post_block with
 	    | None -> post_stmts
 	    | Some b ->
               mkStmt ~valid_sid:true (Block b) :: post_stmts
 	  in
 	  env, post_stmts) 
-	stmt 
+	(get_original_stmt self#behavior stmt)
 	(Env.empty, [])
     in
     (* verify internal invariants *)
@@ -449,9 +458,12 @@ class e_acsl_visitor prj generate = object (self)
       let post_stmts = 
 	let is_return s = match self#current_kf with
 	  | None -> false
-	  | Some kf -> 
-	    try Stmt.equal s (Kernel_function.find_return kf) 
-	    with Kernel_function.No_Statement -> assert false
+	  | Some old_kf -> 
+	    let old_ret = 
+	      try Kernel_function.find_return old_kf
+	      with Kernel_function.No_Statement -> assert false
+	    in
+	    Stmt.equal s (get_stmt self#behavior old_ret)
 	in
 	if is_return stmt then
 	  match post_block with
-- 
GitLab