aboutsummaryrefslogtreecommitdiffhomepage
path: root/pretyping/vnorm.ml
diff options
context:
space:
mode:
authorGravatar Benjamin Gregoire <Benjamin.Gregoire@inria.fr>2015-03-27 06:44:02 +0100
committerGravatar Benjamin Gregoire <Benjamin.Gregoire@inria.fr>2015-03-27 06:46:08 +0100
commit924a6e99f85aa0d70d42e753d6901b067ebf8f1d (patch)
treebc6d71b35edbd645394aa441722f7a2a14741ec5 /pretyping/vnorm.ml
parent00894adf6fc11f4336a3ece0c347676bbf0b4c11 (diff)
use a more compact representation of non-constant constructors
for which there corresponding tag are greater than max_variant_tag. The code is a merge with the patch proposed by Bruno on github barras/coq commit/504c753d7bb104ff4453fa0ede21c870ae2bb00c
Diffstat (limited to 'pretyping/vnorm.ml')
-rw-r--r--pretyping/vnorm.ml17
1 files changed, 12 insertions, 5 deletions
diff --git a/pretyping/vnorm.ml b/pretyping/vnorm.ml
index 3c302f8da..8198db1b8 100644
--- a/pretyping/vnorm.ml
+++ b/pretyping/vnorm.ml
@@ -165,9 +165,16 @@ and nf_whd env whd typ =
let _, args = nf_args env vargs t in
mkApp(cfd,args)
| Vconstr_const n -> construct_of_constr_const env n typ
- | Vconstr_block (tag,b) ->
+ | Vconstr_block b ->
+ let tag = btag b in
+ let (tag,ofs) =
+ if tag = Cbytecodes.last_variant_tag then
+ match whd_val (bfield b 0) with
+ | Vconstr_const tag -> (tag+Cbytecodes.last_variant_tag, 1)
+ | _ -> assert false
+ else (tag, 0) in
let capp,ctyp = construct_of_constr_block env tag typ in
- let args = nf_bargs env b ctyp in
+ let args = nf_bargs env b ofs ctyp in
mkApp(capp,args)
| Vatom_stk(Aid idkey, stk) ->
let c,typ = constr_type_of_idkey env idkey in
@@ -242,14 +249,14 @@ and nf_args env vargs t =
t := subst1 c codom; c) in
!t,args
-and nf_bargs env b t =
+and nf_bargs env b ofs t =
let t = ref t in
- let len = bsize b in
+ let len = bsize b - ofs in
let args =
Array.init len
(fun i ->
let _,dom,codom = decompose_prod env !t in
- let c = nf_val env (bfield b i) dom in
+ let c = nf_val env (bfield b (i+ofs)) dom in
t := subst1 c codom; c) in
args