summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/rewriter.ml27
1 files changed, 23 insertions, 4 deletions
diff --git a/src/rewriter.ml b/src/rewriter.ml
index d7bb68f4..a44666df 100644
--- a/src/rewriter.ml
+++ b/src/rewriter.ml
@@ -5,8 +5,9 @@ type typ = Type_internal.t
type 'a exp = 'a Ast.exp
type 'a emap = 'a Envmap.t
type envs = Type_check.envs
+type nameset = Nameset.t
-type 'a rewriters = { rewrite_exp : 'a rewriters -> nexp_map option -> 'a exp -> 'a exp;
+type 'a rewriters = { rewrite_exp : 'a rewriters -> nexp_map option -> 'a exp -> 'a exp;
rewrite_lexp : 'a rewriters -> nexp_map option -> 'a lexp -> 'a lexp;
rewrite_pat : 'a rewriters -> nexp_map option -> 'a pat -> 'a pat;
rewrite_let : 'a rewriters -> nexp_map option -> 'a letbind -> 'a letbind;
@@ -262,6 +263,7 @@ let rewrite_exp rewriters nmap (E_aux (exp,(l,annot))) =
| _ -> raise (Reporting_basic.err_unreachable l ("Internal_exp_user given none Base annot")))
| E_internal_let _ -> raise (Reporting_basic.err_unreachable l "Internal let found before it should have been introduced")
| E_internal_return _ -> raise (Reporting_basic.err_unreachable l "Internal return found before it should have been introduced")
+ | E_internal_plet _ -> raise (Reporting_basic.err_unreachable l " Internal plet found before it should have been introduced")
let rewrite_let rewriters map (LB_aux(letbind,(l,annot))) =
let map = merge_option_maps map (get_map_tannot annot) in
@@ -316,6 +318,22 @@ let rewrite_defs (Defs defs) = rewrite_defs_base
rewrite_def = rewrite_def;
rewrite_defs = rewrite_defs_base} (Defs defs)
+
+let rec introduced_variables (E_aux (exp,(l,annot))) =
+ match exp with
+ | E_cast (typ, exp) -> introduced_variables exp
+ | E_if (c,t,e) -> Nameset.inter (introduced_variables t) (introduced_variables e)
+ | E_assign (lexp,exp) -> introduced_vars_le lexp
+ | _ -> Nameset.empty
+
+and introduced_vars_le (LEXP_aux(lexp,(l,annot))) =
+ match lexp with
+ | LEXP_id (Id_aux (Id id,_)) | LEXP_cast(_,(Id_aux (Id id,_))) ->
+ (match annot with
+ | Base(_,Emp_intro,_,_,_,_) -> Nameset.singleton id
+ | _ -> Nameset.empty)
+ | _ -> Nameset.empty
+
type ('a,'pat,'pat_aux,'fpat,'fpat_aux) pat_alg =
{ p_lit : lit -> 'pat_aux
; p_wild : 'pat_aux
@@ -887,10 +905,11 @@ let effectful_effs {effect = Eset effs} =
let effectful eaux =
effectful_effs (geteffs eaux)
-let eff_union e1 e2 =
- let {effect = Eset effs_e1} = geteffs e1 in
+let eff_union e1 e2 = union_effects (geteffs e1) (geteffs e2)
+(*KATHY:CHANGE: Not sure why the more general effect union is bad here?*)
+(* let {effect = Eset effs_e1} = geteffs e1 in
let {effect = Eset effs_e2} = geteffs e2 in
- {effect = Eset (dedup (effs_e1 @ effs_e2))}
+ {effect = Eset (dedup (effs_e1 @ effs_e2))}*)
let remove_blocks_exp_alg =