[infer][java] Isolate the call to the JBir transformation to a single place

Summary: Having only place where the code runs the transformation of the Java bytecode into the JBir reporesentation allows to more easily start manipulating the JBir representation and the bytecode together and progressively move the translation based on bytecode instead of JBir.

Reviewed By: sblackshear

Differential Revision: D4137576

fbshipit-source-id: c483528
master
Jeremy Dubreil 9 years ago committed by Facebook Github Bot
parent 1b07f78e32
commit 3b997e4882

@ -77,11 +77,9 @@ let add_edges
(** Add a concrete method. *) (** Add a concrete method. *)
let add_cmethod source_file program linereader icfg cm proc_name = let add_cmethod source_file program linereader icfg cm proc_name =
let cn, _ = JBasics.cms_split cm.Javalib.cm_class_method_signature in let cn, _ = JBasics.cms_split cm.Javalib.cm_class_method_signature in
let jmethod = (Javalib.ConcreteMethod cm) in match JTrans.create_cm_procdesc source_file program linereader icfg cm proc_name with
match JTrans.create_procdesc source_file program linereader icfg jmethod with
| None -> () | None -> ()
| Some _ when JTrans.is_java_native cm -> () | Some (procdesc, impl) ->
| Some procdesc ->
let start_node = Cfg.Procdesc.get_start_node procdesc in let start_node = Cfg.Procdesc.get_start_node procdesc in
let exit_node = Cfg.Procdesc.get_exit_node procdesc in let exit_node = Cfg.Procdesc.get_exit_node procdesc in
let exn_node = let exn_node =
@ -89,7 +87,6 @@ let add_cmethod source_file program linereader icfg cm proc_name =
| Some node -> node | Some node -> node
| None -> | None ->
failwithf "No exn node found for %s" (Procname.to_string proc_name) in failwithf "No exn node found for %s" (Procname.to_string proc_name) in
let impl = JTrans.get_implementation cm in
let instrs = JBir.code impl in let instrs = JBir.code impl in
let context = let context =
JContext.create_context icfg procdesc impl cn source_file program in JContext.create_context icfg procdesc impl cn source_file program in
@ -98,15 +95,6 @@ let add_cmethod source_file program linereader icfg cm proc_name =
Cg.add_defined_node icfg.JContext.cg proc_name Cg.add_defined_node icfg.JContext.cg proc_name
(** Add an abstract method. *)
let add_amethod source_file program linereader icfg am proc_name =
let jmethod = (Javalib.AbstractMethod am) in
match JTrans.create_procdesc source_file program linereader icfg jmethod with
| None -> ()
| Some _ ->
Cg.add_defined_node icfg.JContext.cg proc_name
let path_of_cached_classname cn = let path_of_cached_classname cn =
let root_path = Filename.concat Config.results_dir "classnames" in let root_path = Filename.concat Config.results_dir "classnames" in
let package_path = IList.fold_left Filename.concat root_path (JBasics.cn_package cn) in let package_path = IList.fold_left Filename.concat root_path (JBasics.cn_package cn) in
@ -151,15 +139,22 @@ let create_icfg source_file linereader program icfg cn node =
(* do not translate the method if there is a model for it *) (* do not translate the method if there is a model for it *)
L.out_debug "Skipping method with a model: %s@." (Procname.to_string proc_name) L.out_debug "Skipping method with a model: %s@." (Procname.to_string proc_name)
else else
begin try
(* each procedure has different scope: start names from id 0 *) (* each procedure has different scope: start names from id 0 *)
Ident.NameGenerator.reset (); Ident.NameGenerator.reset ();
match m with match m with
| Javalib.AbstractMethod am ->
ignore (JTrans.create_am_procdesc program icfg am proc_name);
(* TODO #4040807: investigate why we need to mark asbtract methods as defined *)
Cg.add_defined_node icfg.JContext.cg proc_name
| Javalib.ConcreteMethod cm when JTrans.is_java_native cm ->
ignore (JTrans.create_native_procdesc program icfg cm proc_name)
| Javalib.ConcreteMethod cm -> | Javalib.ConcreteMethod cm ->
add_cmethod source_file program linereader icfg cm proc_name add_cmethod source_file program linereader icfg cm proc_name
| Javalib.AbstractMethod am -> with JBasics.Class_structure_error _ ->
add_amethod source_file program linereader icfg am proc_name L.do_err
end in "create_icfg raised JBasics.Class_structure_error on %a@."
Procname.pp proc_name in
Javalib.m_iter translate node Javalib.m_iter translate node

@ -230,21 +230,17 @@ let update_init_loc cn ms loc_start =
try ignore(JBasics.ClassMap.find cn !init_loc_map) try ignore(JBasics.ClassMap.find cn !init_loc_map)
with Not_found -> init_loc_map := (JBasics.ClassMap.add cn loc_start !init_loc_map) with Not_found -> init_loc_map := (JBasics.ClassMap.add cn loc_start !init_loc_map)
(** Creates a procedure description. *)
let create_procdesc source_file program linereader icfg m : Cfg.Procdesc.t option =
let cfg = icfg.JContext.cfg in
let tenv = icfg.JContext.tenv in
let cn, ms = JBasics.cms_split (Javalib.get_class_method_signature m) in
let proc_name = JTransType.translate_method_name m in
let trans_access = function let trans_access = function
| `Default -> PredSymb.Default | `Default -> PredSymb.Default
| `Public -> PredSymb.Public | `Public -> PredSymb.Public
| `Private -> PredSymb.Private | `Private -> PredSymb.Private
| `Protected -> PredSymb.Protected in | `Protected -> PredSymb.Protected
try
let procdesc = let create_am_procdesc program icfg am proc_name : Cfg.Procdesc.t =
match m with let cfg = icfg.JContext.cfg in
| Javalib.AbstractMethod am -> (* create a procdesc with empty body *) let tenv = icfg.JContext.tenv in
let m = Javalib.AbstractMethod am in
let cn, ms = JBasics.cms_split (Javalib.get_class_method_signature m) in
let formals = let formals =
formals_from_signature program tenv cn ms (JTransType.get_method_kind m) in formals_from_signature program tenv cn ms (JTransType.get_method_kind m) in
let method_annotation = let method_annotation =
@ -271,7 +267,12 @@ let create_procdesc source_file program linereader icfg m : Cfg.Procdesc.t optio
Cfg.Procdesc.set_start_node procdesc start_node; Cfg.Procdesc.set_start_node procdesc start_node;
Cfg.Procdesc.set_exit_node procdesc exit_node; Cfg.Procdesc.set_exit_node procdesc exit_node;
procdesc procdesc
| Javalib.ConcreteMethod cm when is_java_native cm ->
let create_native_procdesc program icfg cm proc_name =
let cfg = icfg.JContext.cfg in
let tenv = icfg.JContext.tenv in
let m = Javalib.ConcreteMethod cm in
let cn, ms = JBasics.cms_split (Javalib.get_class_method_signature m) in
let formals = let formals =
formals_from_signature program tenv cn ms (JTransType.get_method_kind m) in formals_from_signature program tenv cn ms (JTransType.get_method_kind m) in
let method_annotation = let method_annotation =
@ -286,9 +287,17 @@ let create_procdesc source_file program linereader icfg m : Cfg.Procdesc.t optio
method_annotation; method_annotation;
ret_type = JTransType.return_type program tenv ms; ret_type = JTransType.return_type program tenv ms;
} in } in
Cfg.create_proc_desc cfg proc_attributes; Cfg.create_proc_desc cfg proc_attributes
| Javalib.ConcreteMethod cm ->
(** Creates a procedure description. *)
let create_cm_procdesc source_file program linereader icfg cm proc_name =
let cfg = icfg.JContext.cfg in
let tenv = icfg.JContext.tenv in
let m = Javalib.ConcreteMethod cm in
let cn, ms = JBasics.cms_split (Javalib.get_class_method_signature m) in
try
let impl = get_implementation cm in let impl = get_implementation cm in
let procdesc =
let locals, formals = locals_formals program tenv cn impl in let locals, formals = locals_formals program tenv cn impl in
let loc_start = let loc_start =
let loc = get_location source_file impl 0 in let loc = get_location source_file impl 0 in
@ -326,10 +335,10 @@ let create_procdesc source_file program linereader icfg m : Cfg.Procdesc.t optio
Cfg.Procdesc.set_exit_node procdesc exit_node; Cfg.Procdesc.set_exit_node procdesc exit_node;
Cfg.Node.add_locals_ret_declaration start_node proc_attributes locals; Cfg.Node.add_locals_ret_declaration start_node proc_attributes locals;
procdesc in procdesc in
Some procdesc Some (procdesc, impl)
with JBir.Subroutine | JBasics.Class_structure_error _ -> with JBir.Subroutine ->
L.do_err L.do_err
"create_procdesc raised JBir.Subroutine or JBasics.Class_structure_error on %a@." "create_procdesc raised JBir.Subroutine on %a@."
Procname.pp proc_name; Procname.pp proc_name;
None None

@ -22,18 +22,28 @@ type translation =
val is_java_native : JCode.jcode Javalib.concrete_method -> bool val is_java_native : JCode.jcode Javalib.concrete_method -> bool
(** [create_procdesc linereader cfg tenv program m] creates a procedure description (** Create the procedure description for an abstract method *)
for the method m and adds it to cfg *) val create_am_procdesc :
val create_procdesc : JClasspath.program -> JContext.icfg -> Javalib.abstract_method -> Procname.t -> Cfg.Procdesc.t
(** Create the procedure description for a concrete method *)
val create_native_procdesc :
JClasspath.program ->
JContext.icfg ->
JCode.jcode Javalib.concrete_method ->
Procname.t ->
Cfg.Procdesc.t
(** [create_procdesc source_file program linereader icfg cm proc_name] creates
a procedure description for the concrete method cm and adds it to cfg *)
val create_cm_procdesc :
DB.source_file -> DB.source_file ->
JClasspath.program -> JClasspath.program ->
Printer.LineReader.t -> Printer.LineReader.t ->
JContext.icfg -> JContext.icfg ->
JCode.jcode Javalib.jmethod -> JCode.jcode Javalib.concrete_method ->
Cfg.Procdesc.t option Procname.t ->
(Cfg.Procdesc.t * JBir.t) option
(** returns the implementation of a given method *)
val get_implementation : JCode.jcode Javalib.concrete_method -> JBir.t
(** translates an instruction into a statement node or prune nodes in the cfg *) (** translates an instruction into a statement node or prune nodes in the cfg *)
val instruction : JContext.t -> int -> JBir.instr -> translation val instruction : JContext.t -> int -> JBir.instr -> translation

Loading…
Cancel
Save