You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

72 lines
3.2 KiB

(*
* Copyright (c) 2015 - 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! IStd
(** Attributes of a procedure. *)
(** flags for a procedure *)
type proc_flags = (string, string) Caml.Hashtbl.t [@@deriving compare]
val proc_flag_skip : string
(** keys for proc_flags *)
val proc_flag_ignore_return : string
(** key to specify that a function should be treated as a skip function *)
(** key to specify that it is OK to ignore the return value *)
val proc_flags_empty : unit -> proc_flags
(** empty proc flags *)
val proc_flags_add : proc_flags -> string -> string -> unit
(** add a key value pair to a proc flags *)
val proc_flags_find : proc_flags -> string -> string
(** find a value for a key in the proc flags *)
type objc_accessor_type =
| Objc_getter of Typ.Fieldname.t
| Objc_setter of Typ.Fieldname.t
[@@deriving compare]
type t =
{ access: PredSymb.access (** visibility access *)
; captured: (Mangled.t * Typ.t) list (** name and type of variables captured in blocks *)
; mutable changed: bool (** true if proc has changed since last analysis *)
; mutable did_preanalysis: bool (** true if we performed preanalysis on the CFG for this proc *)
; err_log: Errlog.t (** Error log for the procedure *)
; exceptions: string list (** exceptions thrown by the procedure *)
; formals: (Mangled.t * Typ.t) list (** name and type of formal parameters *)
; const_formals: int list (** list of indices of formals that are const-qualified *)
; func_attributes: PredSymb.func_attribute list
; is_abstract: bool (** the procedure is abstract *)
; is_bridge_method: bool (** the procedure is a bridge method *)
; is_defined: bool (** true if the procedure is defined, and not just declared *)
; is_objc_instance_method: bool (** the procedure is an objective-C instance method *)
; is_cpp_instance_method: bool (** the procedure is an C++ instance method *)
; is_cpp_noexcept_method: bool (** the procedure is an C++ method annotated with "noexcept" *)
; is_java_synchronized_method: bool (** the procedure is a Java synchronized method *)
; is_model: bool (** the procedure is a model *)
; is_synthetic_method: bool (** the procedure is a synthetic method *)
; language: Config.language (** language of the procedure *)
; loc: Location.t (** location of this procedure in the source code *)
; translation_unit: SourceFile.t option (** translation unit to which the procedure belongs *)
; mutable locals: (Mangled.t * Typ.t) list (** name and type of local variables *)
; method_annotation: Annot.Method.t (** annotations for java methods *)
; objc_accessor: objc_accessor_type option (** type of ObjC accessor, if any *)
; proc_flags: proc_flags (** flags of the procedure *)
; proc_name: Typ.Procname.t (** name of the procedure *)
; ret_type: Typ.t (** return type *)
; source_file_captured: SourceFile.t (** source file where the procedure was captured *) }
[@@deriving compare]
val default : Typ.Procname.t -> Config.language -> t
(** Create a proc_attributes with default values. *)