diff options
| author | Kathy Gray | 2014-04-25 08:52:41 +0100 |
|---|---|---|
| committer | Kathy Gray | 2014-04-25 08:53:58 +0100 |
| commit | ef014438c63984992429c325966f9007c8b85b29 (patch) | |
| tree | f857ab0df3c2ac22e637e772aca3da9d2d32b9df /src | |
| parent | fe28d6a93686eca649c3a8db7eb3c4b6e363e511 (diff) | |
rename interpreter's local memory type to reflect that it's all local memory
Diffstat (limited to 'src')
| -rw-r--r-- | src/lem_interp/interp.lem | 33 |
1 files changed, 17 insertions, 16 deletions
diff --git a/src/lem_interp/interp.lem b/src/lem_interp/interp.lem index 13d54d0b..ef0dbc00 100644 --- a/src/lem_interp/interp.lem +++ b/src/lem_interp/interp.lem @@ -91,10 +91,11 @@ instance (Eq value) let (<>) n1 n2 = not (value_eq n1 n2) end -type mem = Mem of nat * map nat value +(* Store for local memory of ref cells *) +type lmem = LMem of nat * map nat value type env = list (id * value) -let emem = Mem 1 Map.empty +let emem = LMem 1 Map.empty (* These may need to be refined or expanded based on memory requirement *) type action = @@ -107,7 +108,7 @@ type action = (* Inverted call stack, where top item on the stack is waiting for an action and all other frames for the right stack *) type stack = | Top - | Frame of id * exp tannot * env * mem * stack + | Frame of id * exp tannot * env * lmem * stack (* Either a case must be added for parallel options or action must be tied to a list *) type outcome = @@ -185,16 +186,16 @@ let rec in_env env id = | (eid,value)::env -> if (get_id eid) = (get_id id) then Just value else in_env env id end -val in_mem : mem -> nat -> value -let in_mem (Mem _ m) n = +val in_mem : lmem -> nat -> value +let in_mem (LMem _ m) n = Map_extra.find n m (* Map.lookup n m *) -val update_mem : mem -> nat -> value -> mem -let update_mem (Mem c m) loc value = +val update_mem : lmem -> nat -> value -> lmem +let update_mem (LMem c m) loc value = let m' = Map.delete loc m in let m' = Map.insert loc value m' in - Mem c m' + LMem c m' val is_lit_vector : lit -> bool let is_lit_vector (L_aux l _) = @@ -266,7 +267,7 @@ let fupdate_record base updates = match (base,updates) with | (V_record t bs,V_record _ us) -> V_record t (update_field_list bs us) end -val update_vector_slice : value -> value -> mem -> mem +val update_vector_slice : value -> value -> lmem -> lmem let rec update_vector_slice vector value mem = match (vector,value) with | ((V_vector m inc vs),(V_vector n inc2 vals)) -> @@ -621,9 +622,9 @@ let rec find_case pexps value = (all definitions, letbound and enum values, register values, Typedef union constructors, and sub register mappings) *) type top_level = Env of (defs tannot) * env * env * list (id * typ) * list (id * list (id * index_range)) -val interp_main : top_level -> env -> mem -> (exp tannot) -> (outcome * mem * env) -val exp_list : top_level -> (list (exp tannot) -> (exp tannot)) -> (list value -> value) -> env -> mem -> list value -> list (exp tannot) -> (outcome * mem * env) -val interp_lbind : top_level -> env -> mem -> (letbind tannot) -> ((outcome * mem * env) * (maybe ((exp tannot) -> (letbind tannot)))) +val interp_main : top_level -> env -> lmem -> (exp tannot) -> (outcome * lmem * env) +val exp_list : top_level -> (list (exp tannot) -> (exp tannot)) -> (list value -> value) -> env -> lmem -> list value -> list (exp tannot) -> (outcome * lmem * env) +val interp_lbind : top_level -> env -> lmem -> (letbind tannot) -> ((outcome * lmem * env) * (maybe ((exp tannot) -> (letbind tannot)))) let resolve_outcome to_match value_thunk action_thunk = match to_match with @@ -1106,8 +1107,8 @@ and create_write_message_or_update t_level value l_env l_mem is_top_level ((LEXP else ((Value v Tag_empty,l_mem,l_env),Just (fun e -> LEXP_aux(LEXP_id id) (l,annot))) | Nothing -> if is_top_level then begin - let (Mem c m) = l_mem in - let l_mem = (Mem (c+1) m) in + let (LMem c m) = l_mem in + let l_mem = (LMem (c+1) m) in ((Value (V_lit (L_aux L_unit l)) Tag_empty, update_mem l_mem c value, (id,(V_boxref c typ))::l_env),Nothing) end else ((Error l (String.stringAppend "Undefined id " (get_id id)),l_mem,l_env),Nothing) end) @@ -1149,8 +1150,8 @@ and create_write_message_or_update t_level value l_env l_mem is_top_level ((LEXP | Nothing -> if is_top_level then begin - let (Mem c m) = l_mem in - let l_mem = (Mem (c+1) m) in + let (LMem c m) = l_mem in + let l_mem = (LMem (c+1) m) in ((Value (V_lit (L_aux L_unit l)) Tag_empty, update_mem l_mem c value, (id,(V_boxref c typ))::l_env),Nothing) end else ((Error l (String.stringAppend "Undefined id " (get_id id)),l_mem,l_env),Nothing) |
