sig
  type info = { name_index : Utils.u2; length : Utils.u4; data : string; }
  type error =
      Invalid_code_attribute
    | Invalid_code_length
    | Defined_twice of string
    | Invalid_field_attribute
    | Invalid_method_attribute
    | Invalid_class_attribute
    | Invalid_package_attribute
    | Invalid_module_attribute
    | Invalid_constant_value
    | Invalid_enclosing_method
    | Invalid_local_variable_table
    | Invalid_local_variable_type_table
    | Invalid_list_length
    | Invalid_attribute_name_value
    | Invalid_exception_name
    | Invalid_exception
    | Invalid_inner_class
    | Invalid_outer_class
    | Invalid_signature
    | Invalid_source_file
    | Invalid_stack_map_frame
    | Invalid_stack_map_verification_type
    | Invalid_bootstrap_method_handle
    | Invalid_bootstrap_argument
    | Invalid_module
    | Invalid_module_dependency_kind
    | Missing_module_attribute
  exception Exception of Attribute.error
  val string_of_error : Attribute.error -> string
  val read_info : InputStream.t -> Attribute.info
  val write_info : OutputStream.t -> Attribute.info -> unit
  type constant_value =
      Long_value of int64
    | Float_value of float
    | Double_value of float
    | Boolean_value of bool
    | Byte_value of int
    | Character_value of int
    | Short_value of int
    | Integer_value of int32
    | String_value of Utils.UTF8.t
  val equal_constant_value :
    Attribute.constant_value -> Attribute.constant_value -> bool
  val compare_constant_value :
    Attribute.constant_value -> Attribute.constant_value -> int
  val hash_constant_value : Attribute.constant_value -> int
  type verification_type_info =
      Top_variable_info
    | Integer_variable_info
    | Float_variable_info
    | Long_variable_info
    | Double_variable_info
    | Null_variable_info
    | Uninitialized_this_variable_info
    | Object_variable_info of
        [ `Array_type of Descriptor.array_type
        | `Class_or_interface of Name.for_class ]
    | Uninitialized_variable_info of Utils.u2
  val equal_verification_type_info :
    Attribute.verification_type_info ->
    Attribute.verification_type_info -> bool
  val compare_verification_type_info :
    Attribute.verification_type_info ->
    Attribute.verification_type_info -> int
  val hash_verification_type_info : Attribute.verification_type_info -> int
  type stack_map_frame =
      Same_frame of Utils.u2
    | Same_locals_1_stack_item_frame of Utils.u2 *
        Attribute.verification_type_info
    | Chop_1_frame of Utils.u2
    | Chop_2_frame of Utils.u2
    | Chop_3_frame of Utils.u2
    | Append_1_frame of Utils.u2 * Attribute.verification_type_info
    | Append_2_frame of Utils.u2 * Attribute.verification_type_info *
        Attribute.verification_type_info
    | Append_3_frame of Utils.u2 * Attribute.verification_type_info *
        Attribute.verification_type_info * Attribute.verification_type_info
    | Full_frame of Utils.u2 * Attribute.verification_type_info list *
        Attribute.verification_type_info list
  val equal_stack_map_frame :
    Attribute.stack_map_frame -> Attribute.stack_map_frame -> bool
  val compare_stack_map_frame :
    Attribute.stack_map_frame -> Attribute.stack_map_frame -> int
  val hash_stack_map_frame : Attribute.stack_map_frame -> int
  type dependency_kind =
      Optional_dependency
    | Same_class_loader
    | Not_observable
  type t =
      [ `AnnotationDefault of Annotation.element_value
      | `BootstrapMethods of Bootstrap.method_specifier list
      | `Code of Attribute.code_value
      | `ConstantValue of Attribute.constant_value
      | `Deprecated
      | `EnclosingMethod of Attribute.enclosing_method_value
      | `Exceptions of Name.for_class list
      | `InnerClasses of Attribute.inner_class_element list
      | `LineNumberTable of (Utils.u2 * Utils.u2) list
      | `LocalVariableTable of Attribute.local_variable_table_element list
      | `LocalVariableTypeTable of
          Attribute.local_variable_type_table_element list
      | `Module of Utils.UTF8.t * Utils.UTF8.t
      | `ModulePermits of (Utils.UTF8.t * Utils.UTF8.t) list
      | `ModuleProvides of (Utils.UTF8.t * Utils.UTF8.t) list
      | `ModuleRequires of
          (Utils.UTF8.t * Utils.UTF8.t * Attribute.dependency_kind) list
      | `RuntimeInvisibleAnnotations of Annotation.t list
      | `RuntimeInvisibleParameterAnnotations of Annotation.t list list
      | `RuntimeInvisibleTypeAnnotations of Annotation.extended list
      | `RuntimeVisibleAnnotations of Annotation.t list
      | `RuntimeVisibleParameterAnnotations of Annotation.t list list
      | `RuntimeVisibleTypeAnnotations of Annotation.extended list
      | `Signature of Attribute.signature
      | `SourceDebugExtension of Utils.UTF8.t
      | `SourceFile of Utils.UTF8.t
      | `StackMapTable of Attribute.stack_map_frame list
      | `Synthetic
      | `Unknown of Utils.UTF8.t * string ]
  and signature =
      [ `Class of Signature.class_signature
      | `Field of Signature.field_type_signature
      | `Method of Signature.method_signature ]
  and code_attribute =
      [ `LineNumberTable of (Utils.u2 * Utils.u2) list
      | `LocalVariableTable of Attribute.local_variable_table_element list
      | `LocalVariableTypeTable of
          Attribute.local_variable_type_table_element list
      | `StackMapTable of Attribute.stack_map_frame list
      | `Unknown of Utils.UTF8.t * string ]
  and code_value = {
    max_stack : Utils.u2;
    max_locals : Utils.u2;
    code : Instruction.t list;
    exception_table : Attribute.exception_table_element list;
    attributes : Attribute.code_attribute list;
  }
  and exception_table_element = {
    try_start : Utils.u2;
    try_end : Utils.u2;
    catch : Utils.u2;
    caught : Name.for_class option;
  }
  and inner_class_element = {
    inner_class : Name.for_class option;
    outer_class : Name.for_class option;
    inner_name : Utils.UTF8.t option;
    inner_flags : AccessFlag.for_inner_class list;
  }
  and enclosing_method_value = {
    innermost_class : Name.for_class;
    enclosing_method : (Name.for_method * Descriptor.for_method) option;
  }
  and local_variable_table_element = {
    local_start : Utils.u2;
    local_length : Utils.u2;
    local_name : Utils.UTF8.t;
    local_descriptor : Descriptor.for_field;
    local_index : Utils.u2;
  }
  and local_variable_type_table_element = {
    local_type_start : Utils.u2;
    local_type_length : Utils.u2;
    local_type_name : Utils.UTF8.t;
    local_type_signature : Signature.field_type_signature;
    local_type_index : Utils.u2;
  }
  val equal_signature : Attribute.signature -> Attribute.signature -> bool
  val compare_signature : Attribute.signature -> Attribute.signature -> int
  val hash_signature : Attribute.signature -> int
  val equal_code_attribute :
    Attribute.code_attribute -> Attribute.code_attribute -> bool
  val compare_code_attribute :
    Attribute.code_attribute -> Attribute.code_attribute -> int
  val hash_code_attribute : Attribute.code_attribute -> int
  val equal_code_value : Attribute.code_value -> Attribute.code_value -> bool
  val compare_code_value :
    Attribute.code_value -> Attribute.code_value -> int
  val hash_code_value : Attribute.code_value -> int
  val equal_exception_table_element :
    Attribute.exception_table_element ->
    Attribute.exception_table_element -> bool
  val compare_exception_table_element :
    Attribute.exception_table_element ->
    Attribute.exception_table_element -> int
  val hash_exception_table_element : Attribute.exception_table_element -> int
  val equal_inner_class_element :
    Attribute.inner_class_element -> Attribute.inner_class_element -> bool
  val compare_inner_class_element :
    Attribute.inner_class_element -> Attribute.inner_class_element -> int
  val hash_inner_class_element : Attribute.inner_class_element -> int
  val equal_enclosing_method_value :
    Attribute.enclosing_method_value ->
    Attribute.enclosing_method_value -> bool
  val compare_enclosing_method_value :
    Attribute.enclosing_method_value ->
    Attribute.enclosing_method_value -> int
  val hash_enclosing_method_value : Attribute.enclosing_method_value -> int
  val equal_local_variable_table_element :
    Attribute.local_variable_table_element ->
    Attribute.local_variable_table_element -> bool
  val compare_local_variable_table_element :
    Attribute.local_variable_table_element ->
    Attribute.local_variable_table_element -> int
  val hash_local_variable_table_element :
    Attribute.local_variable_table_element -> int
  val equal_local_variable_type_table_element :
    Attribute.local_variable_type_table_element ->
    Attribute.local_variable_type_table_element -> bool
  val compare_local_variable_type_table_element :
    Attribute.local_variable_type_table_element ->
    Attribute.local_variable_type_table_element -> int
  val hash_local_variable_type_table_element :
    Attribute.local_variable_type_table_element -> int
  val equal : Attribute.t -> Attribute.t -> bool
  val compare : Attribute.t -> Attribute.t -> int
  val hash : Attribute.t -> int
  type for_field =
      [ `ConstantValue of Attribute.constant_value
      | `Deprecated
      | `RuntimeInvisibleAnnotations of Annotation.t list
      | `RuntimeInvisibleTypeAnnotations of Annotation.extended list
      | `RuntimeVisibleAnnotations of Annotation.t list
      | `RuntimeVisibleTypeAnnotations of Annotation.extended list
      | `Signature of [ `Field of Signature.field_type_signature ]
      | `Synthetic
      | `Unknown of Utils.UTF8.t * string ]
  type for_method =
      [ `AnnotationDefault of Annotation.element_value
      | `Code of Attribute.code_value
      | `Deprecated
      | `Exceptions of Name.for_class list
      | `RuntimeInvisibleAnnotations of Annotation.t list
      | `RuntimeInvisibleParameterAnnotations of Annotation.t list list
      | `RuntimeInvisibleTypeAnnotations of Annotation.extended list
      | `RuntimeVisibleAnnotations of Annotation.t list
      | `RuntimeVisibleParameterAnnotations of Annotation.t list list
      | `RuntimeVisibleTypeAnnotations of Annotation.extended list
      | `Signature of [ `Method of Signature.method_signature ]
      | `Synthetic
      | `Unknown of Utils.UTF8.t * string ]
  type for_class =
      [ `BootstrapMethods of Bootstrap.method_specifier list
      | `Deprecated
      | `EnclosingMethod of Attribute.enclosing_method_value
      | `InnerClasses of Attribute.inner_class_element list
      | `Module of Utils.UTF8.t * Utils.UTF8.t
      | `RuntimeInvisibleAnnotations of Annotation.t list
      | `RuntimeInvisibleTypeAnnotations of Annotation.extended list
      | `RuntimeVisibleAnnotations of Annotation.t list
      | `RuntimeVisibleTypeAnnotations of Annotation.extended list
      | `Signature of [ `Class of Signature.class_signature ]
      | `SourceDebugExtension of Utils.UTF8.t
      | `SourceFile of Utils.UTF8.t
      | `Synthetic
      | `Unknown of Utils.UTF8.t * string ]
  type for_package =
      [ `Module of Utils.UTF8.t * Utils.UTF8.t
      | `RuntimeInvisibleAnnotations of Annotation.t list
      | `RuntimeVisibleAnnotations of Annotation.t list
      | `SourceFile of Utils.UTF8.t
      | `Unknown of Utils.UTF8.t * string ]
  type for_module =
      [ `Module of Utils.UTF8.t * Utils.UTF8.t
      | `ModulePermits of (Utils.UTF8.t * Utils.UTF8.t) list
      | `ModuleProvides of (Utils.UTF8.t * Utils.UTF8.t) list
      | `ModuleRequires of
          (Utils.UTF8.t * Utils.UTF8.t * Attribute.dependency_kind) list
      | `RuntimeInvisibleAnnotations of Annotation.t list
      | `RuntimeVisibleAnnotations of Annotation.t list
      | `SourceFile of Utils.UTF8.t
      | `Unknown of Utils.UTF8.t * string ]
  type enclosing_element = Class | Method | Field | Package | Module
  val string_of_verification_type_info :
    Attribute.verification_type_info -> string
  val verification_type_info_of_parameter_descriptor :
    Descriptor.for_parameter -> Attribute.verification_type_info
  val check_code_attributes :
    Attribute.t list -> Attribute.code_attribute list
  val check_field_attributes : Attribute.t list -> Attribute.for_field list
  val check_method_attributes : Attribute.t list -> Attribute.for_method list
  val check_class_attributes : Attribute.t list -> Attribute.for_class list
  val check_package_attributes :
    Attribute.t list -> Attribute.for_package list
  val check_module_attributes : Attribute.t list -> Attribute.for_module list
  val decode :
    Attribute.enclosing_element ->
    Bootstrap.methods -> ConstantPool.t -> Attribute.info -> Attribute.t
  val encode :
    Bootstrap.methods ->
    ConstantPool.extendable -> Attribute.t -> Attribute.info
  val compare_according_to_significance : Attribute.t -> Attribute.t -> int
  val version_bounds : Attribute.t -> Version.bounds
  val extract_code : Attribute.t list -> Attribute.code_value
  val extract_exceptions : Attribute.t list -> Name.for_class list
  val extract_class_signature :
    Attribute.for_class list -> Signature.class_signature
  val extract_bootstrap_info :
    Attribute.t list -> Bootstrap.method_specifier list
  val extract_field_signature :
    Attribute.for_field list -> Signature.field_type_signature
  val extract_method_signature :
    Attribute.for_method list -> Signature.method_signature
  val extract_annotations : Attribute.t list -> Annotation.t list
end