X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;ds=sidebyside;f=helm%2Fsoftware%2Fcomponents%2Fng_kernel%2FnCicLibrary.ml;h=414e5c5de1fad5296fefc5f9fdd8549fbb87ffe6;hb=f6c887944d48d718f372a57f1609f3d059908aa8;hp=8c988de2f52b8f4d144051b8a2e7975aa96d5ec9;hpb=5c8de084e314e41f3dc2f605f6242283e930b803;p=helm.git diff --git a/helm/software/components/ng_kernel/nCicLibrary.ml b/helm/software/components/ng_kernel/nCicLibrary.ml index 8c988de2f..414e5c5de 100644 --- a/helm/software/components/ng_kernel/nCicLibrary.ml +++ b/helm/software/components/ng_kernel/nCicLibrary.ml @@ -26,6 +26,84 @@ let cache = ref NUri.UriMap.empty;; let time_travel (sto,ali,cac) = storage := sto; aliases := ali; cache := cac;; +let path_of_baseuri baseuri = + let uri = NUri.string_of_uri baseuri in + let path = String.sub uri 4 (String.length uri - 4) in + let path = Helm_registry.get "matita.basedir" ^ path in + let dirname = Filename.dirname path in + HExtlib.mkdir dirname; + path ^ ".ng" +;; + +let magic = 0;; + +let require0 ~baseuri = + let ch = open_in (path_of_baseuri baseuri) in + let mmagic,dump = Marshal.from_channel ch in + close_in ch; + if mmagic <> magic then + raise (LibraryOutOfSync (lazy "The library is out of sync with the implementation. Please recompile the library.")) + else + dump +;; + +let serialize ~baseuri dump = + let ch = open_out (path_of_baseuri baseuri) in + Marshal.to_channel ch (magic,dump) [Marshal.Closures]; + close_out ch; + List.iter + (fun (uri,obj) -> + let ch = open_out (path_of_baseuri uri) in + Marshal.to_channel ch (magic,obj) []; + close_out ch + ) !storage; + time_travel time0 +;; + +module type Serializer = + sig + type status + type obj + val register: string -> ('a -> status -> status) -> ('a -> obj) + val serialize: baseuri:NUri.uri -> obj list -> unit + val require: baseuri:NUri.uri -> status -> status + end + +module Serializer(S: sig type status end) = + struct + type status = S.status + type obj = Obj.t + + let require1 = ref (fun _ -> assert false (* unknown data*)) + let already_registered = ref [] + + let register tag require = + assert (not (List.mem tag !already_registered)); + already_registered := tag :: !already_registered; + require1 := + (fun (tag',data) as x -> + if tag=tag' then Obj.magic require data else Obj.magic !require1 x); + Obj.magic (fun x -> tag,x) + + let serialize = serialize + + let require ~baseuri status = + let dump = require0 ~baseuri in + List.fold_right (Obj.magic !require1) dump status +end + +let decompile ~baseuri = + Unix.unlink (path_of_baseuri baseuri) + (* WE ARE NOT REMOVING ALL THE OBJECTS YET! *) +;; + +(* the miracles of Marshal... *) +let fetch_obj uri = + let obj = require0 ~baseuri:uri in + (* here we need to refresh the URIs! *) + obj +;; + let resolve name = try HExtlib.filter_map @@ -79,9 +157,10 @@ let add_obj u obj = let get_obj u = try List.assq u !storage with Not_found -> - try NUri.UriMap.find u !cache - with Not_found -> - (* in the final implementation should get it from disk *) + try fetch_obj u + with Sys_error _ -> + try NUri.UriMap.find u !cache + with Not_found -> let ouri = NCic2OCic.ouri_of_nuri u in try let o,_ = CicEnvironment.get_obj CicUniv.oblivion_ugraph ouri in @@ -94,34 +173,3 @@ let get_obj u = ;; let clear_cache () = cache := NUri.UriMap.empty;; - -let magic = 0;; - -let path_of_baseuri baseuri = - let uri = NUri.string_of_uri baseuri in - let path = String.sub uri 4 (String.length uri - 4) in - let path = Helm_registry.get "matita.basedir" ^ path in - let dirname = Filename.dirname path in - HExtlib.mkdir dirname; - path ^ ".ng" -;; - -let serialize ~baseuri dump = - let ch = open_out (path_of_baseuri baseuri) in - Marshal.to_channel ch (magic,dump) [Marshal.Closures]; - close_out ch -;; - -let require ~baseuri = - let ch = open_in (path_of_baseuri baseuri) in - let mmagic,dump = Marshal.from_channel ch in - close_in ch; - if mmagic <> magic then - raise (LibraryOutOfSync (lazy "The library is out of sync with the implementation. Please recompile the library.")) - else - dump -;; - -let decompile ~baseuri = - Unix.unlink (path_of_baseuri baseuri) -;;