exception CircularDependency of string Lazy.t;;
exception ObjectNotFound of string Lazy.t;;
-exception BadDependency of string Lazy.t;;
+exception BadDependency of string Lazy.t * exn;;
exception BadConstraint of string Lazy.t;;
+let get_obj = ref (fun _ -> assert false);;
+let set_get_obj f = get_obj := f;;
+
let type0 = []
let max l1 l2 =
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
+ let obj = !get_obj u 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' ->
+ | Propagate (u',old_exn) 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
+ " which is not well-typed"),
+ match old_exn with BadDependency (_,e) -> e | _ -> old_exn)) in
NUri.UriHash.add cache u exn;
if saved_frozen_list = [] then
exn