infer_clone/infer/src/java/jModels.ml

47 lines
1.4 KiB

(*
* 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)