Summary: The classpath module doesn't need to know about model handling. Also, strengthen some invariants, use option types instead of strings, and hash sets instead of tree sets. Reviewed By: skcho Differential Revision: D20228873 fbshipit-source-id: 18b6bb276master
parent
d71e2f0d84
commit
0b3031bbdc
@ -0,0 +1,46 @@
|
|||||||
|
(*
|
||||||
|
* Copyright (c) 2009-2013, Monoidics ltd.
|
||||||
|
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||||
|
*
|
||||||
|
* This source code is licensed under the MIT license found in the
|
||||||
|
* LICENSE file in the root directory of this source tree.
|
||||||
|
*)
|
||||||
|
|
||||||
|
open! IStd
|
||||||
|
module L = Logging
|
||||||
|
|
||||||
|
let models_jar = ref None
|
||||||
|
|
||||||
|
let get_models_jar_filename () = !models_jar
|
||||||
|
|
||||||
|
module StringHash = Caml.Hashtbl.Make (String)
|
||||||
|
|
||||||
|
let models_specs_filenames = StringHash.create 1
|
||||||
|
|
||||||
|
let collect_specs_filenames jar_filename =
|
||||||
|
let zip_channel = Zip.open_in jar_filename in
|
||||||
|
let collect entry =
|
||||||
|
let filename = entry.Zip.filename in
|
||||||
|
if Filename.check_suffix filename Config.specs_files_suffix then
|
||||||
|
let proc_filename = Filename.chop_extension (Filename.basename filename) in
|
||||||
|
StringHash.replace models_specs_filenames proc_filename ()
|
||||||
|
in
|
||||||
|
List.iter ~f:collect (Zip.entries zip_channel) ;
|
||||||
|
Zip.close_in zip_channel
|
||||||
|
|
||||||
|
|
||||||
|
let set_models ~jar_filename =
|
||||||
|
match !models_jar with
|
||||||
|
| None when match Sys.file_exists jar_filename with `Yes -> false | _ -> true ->
|
||||||
|
L.die InternalError "Java model file not found@."
|
||||||
|
| None ->
|
||||||
|
models_jar := Some jar_filename ;
|
||||||
|
collect_specs_filenames jar_filename
|
||||||
|
| Some filename when String.equal filename jar_filename ->
|
||||||
|
()
|
||||||
|
| Some filename ->
|
||||||
|
L.die InternalError "Asked to load a 2nd models jar (%s) when %s was loaded.@." jar_filename
|
||||||
|
filename
|
||||||
|
|
||||||
|
|
||||||
|
let is_model procname = StringHash.mem models_specs_filenames (Procname.to_filename procname)
|
@ -0,0 +1,17 @@
|
|||||||
|
(*
|
||||||
|
* Copyright (c) 2009-2013, Monoidics ltd.
|
||||||
|
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||||
|
*
|
||||||
|
* This source code is licensed under the MIT license found in the
|
||||||
|
* LICENSE file in the root directory of this source tree.
|
||||||
|
*)
|
||||||
|
|
||||||
|
open! IStd
|
||||||
|
|
||||||
|
val set_models : jar_filename:string -> unit
|
||||||
|
(** Sets the procnames in the given jar file as models *)
|
||||||
|
|
||||||
|
val is_model : Procname.t -> bool
|
||||||
|
(** Check if there is a model for the given procname *)
|
||||||
|
|
||||||
|
val get_models_jar_filename : unit -> string option
|
Loading…
Reference in new issue