`type def =`

1. `| Expr of Code.expr`
2. `| Phi of {`
   1. `known : Js_of_ocaml_compiler.Code.Var.Set.t;`
   2. `others : bool;`
   3. `unit : bool;`
   `}`

`type approx =`

1. `| Top`
2. `| Values of {`
   1. `known : Js_of_ocaml_compiler.Code.Var.Set.t;`
   2. `others : bool;`
   `}`

`type escape_status =`

1. `| Escape`
2. `| Escape_constant`
3. `| No`

`type info = {`

1. `info_defs : def array;`
2. `info_approximation : approx Code.Var.Tbl.t;`
3. `info_may_escape : Code.Var.ISet.t;`
4. `info_variable_may_escape : escape_status array;`
5. `info_return_vals : Js_of_ocaml_compiler.Code.Var.Set.t Js_of_ocaml_compiler.Code.Var.Map.t;`

`}`
`type mutable_fields =`

1. `| No_field`
2. `| Some_fields of Stdlib.IntSet.t`
3. `| All_fields`

`module VarPairTbl : Stdlib.Hashtbl.S with type key = Js_of_ocaml_compiler.Code.Var.t * Js_of_ocaml_compiler.Code.Var.t`
`type state = {`

1. `vars : Code.Var.ISet.t;`
2. `deps : Code.Var.t list Code.Var.Tbl.t;`
3. `defs : def array;`
4. `variable_may_escape : escape_status array;`
5. `variable_mutable_fields : mutable_fields array;`
6. `may_escape : escape_status array;`
7. `mutable_fields : mutable_fields array;`
8. `return_values : Js_of_ocaml_compiler.Code.Var.Set.t Js_of_ocaml_compiler.Code.Var.Map.t;`
9. `functions_from_returned_value : Code.Var.t list Js_of_ocaml_compiler.Code.Var.Hashtbl.t;`
10. `known_cases : int list Js_of_ocaml_compiler.Code.Var.Hashtbl.t;`
11. `applied_functions : unit VarPairTbl.t;`
12. `function_call_sites : Code.Var.t list Js_of_ocaml_compiler.Code.Var.Hashtbl.t;`
13. `fast : bool;`

`}`
`val f : fast:bool -> Code.program -> state * info`
`val update_def : info -> Code.Var.t -> Code.expr -> unit`
`val exact_call : info -> Code.Var.t -> int -> bool`
`val get_unique_closure : info -> Code.Var.t -> Code.Var.t option`
`val function_arity : info -> Code.Var.t -> int option`