summaryrefslogtreecommitdiff
path: root/src/interpreter.ml
diff options
context:
space:
mode:
Diffstat (limited to 'src/interpreter.ml')
-rw-r--r--src/interpreter.ml13
1 files changed, 11 insertions, 2 deletions
diff --git a/src/interpreter.ml b/src/interpreter.ml
index 599a83bf..a95ab8c3 100644
--- a/src/interpreter.ml
+++ b/src/interpreter.ml
@@ -338,6 +338,15 @@ let rec build_letchain id lbs (E_aux (_, annot) as exp) =
build_letchain id lbs exp
| _ :: lbs -> build_letchain id lbs exp
+let is_interpreter_extern id env =
+ let open Type_check in
+ Env.is_extern id env "interpreter" || Env.is_extern id env "ocaml"
+
+let get_interpreter_extern id env =
+ let open Type_check in
+ try Env.get_extern id env "interpreter" with
+ | Type_error _ -> Env.get_extern id env "ocaml"
+
let rec step (E_aux (e_aux, annot) as orig_exp) =
let wrap e_aux' = return (E_aux (e_aux', annot)) in
match e_aux with
@@ -419,9 +428,9 @@ let rec step (E_aux (e_aux, annot) as orig_exp) =
step exp >>= fun exp' -> wrap (E_app (id, evaluated @ exp' :: exps))
| [] when Env.is_union_constructor id (env_of_annot annot) ->
return (exp_of_value (V_ctor (string_of_id id, List.map value_of_exp evaluated)))
- | [] when Env.is_extern id (env_of_annot annot) "interpreter" ->
+ | [] when is_interpreter_extern id (env_of_annot annot) ->
begin
- let extern = Env.get_extern id (env_of_annot annot) "interpreter" in
+ let extern = get_interpreter_extern id (env_of_annot annot) in
if extern = "reg_deref" then
let regname = List.hd evaluated |> value_of_exp |> coerce_ref in
gets >>= fun (_, gstate) ->