sig
  type opcode =
      OpNop
    | OpAConstNull
    | OpIConst of int32
    | OpLConst of int64
    | OpFConst of float
    | OpDConst of float
    | OpBIPush of int
    | OpSIPush of int
    | OpLdc1 of int
    | OpLdc1w of int
    | OpLdc2w of int
    | OpLoad of JBasics.jvm_basic_type * int
    | OpALoad of int
    | OpArrayLoad of [ `Double | `Float | `Int | `Long ]
    | OpAALoad
    | OpBALoad
    | OpCALoad
    | OpSALoad
    | OpStore of JBasics.jvm_basic_type * int
    | OpAStore of int
    | OpArrayStore of [ `Double | `Float | `Int | `Long ]
    | OpAAStore
    | OpBAStore
    | OpCAStore
    | OpSAStore
    | OpPop
    | OpPop2
    | OpDup
    | OpDupX1
    | OpDupX2
    | OpDup2
    | OpDup2X1
    | OpDup2X2
    | OpSwap
    | OpAdd of JBasics.jvm_basic_type
    | OpSub of JBasics.jvm_basic_type
    | OpMult of JBasics.jvm_basic_type
    | OpDiv of JBasics.jvm_basic_type
    | OpRem of JBasics.jvm_basic_type
    | OpNeg of JBasics.jvm_basic_type
    | OpIShl
    | OpLShl
    | OpIShr
    | OpLShr
    | OpIUShr
    | OpLUShr
    | OpIAnd
    | OpLAnd
    | OpIOr
    | OpLOr
    | OpIXor
    | OpLXor
    | OpIInc of int * int
    | OpI2L
    | OpI2F
    | OpI2D
    | OpL2I
    | OpL2F
    | OpL2D
    | OpF2I
    | OpF2L
    | OpF2D
    | OpD2I
    | OpD2L
    | OpD2F
    | OpI2B
    | OpI2C
    | OpI2S
    | OpLCmp
    | OpFCmpL
    | OpFCmpG
    | OpDCmpL
    | OpDCmpG
    | OpIfEq of int
    | OpIfNe of int
    | OpIfLt of int
    | OpIfGe of int
    | OpIfGt of int
    | OpIfLe of int
    | OpICmpEq of int
    | OpICmpNe of int
    | OpICmpLt of int
    | OpICmpGe of int
    | OpICmpGt of int
    | OpICmpLe of int
    | OpACmpEq of int
    | OpACmpNe of int
    | OpGoto of int
    | OpJsr of int
    | OpRet of int
    | OpTableSwitch of int * int32 * int32 * int array
    | OpLookupSwitch of int * (int32 * int) list
    | OpReturn of JBasics.jvm_basic_type
    | OpAReturn
    | OpReturnVoid
    | OpGetStatic of int
    | OpPutStatic of int
    | OpGetField of int
    | OpPutField of int
    | OpInvokeVirtual of int
    | OpInvokeNonVirtual of int
    | OpInvokeStatic of int
    | OpInvokeInterface of int * int
    | OpInvokeDynamic of int
    | OpNew of int
    | OpNewArray of JBasics.java_basic_type
    | OpANewArray of int
    | OpArrayLength
    | OpThrow
    | OpCheckCast of int
    | OpInstanceOf of int
    | OpMonitorEnter
    | OpMonitorExit
    | OpAMultiNewArray of int * int
    | OpIfNull of int
    | OpIfNonNull of int
    | OpGotoW of int
    | OpJsrW of int
    | OpBreakpoint
    | OpInvalid
  type opcodes = JClassLow.opcode array
  type common_flag =
      [ `AccFinal | `AccPublic | `AccRFU of int | `AccSynthetic ]
  type inner_flag =
      [ `AccAbstract
      | `AccAnnotation
      | `AccEnum
      | `AccFinal
      | `AccInterface
      | `AccPrivate
      | `AccProtected
      | `AccPublic
      | `AccRFU of int
      | `AccStatic
      | `AccSynthetic ]
  type field_flag =
      [ `AccEnum
      | `AccFinal
      | `AccPrivate
      | `AccProtected
      | `AccPublic
      | `AccRFU of int
      | `AccStatic
      | `AccSynthetic
      | `AccTransient
      | `AccVolatile ]
  type method_flag =
      [ `AccAbstract
      | `AccBridge
      | `AccFinal
      | `AccNative
      | `AccPrivate
      | `AccProtected
      | `AccPublic
      | `AccRFU of int
      | `AccStatic
      | `AccStrict
      | `AccSynchronized
      | `AccSynthetic
      | `AccVarArgs ]
  type class_flag =
      [ `AccAbstract
      | `AccAnnotation
      | `AccEnum
      | `AccFinal
      | `AccInterface
      | `AccModule
      | `AccPublic
      | `AccRFU of int
      | `AccSuper
      | `AccSynthetic ]
  type access_flag =
      [ `AccAbstract
      | `AccAnnotation
      | `AccBridge
      | `AccEnum
      | `AccFinal
      | `AccInterface
      | `AccModule
      | `AccNative
      | `AccPrivate
      | `AccProtected
      | `AccPublic
      | `AccRFU of int
      | `AccStatic
      | `AccStrict
      | `AccSuper
      | `AccSynchronized
      | `AccSynthetic
      | `AccTransient
      | `AccVarArgs
      | `AccVolatile ]
  type mp_flags =
      [ `AccFinal | `AccMandated | `AccRFU of int | `AccSynthetic ]
  type method_parameters = {
    name : string option;
    flags : JClassLow.mp_flags list;
  }
  type code = {
    c_max_stack : int;
    c_max_locals : int;
    c_code : JClassLow.opcodes;
    c_exc_tbl : JCode.exception_handler list;
    c_attributes : JClassLow.attribute list;
  }
  and attribute =
      AttributeSourceFile of string
    | AttributeConstant of JClass.constant_attribute
    | AttributeCode of JClassLow.code Stdlib.Lazy.t
    | AttributeExceptions of JBasics.class_name list
    | AttributeInnerClasses of
        (JBasics.class_name option * JBasics.class_name option *
         string option * JClassLow.inner_flag list)
        list
    | AttributeSynthetic
    | AttributeLineNumberTable of (int * int) list
    | AttributeLocalVariableTable of
        (int * int * string * JBasics.value_type * int) list
    | AttributeLocalVariableTypeTable of
        (int * int * string * JSignature.fieldTypeSignature * int) list
    | AttributeDeprecated
    | AttributeSignature of string
    | AttributeEnclosingMethod of
        (JBasics.class_name * (string * JBasics.descriptor) option)
    | AttributeSourceDebugExtension of string
    | AttributeStackMapTable of JBasics.stackmap_frame list
    | AttributeRuntimeVisibleAnnotations of JBasics.annotation list
    | AttributeRuntimeInvisibleAnnotations of JBasics.annotation list
    | AttributeRuntimeVisibleParameterAnnotations of
        JBasics.annotation list list
    | AttributeRuntimeInvisibleParameterAnnotations of
        JBasics.annotation list list
    | AttributeAnnotationDefault of JBasics.element_value
    | AttributeBootstrapMethods of JBasics.bootstrap_method list
    | AttributeMethodParameters of JClassLow.method_parameters list
    | AttributeUnknown of string * string
  type jfield = {
    f_name : string;
    f_descriptor : JBasics.value_type;
    f_flags : JClassLow.field_flag list;
    f_attributes : JClassLow.attribute list;
  }
  type jmethod = {
    m_name : string;
    m_descriptor : JBasics.method_descriptor;
    m_flags : JClassLow.method_flag list;
    m_attributes : JClassLow.attribute list;
  }
  type jclass = {
    j_name : JBasics.class_name;
    j_super : JBasics.class_name option;
    j_interfaces : JBasics.class_name list;
    j_consts : JBasics.constant array;
    j_flags : JClassLow.class_flag list;
    j_fields : JClassLow.jfield list;
    j_methods : JClassLow.jmethod list;
    j_attributes : JClassLow.attribute list;
    j_bootstrap_table : JBasics.bootstrap_method array;
    j_version : JBasics.version;
  }
end