diff --git a/src/plugins/wp/Why3Import.ml b/src/plugins/wp/Why3Import.ml index 11ca2e0f729fa2d6e5f3bd5b0c1d87a5d1a5cb5c..9bd3dc48b9c5356b962fdb4762af3ee33c5771ad 100644 --- a/src/plugins/wp/Why3Import.ml +++ b/src/plugins/wp/Why3Import.ml @@ -66,10 +66,6 @@ let construct_acsl_name (id : W.Ident.ident) = String.concat "::" (paths @ name :: List.rev_append q [of_infix t]) | [] -> "" -let recover_module (id : W.Ident.ident) = - let (paths,name,_) = T.restore_path id in - String.concat "." paths ^ "." ^ name - (* For debug only*) let pp_id fmt (id: W.Ident.ident) = Format.pp_print_string fmt id.id_string @@ -125,6 +121,11 @@ type env = { menv : why3module Datatype.String.Hashtbl.t } +type temp_menv = { + mutable lti : C.logic_type_info list; + mutable li : C.logic_info list; +} + let create_empty_env wenv = let tenv = W.Ty.Hts.create 0 in let lenv = W.Term.Hls.create 0 in @@ -170,21 +171,21 @@ let tvars_of_txs (txs: W.Ty.tvsymbol list) : string list * tvars = x :: txs, W.Ty.Mtv.add tv (C.Lvar x) tvs ) txs ([], W.Ty.Mtv.empty) -let rec lt_of_ty (env : env) (tvs : tvars) (ty: W.Ty.ty) : C.logic_type = +let rec lt_of_ty (env : env) (temp_menv) (tvs : tvars) (ty: W.Ty.ty) : C.logic_type = match ty.ty_node with | Tyvar x -> W.Ty.Mtv.find x tvs | Tyapp(s,[]) when W.Ty.(ts_equal s ts_int) -> C.Linteger | Tyapp(s,[]) when W.Ty.(ts_equal s ts_real) -> C.Lreal - | Tyapp(s,ts) -> C.Ltype( lti_of_ts env s , - List.map (lt_of_ty env tvs ) ts) + | Tyapp(s,ts) -> C.Ltype( lti_of_ts env temp_menv s , + List.map (lt_of_ty env temp_menv tvs ) ts) -and lti_of_ts (env : env) (ts : W.Ty.tysymbol) : C.logic_type_info = +and lti_of_ts (env : env) (temp_menv : temp_menv) (ts : W.Ty.tysymbol) : C.logic_type_info = try W.Ty.Hts.find env.tenv ts with Not_found -> let (lt_params,tvars) = tvars_of_txs ts.ts_args in let lt_def = match ts.ts_def with | NoDef | Range _ | Float _ -> None - | Alias ty -> Some (C.LTsyn (lt_of_ty env tvars ty)) + | Alias ty -> Some (C.LTsyn (lt_of_ty env temp_menv tvars ty)) in let lti = C.{ @@ -193,34 +194,29 @@ and lti_of_ts (env : env) (ts : W.Ty.tysymbol) : C.logic_type_info = lt_attr = []; } in W.Ty.Hts.add env.tenv ts lti ; - - let cwmod = Datatype.String.Hashtbl.find env.menv @@ recover_module ts.ts_name in - Datatype.String.Hashtbl.replace env.menv (recover_module ts.ts_name) - {cwmod with types = cwmod.types @ [lti]}; - try begin let _ = (Logic_type_info.Hashtbl.find env.ltits lti) - in lti end with Not_found -> - Logic_type_info.Hashtbl.add env.ltits lti ts; - lti + temp_menv.lti <- lti :: temp_menv.lti; + Logic_type_info.Hashtbl.add env.ltits lti ts; + lti (* -------------------------------------------------------------------------- *) (* --- Functions conversion --- *) (* -------------------------------------------------------------------------- *) -let lv_of_ty (env:env) (tvars:tvars) (index) (ty:W.Ty.ty) : C.logic_var = +let lv_of_ty (env:env) (temp_menv : temp_menv) (tvars:tvars) (index) (ty:W.Ty.ty) : C.logic_var = Cil_const.make_logic_var_formal (Printf.sprintf "x%d" index) - @@ (lt_of_ty env tvars ty) + @@ (lt_of_ty env temp_menv tvars ty) let lt_of_ty_opt (lt_opt) = match lt_opt with | None -> C.Ctype (C.TVoid []) (* Same as logic_typing *) | Some tr -> tr -let li_of_ls (env:env) (ls : W.Term.lsymbol) : C.logic_info = +let li_of_ls (env:env) (temp_menv : temp_menv) (ls : W.Term.lsymbol) : C.logic_info = let l_tparams,tvars = tvars_of_txs @@ W.Ty.Stv.elements @@ W.Term.ls_ty_freevars ls in - let l_type = Option.map (lt_of_ty env tvars ) ls.ls_value in - let l_profile = List.mapi (lv_of_ty env tvars ) ls.ls_args in + let l_type = Option.map (lt_of_ty env temp_menv tvars ) ls.ls_value in + let l_profile = List.mapi (lv_of_ty env temp_menv tvars ) ls.ls_args in let l_args = List.map ( fun (lv:C.logic_var) -> lv.lv_type) l_profile in let signature = C.Larrow (l_args, lt_of_ty_opt l_type) in let li = @@ -234,14 +230,9 @@ let li_of_ls (env:env) (ls : W.Term.lsymbol) : C.logic_info = l_profile ; l_body = C.LBnone; } in W.Term.Hls.add env.lenv ls li; + temp_menv.li <- li :: temp_menv.li; Logic_info.Hashtbl.add env.lils li ls; - let cwmod = Datatype.String.Hashtbl.find env.menv @@ recover_module ls.ls_name in - Datatype.String.Hashtbl.replace env.menv (recover_module ls.ls_name) - {cwmod with logics = cwmod.logics @ [li]}; - try begin let _ = (Logic_info.Hashtbl.find env.lils li) - in li end with Not_found -> - Logic_info.Hashtbl.add env.lils li ls; - li + li (* -------------------------------------------------------------------------- *) @@ -251,8 +242,7 @@ let li_of_ls (env:env) (ls : W.Term.lsymbol) : C.logic_info = let import_theory (env : env) thname = let theory_name, theory_path = extract_path thname in try - Datatype.String.Hashtbl.add env.menv thname - { logics = []; types = []; paths = theory_path}; + let temp_menv : temp_menv = {li = []; lti = []} in let theory = W.Env.read_theory env.wenv theory_path theory_name in List.iter (fun (tdecl : T.tdecl) -> match tdecl.td_node with @@ -262,14 +252,14 @@ let import_theory (env : env) thname = | Dtype ts -> L.debug ~dkey "Decl and type %a" pp_id ts.ts_name; L.debug ~dkey "Location %a" pp_id_loc ts.ts_name; - let lti = lti_of_ts env ts in + let lti = lti_of_ts env temp_menv ts in L.debug ~dkey "Correspondign LTI %a" pp_lti lti; | Ddata ddatas -> List.iter (fun ((ts, _) : W.Decl.data_decl) -> L.debug ~dkey "Decl and data %a" pp_id ts.ts_name; L.debug ~dkey "Location %a" pp_id_loc ts.ts_name; - let lti = lti_of_ts env ts in + let lti = lti_of_ts env temp_menv ts in L.debug ~dkey "Correspondign data LTI %a" pp_lti lti; ) ddatas | Dparam ls -> @@ -280,13 +270,17 @@ let import_theory (env : env) thname = (fun ((ls,_):W.Decl.logic_decl) -> L.debug ~dkey "Decl and dlogic %a" pp_id ls.ls_name; L.debug ~dkey "Location %a" pp_id_loc ls.ls_name; - let li = li_of_ls env ls in + let li = li_of_ls env temp_menv ls in L.debug ~dkey "Corresponding dlogic LTI %a" pp_li li; ) dlogics | _ -> L.debug ~dkey "Other type of Decl" end | Use _| Clone _| Meta _ -> L.debug ~dkey "" - ) theory.th_decls + ) theory.th_decls; + Datatype.String.Hashtbl.add env.menv thname + { logics = List.rev temp_menv.li; + types = List.rev temp_menv.lti; + paths = theory_path }; with W.Env.LibraryNotFound _ -> L.error "Library %s not found" thname