aboutsummaryrefslogtreecommitdiffhomepage
path: root/kernel/cbytegen.ml
diff options
context:
space:
mode:
authorGravatar Maxime Dénès <mail@maximedenes.fr>2018-03-04 18:16:16 +0100
committerGravatar Maxime Dénès <mail@maximedenes.fr>2018-03-04 18:16:16 +0100
commita46a04577e34c69b42c2728ec1e0babb5be23e31 (patch)
tree85fcbb88f1e987041132e9b058fa5b100612887c /kernel/cbytegen.ml
parent78551857a41a57607ecfb3fd010e0a9755f47cea (diff)
parent0e79cec728dd4cfc3596a39b5d8bede663fea73c (diff)
Merge PR #935: Handling evars in the VM
Diffstat (limited to 'kernel/cbytegen.ml')
-rw-r--r--kernel/cbytegen.ml16
1 files changed, 16 insertions, 0 deletions
diff --git a/kernel/cbytegen.ml b/kernel/cbytegen.ml
index 0d7619e9f..10f82438c 100644
--- a/kernel/cbytegen.ml
+++ b/kernel/cbytegen.ml
@@ -257,6 +257,15 @@ let pos_universe_var i r sz =
r.in_env := push_fv db env;
Kenvacc(r.offset + pos)
+let pos_evar evk r =
+ let env = !(r.in_env) in
+ let cid = FVevar evk in
+ try Kenvacc(r.offset + find_at cid env)
+ with Not_found ->
+ let pos = env.size in
+ r.in_env := push_fv cid env;
+ Kenvacc (r.offset + pos)
+
(*i Examination of the continuation *)
(* Discard all instructions up to the next label. *)
@@ -427,6 +436,7 @@ let compile_fv_elem reloc fv sz cont =
| FVrel i -> pos_rel i reloc sz :: cont
| FVnamed id -> pos_named id reloc :: cont
| FVuniv_var i -> pos_universe_var i reloc sz :: cont
+ | FVevar evk -> pos_evar evk reloc :: cont
let rec compile_fv reloc l sz cont =
match l with
@@ -471,6 +481,12 @@ let rec compile_lam env reloc lam sz cont =
| Lvar id -> pos_named id reloc :: cont
+ | Levar (evk, args) ->
+ if Array.is_empty args then
+ compile_fv_elem reloc (FVevar evk) sz cont
+ else
+ comp_app compile_fv_elem (compile_lam env) reloc (FVevar evk) args sz cont
+
| Lconst (kn,u) -> compile_constant env reloc kn u [||] sz cont
| Lind (ind,u) ->