(* ||M|| This file is part of HELM, an Hypertextual, Electronic ||A|| Library of Mathematics, developed at the Computer Science ||T|| Department, University of Bologna, Italy. ||I|| ||T|| HELM is free software; you can redistribute it and/or ||A|| modify it under the terms of the GNU General Public License \ / version 2 or (at your option) any later version. \ / This software is distributed as is, NO WARRANTY. V_______________________________________________________________ *) exception CircularDependency of string Lazy.t;; exception ObjectNotFound of string Lazy.t;; exception BadDependency of string Lazy.t;; let typecheck_obj,already_set = ref (fun _ -> assert false), ref false;; let set_typecheck_obj f = if !already_set then assert false else begin typecheck_obj := f; already_set := true end ;; let cache = NUri.UriHash.create 313;; let frozen_list = ref [];; exception Propagate of NUri.uri * exn;; let get_checked_obj u = if List.exists (fun (k,_) -> NUri.eq u k) !frozen_list then raise (CircularDependency (lazy (NUri.string_of_uri u))) else let obj = try NUri.UriHash.find cache u with Not_found -> let saved_frozen_list = !frozen_list in try let obj = try NCicLibrary.get_obj u with NCicLibrary.ObjectNotFound m -> raise (ObjectNotFound m) in frozen_list := (u,obj)::saved_frozen_list; !typecheck_obj obj; frozen_list := saved_frozen_list; let obj = `WellTyped obj in NUri.UriHash.add cache u obj; obj with Sys.Break as e -> frozen_list := saved_frozen_list; raise e | Propagate (u',_) as e' -> frozen_list := saved_frozen_list; let exn = `Exn (BadDependency (lazy (NUri.string_of_uri u' ^ " depends (recursively) on " ^ NUri.string_of_uri u ^ " which is not well-typed"))) in NUri.UriHash.add cache u exn; if saved_frozen_list = [] then exn else raise e' | e -> frozen_list := saved_frozen_list; let exn = `Exn e in NUri.UriHash.add cache u exn; if saved_frozen_list = [] then exn else raise (Propagate (u,e)) in match obj with `WellTyped o -> o | `Exn e -> raise e ;; let get_checked_def = function | NReference.Ref (_, uri, NReference.Def) -> (match get_checked_obj uri with | _,height,_,_, NCic.Constant (rlv,name,Some bo,ty,att) -> rlv,name,bo,ty,att,height | _,_,_,_, NCic.Constant (_,_,None,_,_) -> prerr_endline "get_checked_def on an axiom"; assert false | _ -> prerr_endline "get_checked_def on a non def 2"; assert false) | _ -> prerr_endline "get_checked_def on a non def"; assert false ;; let get_checked_indtys = function | NReference.Ref (_, uri, (NReference.Ind (_,n)|NReference.Con (n,_))) -> (match get_checked_obj uri with | _,_,_,_, NCic.Inductive (inductive,leftno,tys,att) -> inductive,leftno,tys,att,n | _ -> prerr_endline "get_checked_indtys on a non ind 2"; assert false) | _ -> prerr_endline "get_checked_indtys on a non ind"; assert false ;; let get_checked_fixes_or_cofixes = function | NReference.Ref (_, uri, (NReference.Fix (fixno,_)|NReference.CoFix fixno))-> (match get_checked_obj uri with | _,height,_,_, NCic.Fixpoint (_,funcs,att) -> funcs, att, height | _ ->prerr_endline "get_checked_(co)fix on a non (co)fix 2";assert false) | r -> prerr_endline ("get_checked_(co)fix on " ^ NReference.string_of_reference r); assert false ;; let get_indty_leftno = function | NReference.Ref (_, uri, NReference.Ind _) | NReference.Ref (_, uri, NReference.Con _) -> (match get_checked_obj uri with | _,_,_,_, NCic.Inductive (_,left,_,_) -> left | _ ->prerr_endline "get_indty_leftno called on a non ind 2";assert false) | _ -> prerr_endline "get_indty_leftno called on a non indty";assert false ;; let invalidate _ = assert (!frozen_list = []); NUri.UriHash.clear cache ;;