let trust = ref (fun _ -> true);;
let set_trust f = trust := f
let trust_obj uri = !trust uri
-
+let debug_print = fun _ -> ()
(* ************************************************************************** *
TYPES
val is_in_frozen: UriManager.uri -> bool
val is_in_unchecked: UriManager.uri -> bool
val is_in_cooked: UriManager.uri -> bool
+ val list_all_cooked_uris: unit -> UriManager.uri list
end
=
struct
) l
in
C.Meta(i,l')
+ | C.Sort (C.Type u) ->
+ CicUniv.assert_univ u;
+ C.Sort (C.Type (CicUniv.recons_univ u))
| C.Sort _ as t -> t
| C.Implicit _ as t -> t
| C.Cast (te,ty) -> C.Cast (restore_in_term te, restore_in_term ty)
in
C.CoFix (i, liftedfl)
in
- function
+ function
C.Constant (name,bo,ty,params,attrs) ->
let bo' =
match bo with
*)
empty ();
HT.iter
- (fun k v ->
+ (fun k (v,u) ->
callback (UriManager.string_of_uri k);
HT.add cacheOfCookedObjects
(UriManager.uri_of_string (UriManager.string_of_uri k))
(***********************************************
TSSI: FIXME add channel stuff for universes
************************************************)
- ((restore_uris v),CicUniv.empty_ugraph))
+ (restore_uris v, CicUniv.recons_graph u))
restored
;;
(*******************************************************************
TASSI: invariant
we need, in the universe generation phase, to traverse objects
- that are not jet committed, so we search them in the frozen list.
+ that are not yet committed, so we search them in the frozen list.
Only uncommitted objects without a universe file (see the assertion)
can be searched with method
*******************************************************************)
None ->
assert false (* only NON dummy universes can be committed *)
| Some g ->
+ CicUniv.assert_univs_have_uri g;
frozen_list := List.remove_assq uri !frozen_list ;
HT.add cacheOfCookedObjects uri (obj,g)
with
frozen_list := List.remove_assoc uri !frozen_list;
frozen_list := (uri,(o,Some real_ugraph))::!frozen_list;
| Some g ->
- prerr_endline (
+ debug_print (
"You are probably hacking an object already hacked or an"^
" object that has the universe file but is not"^
" yet committed.");
assert false
with
Not_found ->
- prerr_endline (
+ debug_print (
"You are hacking an object that is not in the"^
" frozen_list, this means you are probably generating an"^
" universe file for an object that already"^
* something. this means check and frozen must be empty.
*)
let remove uri =
- if (!unchecked_list <> []) || (!frozen_list <> []) then
+ if !frozen_list <> [] then
failwith "CicEnvironment.remove while type checking"
else
HT.remove cacheOfCookedObjects uri
;;
+ let list_all_cooked_uris () =
+ HT.fold (fun u _ l -> u::l) cacheOfCookedObjects []
+ ;;
+
end
;;
let restore_from_channel = Cache.restore_from_channel;;
let empty = Cache.empty;;
+let total_parsing_time = ref 0.0
+
let get_object_to_add uri =
- let filename = Http_getter.getxml' uri in
- let bodyfilename =
- match UriManager.bodyuri_of_uri uri with
- None -> None
- | Some bodyuri ->
- try
- ignore (Http_getter.resolve' bodyuri) ;
- (* The body exists ==> it is not an axiom *)
- Some (Http_getter.getxml' bodyuri)
- with
- Http_getter_types.Key_not_found _ ->
- (* The body does not exist ==> we consider it an axiom *)
- None
- in
- let cleanup () =
- Unix.unlink filename ;
- (*
- begin
- match filename_univ with
- Some f -> Unix.unlink f
- | None -> ()
- end;
- *)
- begin
- match bodyfilename with
- Some f -> Unix.unlink f
- | None -> ()
- end
- in
- (* this brakes something :
- * let _ = CicUniv.restart_numbering () in
- *)
- let obj =
- try
- CicParser.obj_of_xml filename bodyfilename
- with exn ->
- cleanup ();
- (match exn with
- | CicParser.Getter_failure ("key_not_found", uri) ->
- raise (Object_not_found (UriManager.uri_of_string uri))
- | _ -> raise exn)
- in
+ try
+ let filename = Http_getter.getxml' uri in
+ let bodyfilename =
+ match UriManager.bodyuri_of_uri uri with
+ None -> None
+ | Some bodyuri ->
+ try
+ ignore (Http_getter.resolve' bodyuri) ;
+ (* The body exists ==> it is not an axiom *)
+ Some (Http_getter.getxml' bodyuri)
+ with
+ Http_getter_types.Key_not_found _ ->
+ (* The body does not exist ==> we consider it an axiom *)
+ None
+ in
+ let cleanup () =
+ Unix.unlink filename ;
+ (*
+ begin
+ match filename_univ with
+ Some f -> Unix.unlink f
+ | None -> ()
+ end;
+ *)
+ begin
+ match bodyfilename with
+ Some f -> Unix.unlink f
+ | None -> ()
+ end
+ in
+ (* restarts the numbering of named universes (the ones inside the cic) *)
+ let _ = CicUniv.restart_numbering () in
+ let obj =
+ try
+ let time = Unix.gettimeofday() in
+ let rc = CicParser.obj_of_xml uri filename bodyfilename in
+ total_parsing_time :=
+ !total_parsing_time +. ((Unix.gettimeofday()) -. time );
+ rc
+ with exn ->
+ cleanup ();
+ (match exn with
+ | CicParser.Getter_failure ("key_not_found", uri) ->
+ raise (Object_not_found (UriManager.uri_of_string uri))
+ | _ -> raise exn)
+ in
let ugraph,filename_univ =
(* FIXME: decomment this when the universes will be part of the library
- try
- let filename_univ =
- Http_getter.getxml' (
- UriManager.uri_of_string (
- (UriManager.string_of_uri uri) ^ ".univ"))
- in
- (Some (CicUniv.ugraph_of_xml filename_univ),Some filename_univ)
- with Failure s ->
-
- prerr_endline (
- "WE HAVE NO UNIVERSE FILE FOR " ^ (UriManager.string_of_uri uri));
- Inix.unlink
- None,None
- *)
- (**********************************************
- TASSI: should fail when universes will be ON
- ***********************************************)
- (Some CicUniv.empty_ugraph,None)
- in
- cleanup();
- obj,ugraph
+ try
+ let filename_univ =
+ Http_getter.getxml' (
+ UriManager.uri_of_string (
+ (UriManager.string_of_uri uri) ^ ".univ"))
+ in
+ (Some (CicUniv.ugraph_of_xml filename_univ),Some filename_univ)
+ with Failure s ->
+
+ debug_print (
+ "WE HAVE NO UNIVERSE FILE FOR " ^ (UriManager.string_of_uri uri));
+ Inix.unlink
+ None,None
+ *)
+ (**********************************************
+ TASSI: should fail when universes will be ON
+ ***********************************************)
+ (Some CicUniv.empty_ugraph,None)
+ in
+ cleanup();
+ obj,ugraph
+ with
+ Http_getter_types.Key_not_found _ -> raise (Object_not_found uri)
;;
(* this is the function to fetch the object in the unchecked list and
(* the replacement ugraph must be the one returned by the *)
(* typechecker, restricted with the CicUnivUtils.clean_and_fill *)
let set_type_checking_info ?(replace_ugraph=None) uri =
- if Cache.can_be_cooked uri && replace_ugraph <> None then
- invalid_arg (
+(*
+ if not (Cache.can_be_cooked uri) && replace_ugraph <> None then begin
+ debug_print (
"?replace_ugraph must be None if you are not committing an "^
"object that has a universe graph associated "^
"(can happen only in the fase of universes graphs generation).");
- if not (Cache.can_be_cooked uri) && replace_ugraph = None then
- invalid_arg (
- "?replace_ugraph must be (Some ugraph) when committing an object that "^
- "has no associated universe graph. If this is in make_univ phase you "^
- "should drop this exception and let univ_make commit thi object with "^
- "proper arguments");
- begin
- match replace_ugraph with
- None -> ()
- | Some g -> Cache.hack_univ uri g
- end;
- Cache.frozen_to_cooked uri
+ assert false
+ else
+*)
+ match Cache.can_be_cooked uri, replace_ugraph with
+ | true, Some _
+ | false, None ->
+ debug_print (
+ "?replace_ugraph must be (Some ugraph) when committing an object that "^
+ "has no associated universe graph. If this is in make_univ phase you "^
+ "should drop this exception and let univ_make commit thi object with "^
+ "proper arguments");
+ assert false
+ | _ ->
+ (match replace_ugraph with
+ | None -> ()
+ | Some g -> Cache.hack_univ uri g);
+ Cache.frozen_to_cooked uri
;;
(* fetch, unfreeze and commit an uri to the cacheOfCookedObjects and
else
(* we don't trust the uri, so we fail *)
begin
- prerr_endline ("CACHE MISS: " ^ (UriManager.string_of_uri uri));
+ debug_print ("CACHE MISS: " ^ (UriManager.string_of_uri uri));
raise Not_found
end
CheckedObj ( o, CicUniv.merge_ugraphs u base_univ )
else
let o,u = find_or_add_to_unchecked uri in
+ Cache.unchecked_to_frozen uri;
UncheckedObj o
;;
o,(CicUniv.merge_ugraphs base_univ u)
with Not_found ->
(* this should be an error case, but if we trust the uri... *)
- if trust_obj uri then
- (* trusting we add it to the unchecked list *)
let o,u = find_or_add_to_unchecked uri in
o,(CicUniv.merge_ugraphs base_univ u)
- else
- raise Not_found
;;
-exception OnlyPutOfInductiveDefinitionsIsAllowed
-
-let put_inductive_definition uri (obj,ugraph) =
- match obj with
- Cic.InductiveDefinition _ -> Cache.add_cooked uri (obj,ugraph)
- | _ -> raise OnlyPutOfInductiveDefinitionsIsAllowed
-;;
-
let in_cache uri =
Cache.is_in_cooked uri || Cache.is_in_frozen uri || Cache.is_in_unchecked uri
-let add_type_checked_term uri (obj,ugraph) =
- match obj with
- Cic.Constant (s,(Some bo),ty,ul,_) ->
- Cache.add_cooked ~key:uri (obj,ugraph)
- | _ ->
- assert false
-;;
+let add_type_checked_obj uri (obj,ugraph) =
+ Cache.add_cooked ~key:uri (obj,ugraph)
let in_library uri =
in_cache uri ||
true
with Http_getter_types.Key_not_found _ -> false)
-let remove_term = Cache.remove
+let remove_obj = Cache.remove
+
+let list_uri () =
+ Cache.list_all_cooked_uris ()
+;;
+let list_obj () =
+ try
+ List.map (fun u ->
+ let o,ug = get_obj CicUniv.empty_ugraph u in
+ (u,o,ug))
+ (list_uri ())
+ with
+ Not_found ->
+ debug_print "Who has removed the uri in the meanwhile?";
+ raise Not_found
+;;