aboutsummaryrefslogtreecommitdiff
path: root/library/impargs.ml
diff options
context:
space:
mode:
Diffstat (limited to 'library/impargs.ml')
-rw-r--r--library/impargs.ml72
1 files changed, 58 insertions, 14 deletions
diff --git a/library/impargs.ml b/library/impargs.ml
index 5248bc4a61..e2ec4a4762 100644
--- a/library/impargs.ml
+++ b/library/impargs.ml
@@ -7,6 +7,8 @@ open Reduction
open Declarations
open Environ
open Inductive
+open Libobject
+open Lib
type implicits =
| Impl_auto of int list
@@ -43,18 +45,30 @@ let list_of_implicits = function
| Impl_manual l -> l
| No_impl -> []
-(* Constants. *)
+(*s Constants. *)
let constants_table = ref Spmap.empty
-let declare_constant_implicits sp =
+let compute_constant_implicits sp =
let env = Global.env () in
let cb = lookup_constant sp env in
- let imps = auto_implicits env (body_of_type cb.const_type) in
+ auto_implicits env (body_of_type cb.const_type)
+
+let cache_constant_implicits (_,(sp,imps)) =
constants_table := Spmap.add sp imps !constants_table
-let declare_constant_manual_implicits sp imps =
- constants_table := Spmap.add sp (Impl_manual imps) !constants_table
+let (in_constant_implicits, _) =
+ let od = {
+ cache_function = cache_constant_implicits;
+ load_function = cache_constant_implicits;
+ open_function = (fun _ -> ());
+ export_function = (fun x -> Some x) }
+ in
+ declare_object ("CONSTANT-IMPLICITS", od)
+
+let declare_constant_implicits sp =
+ let imps = compute_constant_implicits sp in
+ add_anonymous_leaf (in_constant_implicits (sp,imps))
let constant_implicits sp =
try Spmap.find sp !constants_table with Not_found -> No_impl
@@ -62,14 +76,14 @@ let constant_implicits sp =
let constant_implicits_list sp =
list_of_implicits (constant_implicits sp)
-(* Inductives and constructors. Their implicit arguments are stored
+(*s Inductives and constructors. Their implicit arguments are stored
in an array, indexed by the inductive number, of pairs $(i,v)$ where
$i$ are the implicit arguments of the inductive and $v$ the array of
implicit arguments of the constructors. *)
let inductives_table = ref Spmap.empty
-let declare_inductive_implicits sp =
+let compute_inductive_implicits sp =
let env = Global.env () in
let mib = lookup_mind sp env in
let env_ar = push_rels (mind_arities_context mib) env in
@@ -78,9 +92,24 @@ let declare_inductive_implicits sp =
Array.map (fun c -> auto_implicits env_ar (body_of_type c))
(mind_user_lc mip))
in
- let imps = Array.map imps_one_inductive mib.mind_packets in
+ Array.map imps_one_inductive mib.mind_packets
+
+let cache_inductive_implicits (_,(sp,imps)) =
inductives_table := Spmap.add sp imps !inductives_table
-
+
+let (in_inductive_implicits, _) =
+ let od = {
+ cache_function = cache_inductive_implicits;
+ load_function = cache_inductive_implicits;
+ open_function = (fun _ -> ());
+ export_function = (fun x -> Some x) }
+ in
+ declare_object ("INDUCTIVE-IMPLICITS", od)
+
+let declare_inductive_implicits sp =
+ let imps = compute_inductive_implicits sp in
+ add_anonymous_leaf (in_inductive_implicits (sp,imps))
+
let inductive_implicits (sp,i) =
try
let imps = Spmap.find sp !inductives_table in fst imps.(i)
@@ -99,20 +128,35 @@ let constructor_implicits_list constr_sp =
let inductive_implicits_list ind_sp =
list_of_implicits (inductive_implicits ind_sp)
-(* Variables. *)
+(*s Variables. *)
let var_table = ref Spmap.empty
-let declare_var_implicits sp =
+let compute_var_implicits sp =
let env = Global.env () in
let (_,ty) = lookup_named (basename sp) env in
- let imps = auto_implicits env (body_of_type ty) in
+ auto_implicits env (body_of_type ty)
+
+let cache_var_implicits (_,(sp,imps)) =
var_table := Spmap.add sp imps !var_table
+let (in_var_implicits, _) =
+ let od = {
+ cache_function = cache_var_implicits;
+ load_function = cache_var_implicits;
+ open_function = (fun _ -> ());
+ export_function = (fun x -> Some x) }
+ in
+ declare_object ("VARIABLE-IMPLICITS", od)
+
+let declare_var_implicits sp =
+ let imps = compute_var_implicits sp in
+ add_anonymous_leaf (in_var_implicits (sp,imps))
+
let implicits_of_var sp =
list_of_implicits (try Spmap.find sp !var_table with Not_found -> No_impl)
-(* Tests if declared implicit *)
+(*s Tests if declared implicit *)
let is_implicit_constant sp =
try let _ = Spmap.find sp !constants_table in true with Not_found -> false
@@ -130,7 +174,7 @@ let implicits_of_global = function
| ConstructRef csp -> list_of_implicits (constructor_implicits csp)
| EvarRef _ -> []
-(* Registration as global tables and roolback. *)
+(*s Registration as global tables and rollback. *)
type frozen_t = bool
* implicits Spmap.t