sig
  type short_offset = Utils.s2
  type long_offset = Utils.s4
  type t =
      AALOAD
    | AASTORE
    | ACONST_NULL
    | ALOAD of Utils.u1
    | ALOAD_0
    | ALOAD_1
    | ALOAD_2
    | ALOAD_3
    | ANEWARRAY of
        [ `Array_type of Descriptor.array_type
        | `Class_or_interface of Name.for_class ]
    | ARETURN
    | ARRAYLENGTH
    | ASTORE of Utils.u1
    | ASTORE_0
    | ASTORE_1
    | ASTORE_2
    | ASTORE_3
    | ATHROW
    | BALOAD
    | BASTORE
    | BIPUSH of Utils.s1
    | CALOAD
    | CASTORE
    | CHECKCAST of
        [ `Array_type of Descriptor.array_type
        | `Class_or_interface of Name.for_class ]
    | D2F
    | D2I
    | D2L
    | DADD
    | DALOAD
    | DASTORE
    | DCMPG
    | DCMPL
    | DCONST_0
    | DCONST_1
    | DDIV
    | DLOAD of Utils.u1
    | DLOAD_0
    | DLOAD_1
    | DLOAD_2
    | DLOAD_3
    | DMUL
    | DNEG
    | DREM
    | DRETURN
    | DSTORE of Utils.u1
    | DSTORE_0
    | DSTORE_1
    | DSTORE_2
    | DSTORE_3
    | DSUB
    | DUP
    | DUP2
    | DUP2_X1
    | DUP2_X2
    | DUP_X1
    | DUP_X2
    | F2D
    | F2I
    | F2L
    | FADD
    | FALOAD
    | FASTORE
    | FCMPG
    | FCMPL
    | FCONST_0
    | FCONST_1
    | FCONST_2
    | FDIV
    | FLOAD of Utils.u1
    | FLOAD_0
    | FLOAD_1
    | FLOAD_2
    | FLOAD_3
    | FMUL
    | FNEG
    | FREM
    | FRETURN
    | FSTORE of Utils.u1
    | FSTORE_0
    | FSTORE_1
    | FSTORE_2
    | FSTORE_3
    | FSUB
    | GETFIELD of (Name.for_class * Name.for_field * Descriptor.for_field)
    | GETSTATIC of (Name.for_class * Name.for_field * Descriptor.for_field)
    | GOTO of Instruction.short_offset
    | GOTO_W of Instruction.long_offset
    | I2B
    | I2C
    | I2D
    | I2F
    | I2L
    | I2S
    | IADD
    | IALOAD
    | IAND
    | IASTORE
    | ICONST_0
    | ICONST_1
    | ICONST_2
    | ICONST_3
    | ICONST_4
    | ICONST_5
    | ICONST_M1
    | IDIV
    | IF_ACMPEQ of Instruction.short_offset
    | IF_ACMPNE of Instruction.short_offset
    | IF_ICMPEQ of Instruction.short_offset
    | IF_ICMPGE of Instruction.short_offset
    | IF_ICMPGT of Instruction.short_offset
    | IF_ICMPLE of Instruction.short_offset
    | IF_ICMPLT of Instruction.short_offset
    | IF_ICMPNE of Instruction.short_offset
    | IFEQ of Instruction.short_offset
    | IFGE of Instruction.short_offset
    | IFGT of Instruction.short_offset
    | IFLE of Instruction.short_offset
    | IFLT of Instruction.short_offset
    | IFNE of Instruction.short_offset
    | IFNONNULL of Instruction.short_offset
    | IFNULL of Instruction.short_offset
    | IINC of Utils.u1 * Utils.s1
    | ILOAD of Utils.u1
    | ILOAD_0
    | ILOAD_1
    | ILOAD_2
    | ILOAD_3
    | IMUL
    | INEG
    | INSTANCEOF of
        [ `Array_type of Descriptor.array_type
        | `Class_or_interface of Name.for_class ]
    | INVOKEDYNAMIC of
        (Bootstrap.method_specifier * Name.for_method * Descriptor.for_method)
    | INVOKEINTERFACE of
        (Name.for_class * Name.for_method * Descriptor.for_method) * 
        Utils.u1
    | INVOKESPECIAL of
        (Name.for_class * Name.for_method * Descriptor.for_method)
    | INVOKESTATIC of
        (Name.for_class * Name.for_method * Descriptor.for_method)
    | INVOKEVIRTUAL of
        ([ `Array_type of Descriptor.array_type
         | `Class_or_interface of Name.for_class ] * Name.for_method *
         Descriptor.for_method)
    | IOR
    | IREM
    | IRETURN
    | ISHL
    | ISHR
    | ISTORE of Utils.u1
    | ISTORE_0
    | ISTORE_1
    | ISTORE_2
    | ISTORE_3
    | ISUB
    | IUSHR
    | IXOR
    | JSR of Instruction.short_offset
    | JSR_W of Instruction.long_offset
    | L2D
    | L2F
    | L2I
    | LADD
    | LALOAD
    | LAND
    | LASTORE
    | LCMP
    | LCONST_0
    | LCONST_1
    | LDC of
        [ `Array_type of Descriptor.array_type
        | `Class_or_interface of Name.for_class
        | `Float of float
        | `Int of int32
        | `Method_handle of Bootstrap.method_handle
        | `Method_type of Descriptor.for_method
        | `String of Utils.UTF8.t ]
    | LDC2_W of [ `Double of float | `Long of int64 ]
    | LDC_W of
        [ `Array_type of Descriptor.array_type
        | `Class_or_interface of Name.for_class
        | `Float of float
        | `Int of int32
        | `Method_handle of Bootstrap.method_handle
        | `Method_type of Descriptor.for_method
        | `String of Utils.UTF8.t ]
    | LDIV
    | LLOAD of Utils.u1
    | LLOAD_0
    | LLOAD_1
    | LLOAD_2
    | LLOAD_3
    | LMUL
    | LNEG
    | LOOKUPSWITCH of Instruction.long_offset * Utils.s4 *
        (Utils.s4 * Instruction.long_offset) list
    | LOR
    | LREM
    | LRETURN
    | LSHL
    | LSHR
    | LSTORE of Utils.u1
    | LSTORE_0
    | LSTORE_1
    | LSTORE_2
    | LSTORE_3
    | LSUB
    | LUSHR
    | LXOR
    | MONITORENTER
    | MONITOREXIT
    | MULTIANEWARRAY of
        [ `Array_type of Descriptor.array_type
        | `Class_or_interface of Name.for_class ] * Utils.u1
    | NEW of Name.for_class
    | NEWARRAY of Descriptor.java_type
    | NOP
    | POP
    | POP2
    | PUTFIELD of (Name.for_class * Name.for_field * Descriptor.for_field)
    | PUTSTATIC of (Name.for_class * Name.for_field * Descriptor.for_field)
    | RET of Utils.u1
    | RETURN
    | SALOAD
    | SASTORE
    | SIPUSH of Utils.s2
    | SWAP
    | TABLESWITCH of Instruction.long_offset * Utils.s4 * Utils.s4 *
        Instruction.long_offset list
    | WIDE_ALOAD of Utils.u2
    | WIDE_ASTORE of Utils.u2
    | WIDE_DLOAD of Utils.u2
    | WIDE_DSTORE of Utils.u2
    | WIDE_FLOAD of Utils.u2
    | WIDE_FSTORE of Utils.u2
    | WIDE_IINC of Utils.u2 * Utils.s2
    | WIDE_ILOAD of Utils.u2
    | WIDE_ISTORE of Utils.u2
    | WIDE_LLOAD of Utils.u2
    | WIDE_LSTORE of Utils.u2
    | WIDE_RET of Utils.u2
  val equal : Instruction.t -> Instruction.t -> bool
  val compare : Instruction.t -> Instruction.t -> int
  val hash : Instruction.t -> int
  type error =
      Invalid_pool_element
    | Invalid_field
    | Invalid_dynamic_method
    | Invalid_interface_method
    | Invalid_method
    | Invalid_parameter
    | Invalid_primitive_type
    | Invalid_switch_cases
    | Invalid_pool_index
    | Invalid_pool_entry
    | Invalid_primitive_array_type
    | Invalid_index
    | Invalid_array_element
    | Invalid_class_name
    | Invalid_unsigned_byte
    | Invalid_byte
    | Invalid_unsigned_short
    | Invalid_signed_short
    | Invalid_signed_long
    | Invalid_short_offset
    | Invalid_long_offset
    | Invalid_number_of_arguments
    | Unknown_instruction
    | Invalid_method_handle
    | Too_many_bootstrap_specifiers
  exception Exception of Instruction.error
  val string_of_error : Instruction.error -> string
  val decode :
    Bootstrap.methods ->
    ConstantPool.t -> ByteCode.instruction -> Instruction.t
  val encode :
    Bootstrap.methods ->
    ConstantPool.extendable -> Instruction.t -> ByteCode.instruction
  type parameter =
      Int_constant of int64
    | Offset of int32
    | Float_constant of float
    | String_constant of Utils.UTF8.t
    | Class_name of Name.for_class
    | Array_type of Utils.UTF8.t
    | Primitive_type of Descriptor.java_type
    | Field of Name.for_class * Name.for_field * Descriptor.for_field
    | Dynamic_method of Bootstrap.method_specifier * Name.for_method *
        Descriptor.for_method
    | Method of Name.for_class * Name.for_method * Descriptor.for_method
    | Array_method of Descriptor.array_type * Name.for_method *
        Descriptor.for_method
    | Method_type_constant of Descriptor.for_method
    | Method_handle_constant of Bootstrap.method_handle
  type parameters_tail =
      No_tail
    | Match_offset_pairs of (Utils.s4 * Instruction.long_offset) list
    | Long_offsets of Instruction.long_offset list
  val compile :
    int ->
    bool ->
    string ->
    Instruction.parameter list ->
    Instruction.parameters_tail -> int * Instruction.t
  val decompile :
    int ->
    Instruction.t ->
    int * bool * string * Instruction.parameter list *
    Instruction.parameters_tail
  val size_of : int -> Instruction.t -> int
  val size_of_list : int -> Instruction.t list -> int
  val version_bounds : Instruction.t -> Version.bounds
end