summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorKathy Gray2015-06-08 14:10:06 +0100
committerKathy Gray2015-06-08 14:10:06 +0100
commitae86c0e628b85c1ea3c5760b9398f45c0120ed4e (patch)
tree745d67f803a280c6ccbd5088dd564404e5160bba /src
parent7a28436a0eb76172c6e48206175019f71b9c8730 (diff)
keeping tainted values in functionally updating records
Diffstat (limited to 'src')
-rw-r--r--src/lem_interp/interp.lem59
1 files changed, 35 insertions, 24 deletions
diff --git a/src/lem_interp/interp.lem b/src/lem_interp/interp.lem
index b6e1a8f5..a19e3d5f 100644
--- a/src/lem_interp/interp.lem
+++ b/src/lem_interp/interp.lem
@@ -1188,7 +1188,7 @@ let rec find_case t_level pexps value =
end
val interp_main : interp_mode -> top_level -> lenv -> lmem -> (exp tannot) -> (outcome * lmem * lenv)
-val exp_list : interp_mode -> top_level -> (list (exp tannot) -> (exp tannot)) -> (list value -> value) -> lenv -> lmem -> list value -> list (exp tannot) -> (outcome * lmem * lenv)
+val exp_list : interp_mode -> top_level -> ((list (exp tannot)) -> lenv -> ((exp tannot) * lenv)) -> (list value -> value) -> lenv -> lmem -> list value -> list (exp tannot) -> (outcome * lmem * lenv)
val interp_lbind : interp_mode -> top_level -> lenv -> lmem -> (letbind tannot) -> ((outcome * lmem * lenv) * (maybe ((exp tannot) -> (letbind tannot))))
val interp_alias_read : interp_mode -> top_level -> lenv -> lmem -> (alias_spec tannot) -> (outcome * lmem * lenv)
@@ -1220,7 +1220,9 @@ let rec exp_list mode t_level build_e build_v l_env l_mem vals exps =
(fun value lm le -> exp_list mode t_level build_e build_v l_env lm (vals++[value]) exps)
(fun a -> update_stack a (add_to_top_frame
(fun e env ->
- let (es,env') = to_exps mode env vals in (build_e (es++(e::exps)),env'))))
+ let (es,env') = to_exps mode env vals in
+ let (e,env'') = build_e (es++(e::exps)) env' in
+ (e,env''))))
end
and interp_main mode t_level l_env l_mem (E_aux exp (l,annot)) =
@@ -1414,12 +1416,13 @@ and interp_main mode t_level l_env l_mem (E_aux exp (l,annot)) =
| E_record(FES_aux (FES_Fexps fexps _) fes_annot) ->
let (fields,exps) = List.unzip (List.map (fun (FE_aux (FE_Fexp id exp) _) -> (id,exp)) fexps) in
exp_list mode t_level
- (fun es ->
- (E_aux
- (E_record
- (FES_aux (FES_Fexps
- (map2 (fun id exp -> (FE_aux (FE_Fexp id exp) (Unknown,Nothing))) fields es) false) fes_annot))
- (l,annot)))
+ (fun es env' ->
+ ((E_aux
+ (E_record
+ (FES_aux (FES_Fexps
+ (map2 (fun id exp -> (FE_aux (FE_Fexp id exp) (Unknown,Nothing))) fields es)
+ false) fes_annot))
+ (l,annot)), env'))
(fun vs -> (V_record typ (List.zip fields vs))) l_env l_mem [] exps
| E_record_update exp (FES_aux (FES_Fexps fexps _) fes_annot) ->
resolve_outcome
@@ -1429,13 +1432,13 @@ and interp_main mode t_level l_env l_mem (E_aux exp (l,annot)) =
let (fields,exps) = List.unzip (List.map (fun (FE_aux (FE_Fexp id exp) _) -> (id,exp)) fexps) in
resolve_outcome
(exp_list mode t_level
- (fun es ->
- let (e,_) = (to_exp <|mode with track_values = false|> eenv rv) in
- (E_aux (E_record_update e
+ (fun es env'->
+ let (e,env'') = (to_exp mode env' rv) in
+ ((E_aux (E_record_update e
(FES_aux (FES_Fexps
(map2 (fun id exp -> (FE_aux (FE_Fexp id exp) (Unknown,Nothing)))
fields es) false) fes_annot))
- (l,annot)))
+ (l,annot)), env''))
(fun vs -> (V_record t (List.zip fields vs))) l_env l_mem [] exps)
(fun vs lm le -> (Value (fupdate_record rv vs), lm, le))
(fun a -> a) (*Due to exp_list this won't happen, but we want to functionaly update on Value *)
@@ -1445,7 +1448,7 @@ and interp_main mode t_level l_env l_mem (E_aux exp (l,annot)) =
(add_to_top_frame
(fun e env -> (E_aux(E_record_update e (FES_aux(FES_Fexps fexps false) fes_annot)) (l,annot), env))))
| E_list(exps) ->
- exp_list mode t_level (fun exps -> E_aux (E_list exps) (l,annot)) V_list l_env l_mem [] exps
+ exp_list mode t_level (fun exps env' -> (E_aux (E_list exps) (l,annot),env')) V_list l_env l_mem [] exps
| E_cons hd tl ->
resolve_outcome
(interp_main mode t_level l_env l_mem hd)
@@ -1740,14 +1743,15 @@ and interp_main mode t_level l_env l_mem (E_aux exp (l,annot)) =
(E_aux (E_vector_append e1 e) (l,annot),env'))))) end)
(fun a -> update_stack a (add_to_top_frame (fun e env -> (E_aux (E_vector_append e e2) (l,annot),env))))
| E_tuple(exps) ->
- exp_list mode t_level (fun exps -> E_aux (E_tuple exps) (l,annot)) V_tuple l_env l_mem [] exps
+ exp_list mode t_level (fun exps env' -> (E_aux (E_tuple exps) (l,annot), env')) V_tuple l_env l_mem [] exps
| E_vector(exps) ->
let (is_inc,dir) = (match typ with
| T_app "vector" (T_args [ _; _; T_arg_order (Ord_aux Ord_inc _); _]) -> (true,IInc)
| _ -> (false,IDec) end) in
let base = (if is_inc then 0 else (List.length exps) - 1) in
exp_list mode t_level
- (fun exps -> E_aux (E_vector exps) (l,annot)) (fun vals -> V_vector base dir vals) l_env l_mem [] exps
+ (fun exps env' -> (E_aux (E_vector exps) (l,annot),env'))
+ (fun vals -> V_vector base dir vals) l_env l_mem [] exps
| E_vector_indexed iexps (Def_val_aux default dannot) ->
let (indexes,exps) = List.unzip iexps in
let (dir,base,len) = (match typ with
@@ -1758,8 +1762,8 @@ and interp_main mode t_level l_env l_mem (E_aux exp (l,annot)) =
(match default with
| Def_val_empty ->
exp_list mode t_level
- (fun es -> (E_aux (E_vector_indexed (map2 (fun i e -> (i,e)) indexes es)
- (Def_val_aux default dannot)) (l,annot)))
+ (fun es env' -> (E_aux (E_vector_indexed (map2 (fun i e -> (i,e)) indexes es)
+ (Def_val_aux default dannot)) (l,annot), env'))
(fun vals -> V_vector (if indexes=[] then 0 else (natFromInteger (List_extra.head indexes))) dir vals)
l_env l_mem [] exps
| Def_val_dec default_exp ->
@@ -1769,11 +1773,11 @@ and interp_main mode t_level l_env l_mem (E_aux exp (l,annot)) =
(interp_main mode t_level l_env l_mem default_exp)
(fun v lm le ->
exp_list mode t_level
- (fun es ->
- let (ev,_) = to_exp <|mode with track_values = false |> eenv v in
+ (fun es env' ->
+ let (ev,env'') = to_exp mode env' v in
(E_aux (E_vector_indexed (map2 (fun i e -> (i,e)) indexes es)
(Def_val_aux (Def_val_dec ev) dannot))
- (l,annot)))
+ (l,annot), env''))
(fun vs ->
(V_vector_sparse b len dir (map2 (fun i v -> ((natFromInteger i),v)) indexes vs) v)) l_env l_mem [] exps)
(fun a ->
@@ -1787,7 +1791,7 @@ and interp_main mode t_level l_env l_mem (E_aux exp (l,annot)) =
l_mem, l_env)
| E_app f args ->
(match (exp_list mode t_level
- (fun es -> E_aux (E_app f es) (l,annot))
+ (fun es env -> (E_aux (E_app f es) (l,annot),env))
(fun vs -> match vs with | [] -> V_lit (L_aux L_unit l) | [v] -> v | vs -> V_tuple vs end)
l_env l_mem [] args) with
| (Value v,lm,le) ->
@@ -2026,6 +2030,13 @@ and create_write_message_or_update mode t_level value l_env l_mem is_top_level (
let (typ,tag,ncs,ef) = match annot with
| Nothing -> (T_var "fresh_v", Tag_empty, [], (Effect_aux (Effect_set []) Unknown))
| Just(t, tag, ncs, ef) -> (t,tag,ncs,ef) end in
+ let recenter_val typ value = match typ with
+ | T_app "reg" (T_args [T_arg_typ
+ (T_app "vector" (T_args [T_arg_nexp (Ne_const start); T_arg_nexp (Ne_const size); _; _ ]))]) ->
+ update_vector_start default_dir (natFromInteger start) (natFromInteger size) value
+ | T_abbrev _ (T_app "vector" (T_args [T_arg_nexp (Ne_const start); T_arg_nexp (Ne_const size); _; _ ])) ->
+ update_vector_start default_dir (natFromInteger start) (natFromInteger size) value
+ | _ -> value end in
match lexp with
| LEXP_id id ->
let name = get_id id in
@@ -2034,7 +2045,7 @@ and create_write_message_or_update mode t_level value l_env l_mem is_top_level (
match detaint (in_lenv l_env id) with
| ((V_boxref n t) as v) ->
if is_top_level
- then ((Value (V_lit (L_aux L_unit l)), update_mem l_mem n value, l_env),Nothing)
+ then ((Value (V_lit (L_aux L_unit l)), update_mem l_mem n (recenter_val t value), l_env),Nothing)
else ((Value v, l_mem, l_env),Just (fun e env -> (LEXP_aux (LEXP_id id) (l,annot), env)))
| V_unknown ->
if is_top_level then
@@ -2150,7 +2161,7 @@ and create_write_message_or_update mode t_level value l_env l_mem is_top_level (
l_mem,l_env),Nothing)
end
| LEXP_memory id exps ->
- match (exp_list mode t_level (fun exps -> E_aux (E_tuple exps) (Unknown,Nothing))
+ match (exp_list mode t_level (fun exps env -> (E_aux (E_tuple exps) (Unknown,Nothing),env))
(fun vs -> match vs with | [] -> V_lit (L_aux L_unit Unknown) | [v] -> v | vs -> V_tuple vs end)
l_env l_mem [] exps) with
| (Value v,lm,le) ->
@@ -2206,7 +2217,7 @@ and create_write_message_or_update mode t_level value l_env l_mem is_top_level (
match detaint (in_lenv l_env id) with
| ((V_boxref n t) as v) ->
if is_top_level
- then ((Value (V_lit (L_aux L_unit l)), update_mem l_mem n value, l_env),Nothing)
+ then ((Value (V_lit (L_aux L_unit l)), update_mem l_mem n (recenter_val t value), l_env),Nothing)
else ((Value v, l_mem, l_env),Just (fun e env -> (LEXP_aux (LEXP_cast typc id) (l,annot), env)))
| V_unknown ->
if is_top_level