aboutsummaryrefslogtreecommitdiff
path: root/src/tac2interp.ml
diff options
context:
space:
mode:
Diffstat (limited to 'src/tac2interp.ml')
-rw-r--r--src/tac2interp.ml31
1 files changed, 13 insertions, 18 deletions
diff --git a/src/tac2interp.ml b/src/tac2interp.ml
index 19efeb7669..815fdffe0f 100644
--- a/src/tac2interp.ml
+++ b/src/tac2interp.ml
@@ -88,7 +88,7 @@ let rec interp (ist : environment) = function
| GTacApp (f, args) ->
interp ist f >>= fun f ->
Proofview.Monad.List.map (fun e -> interp ist e) args >>= fun args ->
- Tac2ffi.to_closure f args
+ Tac2ffi.apply (Tac2ffi.to_closure f) args
| GTacLet (false, el, e) ->
let fold accu (na, e) =
interp ist e >>= fun e ->
@@ -133,28 +133,23 @@ let rec interp (ist : environment) = function
return (ValOpn (kn, Array.of_list el))
| GTacPrm (ml, el) ->
Proofview.Monad.List.map (fun e -> interp ist e) el >>= fun el ->
- with_frame (FrPrim ml) (Tac2env.interp_primitive ml el)
+ with_frame (FrPrim ml) (Tac2ffi.apply (Tac2env.interp_primitive ml) el)
| GTacExt (tag, e) ->
let tpe = Tac2env.interp_ml_object tag in
with_frame (FrExtn (tag, e)) (tpe.Tac2env.ml_interp ist e)
-and interp_app f = (); fun args -> match f with
-| { clos_env = ist; clos_var = ids; clos_exp = e; clos_ref = kn } ->
- let frame = match kn with
- | None -> FrAnon e
- | Some kn -> FrLtac kn
+and interp_app f =
+ let ans = fun args ->
+ let { clos_env = ist; clos_var = ids; clos_exp = e; clos_ref = kn } = f in
+ let frame = match kn with
+ | None -> FrAnon e
+ | Some kn -> FrLtac kn
+ in
+ let ist = { env_ist = ist } in
+ let ist = List.fold_left2 push_name ist ids args in
+ with_frame frame (interp ist e)
in
- let rec push ist ids args = match ids, args with
- | [], [] -> with_frame frame (interp ist e)
- | [], _ :: _ ->
- with_frame frame (interp ist e) >>= fun f -> Tac2ffi.to_closure f args
- | _ :: _, [] ->
- let cls = { clos_ref = kn; clos_env = ist.env_ist; clos_var = ids; clos_exp = e } in
- let f = interp_app cls in
- return (ValCls f)
- | id :: ids, arg :: args -> push (push_name ist id arg) ids args
- in
- push { env_ist = ist } ids args
+ Tac2ffi.abstract (List.length f.clos_var) ans
and interp_case ist e cse0 cse1 = match e with
| ValInt n -> interp ist cse0.(n)