summaryrefslogtreecommitdiff
path: root/kernel/modops.ml
diff options
context:
space:
mode:
authorGravatar Enrico Tassi <gareuselesinge@debian.org>2015-07-15 10:36:12 +0200
committerGravatar Enrico Tassi <gareuselesinge@debian.org>2015-07-15 10:36:12 +0200
commit0aa2544d04dbd4b6ee665b551ed165e4fb02d2fa (patch)
tree12e8931a4a56da1a1bdfb89d670f4ba38fe08e1f /kernel/modops.ml
parentcec4741afacd2e80894232850eaf9f9c0e45d6d7 (diff)
Imported Upstream version 8.5~beta2+dfsgupstream/8.5_beta2+dfsg
Diffstat (limited to 'kernel/modops.ml')
-rw-r--r--kernel/modops.ml57
1 files changed, 37 insertions, 20 deletions
diff --git a/kernel/modops.ml b/kernel/modops.ml
index 392e667b..d52fe611 100644
--- a/kernel/modops.ml
+++ b/kernel/modops.ml
@@ -177,9 +177,9 @@ let subst_with_body sub = function
|WithMod(id,mp) as orig ->
let mp' = subst_mp sub mp in
if mp==mp' then orig else WithMod(id,mp')
- |WithDef(id,c) as orig ->
+ |WithDef(id,(c,ctx)) as orig ->
let c' = subst_mps sub c in
- if c==c' then orig else WithDef(id,c')
+ if c==c' then orig else WithDef(id,(c',ctx))
let rec subst_structure sub do_delta sign =
let subst_body ((l,body) as orig) = match body with
@@ -337,7 +337,7 @@ let strengthen_const mp_from l cb resolver =
in
{ cb with
const_body = Def (Mod_subst.from_val (mkConstU (con,u)));
- const_body_code = Cemitcodes.from_val (Cbytegen.compile_alias (con,u)) }
+ const_body_code = Some (Cemitcodes.from_val (Cbytegen.compile_alias (con,u))) }
let rec strengthen_mod mp_from mp_to mb =
if mp_in_delta mb.mod_mp mb.mod_delta then mb
@@ -428,16 +428,20 @@ let rec strengthen_and_subst_mod mb subst mp_from mp_to =
and strengthen_and_subst_struct str subst mp_from mp_to alias incl reso =
match str with
| [] -> empty_delta_resolver,[]
- | (l,SFBconst cb) :: rest ->
+ | (l,SFBconst cb) as item :: rest ->
let cb' = subst_const_body subst cb in
- let cb'' =
+ let cb' =
if alias then cb'
else strengthen_const mp_from l cb' reso
in
- let item' = l, SFBconst cb'' in
+ let item' = if cb' == cb then item else (l, SFBconst cb') in
let reso',rest' =
strengthen_and_subst_struct rest subst mp_from mp_to alias incl reso
in
+ let str' =
+ if rest' == rest && item' == item then str
+ else item' :: rest'
+ in
if incl then
(* If we are performing an inclusion we need to add
the fact that the constant mp_to.l is \Delta-equivalent
@@ -445,26 +449,31 @@ and strengthen_and_subst_struct str subst mp_from mp_to alias incl reso =
let kn_from = KerName.make2 mp_from l in
let kn_to = KerName.make2 mp_to l in
let old_name = kn_of_delta reso kn_from in
- add_kn_delta_resolver kn_to old_name reso', item'::rest'
+ add_kn_delta_resolver kn_to old_name reso', str'
else
(* In this case the fact that the constant mp_to.l is
\Delta-equivalent to resolver(mp_from.l) is already known
because reso' contains mp_to maps to reso(mp_from) *)
- reso', item'::rest'
- | (l,SFBmind mib) :: rest ->
- let item' = l,SFBmind (subst_mind_body subst mib) in
+ reso', str'
+ | (l,SFBmind mib) as item :: rest ->
+ let mib' = subst_mind_body subst mib in
+ let item' = if mib' == mib then item else (l, SFBmind mib') in
let reso',rest' =
strengthen_and_subst_struct rest subst mp_from mp_to alias incl reso
in
+ let str' =
+ if rest' == rest && item' == item then str
+ else item' :: rest'
+ in
(* Same as constant *)
if incl then
let kn_from = KerName.make2 mp_from l in
let kn_to = KerName.make2 mp_to l in
let old_name = kn_of_delta reso kn_from in
- add_kn_delta_resolver kn_to old_name reso', item'::rest'
+ add_kn_delta_resolver kn_to old_name reso', str'
else
- reso', item'::rest'
- | (l,SFBmodule mb) :: rest ->
+ reso', str'
+ | (l,SFBmodule mb) as item :: rest ->
let mp_from' = MPdot (mp_from,l) in
let mp_to' = MPdot (mp_to,l) in
let mb' = if alias then
@@ -472,31 +481,39 @@ and strengthen_and_subst_struct str subst mp_from mp_to alias incl reso =
else
strengthen_and_subst_mod mb subst mp_from' mp_to'
in
- let item' = l,SFBmodule mb' in
+ let item' = if mb' == mb then item else (l, SFBmodule mb') in
let reso',rest' =
strengthen_and_subst_struct rest subst mp_from mp_to alias incl reso
in
+ let str' =
+ if rest' == rest && item' == item then str
+ else item' :: rest'
+ in
(* if mb is a functor we should not derive new equivalences
on names, hence we add the fact that the functor can only
be equivalent to itself. If we adopt an applicative
semantic for functor this should be changed.*)
if is_functor mb'.mod_type then
- add_mp_delta_resolver mp_to' mp_to' reso', item':: rest'
+ add_mp_delta_resolver mp_to' mp_to' reso', str'
else
- add_delta_resolver reso' mb'.mod_delta, item':: rest'
- | (l,SFBmodtype mty) :: rest ->
+ add_delta_resolver reso' mb'.mod_delta, str'
+ | (l,SFBmodtype mty) as item :: rest ->
let mp_from' = MPdot (mp_from,l) in
let mp_to' = MPdot(mp_to,l) in
let subst' = add_mp mp_from' mp_to' empty_delta_resolver subst in
- let mty = subst_modtype subst'
+ let mty' = subst_modtype subst'
(fun resolver _ -> subst_dom_codom_delta_resolver subst' resolver)
mty
in
- let item' = l,SFBmodtype mty in
+ let item' = if mty' == mty then item else (l, SFBmodtype mty') in
let reso',rest' =
strengthen_and_subst_struct rest subst mp_from mp_to alias incl reso
in
- add_mp_delta_resolver mp_to' mp_to' reso', item'::rest'
+ let str' =
+ if rest' == rest && item' == item then str
+ else item' :: rest'
+ in
+ add_mp_delta_resolver mp_to' mp_to' reso', str'
(** Let P be a module path when we write: