1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166
|
(**************************************************************************)
(* *)
(* The Why platform for program certification *)
(* Copyright (C) 2002-2008 *)
(* Romain BARDOU *)
(* Jean-Franois COUCHOT *)
(* Mehdi DOGGUY *)
(* Jean-Christophe FILLITRE *)
(* Thierry HUBERT *)
(* Claude MARCH *)
(* Yannick MOY *)
(* Christine PAULIN *)
(* Yann RGIS-GIANAS *)
(* Nicolas ROUSSET *)
(* Xavier URBAIN *)
(* *)
(* This software is free software; you can redistribute it and/or *)
(* modify it under the terms of the GNU General Public *)
(* License version 2, as published by the Free Software Foundation. *)
(* *)
(* This software is distributed in the hope that it will be useful, *)
(* but WITHOUT ANY WARRANTY; without even the implied warranty of *)
(* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. *)
(* *)
(* See the GNU General Public License version 2 for more details *)
(* (enclosed in the file GPL). *)
(* *)
(**************************************************************************)
open Ml_misc
open Jc_env
open Jc_fenv
exception Not_found_str of string
module IdentMap = Map.Make(
struct
type t = Ml_ocaml.Ident.t
let compare x y = String.compare (Ml_ocaml.Ident.unique_name x)
(Ml_ocaml.Ident.unique_name y)
end)
type t = {
vars: Jc_env.var_info StringMap.t;
funs: Jc_fenv.fun_info StringMap.t;
(*fields: Jc_env.field_info StringMap.t;
constructors: (Jc_env.struct_info * int * Jc_env.field_info list) StringMap.t;
structs: Jc_env.struct_info StringMap.t;*)
logic_funs: Jc_fenv.logic_info StringMap.t;
(*tags: Jc_env.field_info StringMap.t;*)
fun_specs: Ml_ocaml.Typedtree.function_spec IdentMap.t;
(*type_specs: Ml_ocaml.Typedtree.type_spec IdentMap.t;*)
}
let empty = {
vars = StringMap.empty;
funs = StringMap.empty;
(*fields = StringMap.empty;
constructors = StringMap.empty;
structs = StringMap.empty;*)
logic_funs = StringMap.empty;
(*tags = StringMap.empty;*)
fun_specs = IdentMap.empty;
(*type_specs = IdentMap.empty;*)
}
let add_var name ty env =
let vi = make_var name ty in
{ env with vars = StringMap.add name vi env.vars }, vi
let add_fun name params return_type env =
let jc_name = identifier_of_symbol name in
let fi = make_fun_info jc_name return_type params () in
{ env with funs = StringMap.add name fi env.funs }
(*let add_field name ty si env =
let fi = {
jc_field_info_tag = fresh_int ();
jc_field_info_name = name;
jc_field_info_final_name = name;
jc_field_info_type = ty;
jc_field_info_struct = si;
jc_field_info_root = si.jc_struct_info_root;
jc_field_info_rep = false;
} in
{ env with fields = StringMap.add name fi env.fields }, fi
let add_constructor name tyl si i env =
let _, fil = list_fold_map
(fun cnt ty -> cnt + 1,
let name = name^"_"^string_of_int cnt in
{
jc_field_info_tag = fresh_int ();
jc_field_info_name = name;
jc_field_info_final_name = name;
jc_field_info_type = ty;
jc_field_info_struct = si;
jc_field_info_root = si.jc_struct_info_root;
jc_field_info_rep = false;
})
0 tyl
in
{ env with constructors = StringMap.add name (si, i, fil) env.constructors },
fil
let add_struct si env =
{ env with structs = StringMap.add si.jc_struct_info_name si env.structs }
let add_tag si env =
let fi = {
jc_field_info_tag = fresh_int ();
jc_field_info_name = "jessica_tag";
jc_field_info_final_name = "jessica_tag";
jc_field_info_type = JCTnative Tinteger;
jc_field_info_struct = si;
jc_field_info_root = si.jc_struct_info_root;
jc_field_info_rep = false;
} in
{ env with tags = StringMap.add si.jc_struct_info_name fi env.tags }, fi*)
let add_logic_fun name params return_type env =
let li = {
jc_logic_info_tag = fresh_int ();
jc_logic_info_name = name;
jc_logic_info_final_name = name;
jc_logic_info_result_type = return_type;
jc_logic_info_parameters = params;
jc_logic_info_effects = Jc_pervasives.empty_effects; (* ! *)
jc_logic_info_calls = [];
jc_logic_info_result_region = default_region;
jc_logic_info_param_regions = [];
jc_logic_info_labels = [];
} in
{ env with logic_funs = StringMap.add name li env.logic_funs }, li
let add_fun_spec id spec env =
{ env with fun_specs = IdentMap.add id spec env.fun_specs }
(*let add_type_spec id spec env =
{ env with type_specs = IdentMap.add id spec env.type_specs }*)
let nf s f k m =
try
f k m
with Not_found ->
raise (Not_found_str s)
let find_var name env = nf name StringMap.find name env.vars
let find_fun name env = nf name StringMap.find name env.funs
(*let find_field name env = nf name StringMap.find name env.fields
let find_constructor name env = nf name StringMap.find name env.constructors
let find_struct name env = nf name StringMap.find name env.structs*)
let find_logic_fun name env = nf name StringMap.find name env.logic_funs
(*let find_tag si env =
let name = si.jc_struct_info_name in
nf name StringMap.find name env.tags*)
let find_fun_spec id env =
nf (Ml_ocaml.Ident.name id) IdentMap.find id env.fun_specs
(*let find_type_spec id env =
nf (Ml_ocaml.Ident.name id) IdentMap.find id env.type_specs*)
(*
Local Variables:
compile-command: "unset LANG; make -C .. -f build.makefile jessica.all"
End:
*)
|