sig
  type return_kind = Reference | Double | Float | Integer | Long | Void
  type jump_kind =
      References_equal
    | References_not_equal
    | Integers_equal
    | Integers_greater_or_equal
    | Integers_greater
    | Integers_lower_or_equal
    | Integers_lower
    | Integers_not_equal
    | Integer_equal_zero
    | Integer_greater_or_equal_zero
    | Integer_greater_zero
    | Integer_lower_or_equal_zero
    | Integer_lower_zero
    | Integer_not_equal_zero
    | Reference_null
    | Reference_not_null
  val nb_args_of_jump_kind : ControlFlow.jump_kind -> int
  val opposite_jump_kind : ControlFlow.jump_kind -> ControlFlow.jump_kind
  type switch_kind = Table of Utils.s4 * Utils.s4 | Lookup of Utils.s4 list
  val nb_args_of_switch_kind : ControlFlow.switch_kind -> int
  type error =
      Unsupported_instruction of string
    | Vertex_not_in_graph
    | Invalid_switch_edge
    | Empty_graph
    | Cannot_remove_root
  exception Exception of ControlFlow.error
  val string_of_error : ControlFlow.error -> string
  type for_instruction =
      Next_instruction
    | Unconditional_jump of Utils.s4
    | Conditional_jump of ControlFlow.jump_kind * Utils.s4
    | Switch_jump of (ControlFlow.switch_kind * Utils.s4 * Utils.s4 list)
    | Called_method
    | Calling_method of ControlFlow.return_kind
    | Exception_handler
  val for_instruction : Instruction.t -> ControlFlow.for_instruction
  type 'a vertex
  type 'a edge =
      Unconditional_edge of 'a
    | Conditional_edge of ControlFlow.jump_kind * 'a * 'a
    | Switch_edge of (ControlFlow.switch_kind * 'a * 'a list)
  type ('a, 'b) graph
  val equal_vertex : 'ControlFlow.vertex -> 'ControlFlow.vertex -> bool
  val equal_edge :
    ('-> '-> bool) -> 'ControlFlow.edge -> 'ControlFlow.edge -> bool
  val make_graph :
    Instruction.t list ->
    '-> ('a, 'b) ControlFlow.graph * 'ControlFlow.vertex
  val contains_vertex :
    ('a, 'b) ControlFlow.graph -> 'ControlFlow.vertex -> bool
  val add_vertex :
    ('a, 'b) ControlFlow.graph ->
    Instruction.t list ->
    '-> ('a, 'b) ControlFlow.graph * 'ControlFlow.vertex
  val add_edge :
    ('a, 'b) ControlFlow.graph ->
    'ControlFlow.vertex ->
    'ControlFlow.vertex ControlFlow.edge ->
    '-> ('a, 'b) ControlFlow.graph
  val add_handler :
    ('a, 'b) ControlFlow.graph ->
    'ControlFlow.vertex ->
    Name.for_class option ->
    'ControlFlow.vertex -> '-> ('a, 'b) ControlFlow.graph
  val change_root :
    ('a, 'b) ControlFlow.graph ->
    'ControlFlow.vertex -> ('a, 'b) ControlFlow.graph
  val remove_vertex :
    ('a, 'b) ControlFlow.graph ->
    'ControlFlow.vertex -> ('a, 'b) ControlFlow.graph
  val remove_vertices :
    ('a, 'b) ControlFlow.graph ->
    'ControlFlow.vertex list -> ('a, 'b) ControlFlow.graph
  val remove_edge :
    ('a, 'b) ControlFlow.graph ->
    'ControlFlow.vertex -> ('a, 'b) ControlFlow.graph
  val remove_handler :
    ('a, 'b) ControlFlow.graph ->
    'ControlFlow.vertex ->
    Name.for_class option ->
    'ControlFlow.vertex -> ('a, 'b) ControlFlow.graph
  val root_of_graph : ('a, 'b) ControlFlow.graph -> 'ControlFlow.vertex
  val instructions_of_vertex : 'ControlFlow.vertex -> Instruction.t list
  val label_of_vertex : 'ControlFlow.vertex -> 'a
  val edge_of_vertex :
    ('a, 'b) ControlFlow.graph ->
    'ControlFlow.vertex -> 'b * 'ControlFlow.vertex ControlFlow.edge
  val predecessors_of_vertex :
    ('a, 'b) ControlFlow.graph ->
    'ControlFlow.vertex -> 'ControlFlow.vertex list
  val handlers_of_vertex :
    ('a, 'b) ControlFlow.graph ->
    'ControlFlow.vertex ->
    ('b * Name.for_class option * 'ControlFlow.vertex) list
  val iter_vertices :
    ('ControlFlow.vertex -> unit) -> ('a, 'b) ControlFlow.graph -> unit
  val iter_edges :
    ('ControlFlow.vertex ->
     '-> 'ControlFlow.vertex ControlFlow.edge -> unit) ->
    ('a, 'b) ControlFlow.graph -> unit
  val iter_handlers :
    ('ControlFlow.vertex ->
     '-> Name.for_class option -> 'ControlFlow.vertex -> unit) ->
    ('a, 'b) ControlFlow.graph -> unit
  val fold_vertices :
    ('ControlFlow.vertex -> '-> 'c) ->
    ('a, 'b) ControlFlow.graph -> '-> 'c
  val fold_edges :
    ('ControlFlow.vertex ->
     '-> 'ControlFlow.vertex ControlFlow.edge -> '-> 'c) ->
    ('a, 'b) ControlFlow.graph -> '-> 'c
  val fold_handlers :
    ('ControlFlow.vertex ->
     '-> Name.for_class option -> 'ControlFlow.vertex -> '-> 'c) ->
    ('a, 'b) ControlFlow.graph -> '-> 'c
  val map_graph :
    ('-> Instruction.t list -> 'c * Instruction.t list) ->
    ('-> 'ControlFlow.vertex ControlFlow.edge -> 'd) ->
    ('-> Name.for_class option -> 'ControlFlow.vertex -> 'd) ->
    ('a, 'b) ControlFlow.graph -> ('c, 'd) ControlFlow.graph
  val identity : ('a, 'b) ControlFlow.graph -> ('a, 'b) ControlFlow.graph
  val to_plain_graph :
    ('-> Utils.UTF8.t) ->
    ('-> Utils.UTF8.t) -> ('a, 'b) ControlFlow.graph -> Graph.t
  type line_mapper = Utils.u2 -> Utils.u2
  val dummy_mapper : ControlFlow.line_mapper
  val line_number_table_mapper :
    (Utils.u2 * Utils.u2) list -> ControlFlow.line_mapper
  val graph_of_instructions :
    ?line_mapper:ControlFlow.line_mapper ->
    Instruction.t list ->
    Attribute.exception_table_element list ->
    (int32 * Utils.u2 list, unit) ControlFlow.graph
end