From 3854f457c451ec4cb4f890c335bb7d657c9f8b4b Mon Sep 17 00:00:00 2001 From: Julien Signoles <julien.signoles@cea.fr> Date: Wed, 25 May 2011 14:10:11 +0000 Subject: [PATCH] [e-acsl] prevent to add twice a generated variable to the locals of a function --- src/plugins/e-acsl/env.ml | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/src/plugins/e-acsl/env.ml b/src/plugins/e-acsl/env.ml index dfae528923b..0e7ee7c1983 100644 --- a/src/plugins/e-acsl/env.ml +++ b/src/plugins/e-acsl/env.ml @@ -30,7 +30,9 @@ let register_actions_queue q = queue := q type t = { var_cpt: int; (* counter used for generating variables in a function *) - fct_vars: varinfo list; (* generated variables local to a function *) + fct_vars: Varinfo.Set.t; (* generated variables local to a function. + Use a set to prevent to add twice a variable + when merging. *) block_vars: varinfo list; (* generated variables local to a block. Subset of field [vars] *) beginning_of_block: stmt list; (* list of stmts to be inserted before the @@ -40,7 +42,7 @@ type t = let empty = { var_cpt = 0; - fct_vars = [] ; + fct_vars = Varinfo.Set.empty; block_vars = []; beginning_of_block = []; end_of_block = [] } @@ -49,8 +51,9 @@ let no_overlap ~from env = { env with var_cpt = Extlib.max_cpt from.var_cpt env.var_cpt } let merge_function_vars ~from env = - (* [TODO] the same variable may now appear twice in the list *) - { env with var_cpt = from.var_cpt; fct_vars = env.fct_vars @ from.fct_vars } + { env with + var_cpt = from.var_cpt; + fct_vars = Varinfo.Set.union env.fct_vars from.fct_vars } let merge_block_vars ~from env = let env = merge_function_vars ~from env in @@ -88,7 +91,7 @@ let new_var env ty mk_stmts = let stmts = mk_stmts v e in e, { var_cpt = n; - fct_vars = v :: env.fct_vars; + fct_vars = Varinfo.Set.add v env.fct_vars; block_vars = v :: env.block_vars; beginning_of_block = List.fold_left (fun l s -> s :: l) env.beginning_of_block stmts; @@ -98,7 +101,10 @@ let new_var env ty mk_stmts = let new_var_and_mpz_init env mk_stmts = new_var env Mpz.t (fun v e -> Mpz.init e :: mk_stmts v e) -let generated_function_variables env = List.rev env.fct_vars +let generated_function_variables env = + List.sort + (fun v1 v2 -> String.compare v1.vname v2.vname) + (Varinfo.Set.elements env.fct_vars) let generated_block_variables env = List.rev env.block_vars @@ -123,7 +129,7 @@ let pretty fmt env = Format.fprintf fmt "CPT = %d@\n" env.var_cpt; Format.fprintf fmt "FCT_VARS = %t@\n" (fun fmt -> - List.iter (fun v -> Format.fprintf fmt "v%d " v.vid) env.fct_vars); + Varinfo.Set.iter (fun v -> Format.fprintf fmt "v%d " v.vid) env.fct_vars); Format.fprintf fmt "BLOCK_VARS = %t@\n" (fun fmt -> List.iter (fun v -> Format.fprintf fmt "v%d " v.vid) env.block_vars); -- GitLab