diff options
-rw-r--r-- | src/Contexts.ml | 6 | ||||
-rw-r--r-- | src/Interpreter.ml | 16 |
2 files changed, 15 insertions, 7 deletions
diff --git a/src/Contexts.ml b/src/Contexts.ml index 6f0c02c4..7f0c822e 100644 --- a/src/Contexts.ml +++ b/src/Contexts.ml @@ -187,9 +187,11 @@ type type_context = { } [@@deriving show] +type fun_context = { fun_defs : fun_def FunDefId.Map.t } [@@deriving show] + type eval_ctx = { type_context : type_context; - fun_context : fun_def FunDefId.Map.t; + fun_context : fun_context; type_vars : type_var list; env : env; ended_regions : RegionId.Set.t; @@ -221,7 +223,7 @@ let ctx_lookup_type_def (ctx : eval_ctx) (tid : TypeDefId.id) : type_def = (** TODO: make this more efficient with maps *) let ctx_lookup_fun_def (ctx : eval_ctx) (fid : FunDefId.id) : fun_def = - FunDefId.Map.find fid ctx.fun_context + FunDefId.Map.find fid ctx.fun_context.fun_defs (** Retrieve a variable's value in an environment *) let env_lookup_var_value (env : env) (vid : VarId.id) : typed_value = diff --git a/src/Interpreter.ml b/src/Interpreter.ml index 79f39742..2641069b 100644 --- a/src/Interpreter.ml +++ b/src/Interpreter.ml @@ -14,8 +14,8 @@ module SA = SymbolicAst (** The local logger *) let log = L.interpreter_log -let initialize_context (m : M.cfim_module) (type_vars : T.type_var list) : - C.eval_ctx = +let compute_type_fun_contexts (m : M.cfim_module) : + C.type_context * C.fun_context = let type_decls, _ = M.split_declarations m.declarations in let type_defs, fun_defs = M.compute_defs_maps m in let type_defs_groups, _funs_defs_groups = @@ -25,10 +25,16 @@ let initialize_context (m : M.cfim_module) (type_vars : T.type_var list) : TypesAnalysis.analyze_type_declarations type_defs type_decls in let type_context = { C.type_defs_groups; type_defs; type_infos } in + let fun_context = { C.fun_defs } in + (type_context, fun_context) + +let initialize_eval_context (m : M.cfim_module) (type_vars : T.type_var list) : + C.eval_ctx = C.reset_global_counters (); + let type_context, fun_context = compute_type_fun_contexts m in { C.type_context; - C.fun_context = fun_defs; + C.fun_context; C.type_vars; C.env = []; C.ended_regions = T.RegionId.Set.empty; @@ -57,7 +63,7 @@ let initialize_symbolic_context_for_fun (m : M.cfim_module) (fdef : A.fun_def) : * *) let sg = fdef.signature in (* Create the context *) - let ctx = initialize_context m sg.type_params in + let ctx = initialize_eval_context m sg.type_params in (* Instantiate the signature *) let type_params = List.map (fun tv -> T.TypeVar tv.T.index) sg.type_params in let inst_sg = instantiate_fun_sig type_params sg in @@ -243,7 +249,7 @@ module Test = struct assert (fdef.A.arg_count = 0); (* Create the evaluation context *) - let ctx = initialize_context m [] in + let ctx = initialize_eval_context m [] in (* Insert the (uninitialized) local variables *) let ctx = C.ctx_push_uninitialized_vars ctx fdef.A.locals in |