(* * Copyright (c) 2009 - 2013 Monoidics ltd. * Copyright (c) 2013 - present Facebook, Inc. * All rights reserved. * * This source code is licensed under the BSD style license found in the * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. *) open! Utils open Javalib_pack open Sawja_pack (** data structure for representing whether an instruction is a goto, a return or a standard instruction. *) type jump_kind = | Next | Jump of int | Exit (** data structure for identifying whether a method is the initialiser of a class - that initialises the static fields- or a standard method *) type meth_kind = | Normal | Init (** Hastable for storing nodes that correspond to if-instructions. These are used when adding the edges in the contrl flow graph. *) module NodeTbl : Hashtbl.S with type key = Cfg.Node.t (** data structure for saving the three structures tht contain the intermediate representation of a file: the type environment, the control graph and the control flow graph *) type icfg = { tenv : Tenv.t; cg : Cg.t; cfg : Cfg.cfg; } (** data structure for storing the context elements. *) type t (** cretes a context for a given method. *) val create_context : icfg -> Cfg.Procdesc.t -> JBir.t -> JBasics.class_name -> meth_kind -> JCode.jcode Javalib.interface_or_class -> JClasspath.program -> t (** returns the intermediate representation of the Java file from the context. *) val get_icfg : t -> icfg (** returns the code of the method from the context *) val get_impl : t -> JBir.t (** returns the class where the method is defined from the context *) val get_cn : t -> JBasics.class_name (** returns the type environment that corresponds to the current file. *) val get_tenv : t -> Tenv.t (** returns the control graph that corresponds to the current file. *) val get_cg : t -> Cg.t (** returns the control flow graph that corresponds to the current file. *) val get_cfg : t -> Cfg.cfg (** returns the procedure description in the intermediate language for the current method. *) val get_procdesc : t -> Cfg.Procdesc.t (** returns the method kind of the current method: standard or initialiser of static fields. *) val get_meth_kind : t -> meth_kind (** adds to the context the line that an if-node will jump to *) val add_if_jump : t -> Cfg.Node.t -> int -> unit (** returns whether the given node corresponds to an if-instruction *) val get_if_jump : t -> Cfg.Node.t -> int option (** adds to the context the line that the node in the given line will jump to. *) val add_goto_jump : t -> int -> jump_kind -> unit (** if the given line corresponds to a goto instruction, then returns the line where it jumps to, otherwise returns the next line. *) val get_goto_jump : t -> int -> jump_kind (** returns whether the given line corresponds to a goto instruction. *) val is_goto_jump : t -> int -> bool (** returns the Java program *) val get_program : t -> JClasspath.program (** returns the current node *) val get_node : t -> JCode.jcode Javalib.interface_or_class (** [set_pvar context var type] adds a variable with a type to the context *) val set_pvar : t -> JBir.var -> Typ.t -> Pvar.t (** [get_var_type context var] returns the type of the variable, if the variable is in the context *) val get_var_type : t -> JBir.var -> Typ.t option (** resets the dynamic type of the variables in the context. *) val reset_pvar_type : t -> unit (** resets the hashtable mapping methods to their exception nodes *) val reset_exn_node_table : unit -> unit (** adds the exception node for a given method *) val add_exn_node : Procname.t -> Cfg.Node.t -> unit (** returns the exception node of a given method *) val get_exn_node : Cfg.Procdesc.t -> Cfg.Node.t option