package gava

/* Classfile version number for this information */
const (
	JVM_MAJOR_VERSION_JAVA_5  = 49
	JVM_MAJOR_VERSION_JAVA_6  = 50
	JVM_MAJOR_VERSION_JAVA_7  = 51
	JVM_MAJOR_VERSION_JAVA_8  = 52
	JVM_MAJOR_VERSION_JAVA_9  = 53
	JVM_MAJOR_VERSION_JAVA_10 = 54
	JVM_MAJOR_VERSION_JAVA_11 = 55
	JVM_MAJOR_VERSION_JAVA_12 = 56
	JVM_MAJOR_VERSION_JAVA_13 = 57
	JVM_MAJOR_VERSION_JAVA_14 = 58
	JVM_MAJOR_VERSION_JAVA_15 = 59
)

const (
	JVM_TAG_Class              = 7
	JVM_TAG_Fieldref           = 9
	JVM_TAG_Methodref          = 10
	JVM_TAG_InterfaceMethodref = 11
	JVM_TAG_String             = 8
	JVM_TAG_Integer            = 3
	JVM_TAG_Float              = 4
	JVM_TAG_Long               = 5
	JVM_TAG_Double             = 6
	JVM_TAG_NameAndType        = 12
	JVM_TAG_Utf8               = 1
	JVM_TAG_MethodHandle       = 15
	JVM_TAG_MethodType         = 16
	JVM_TAG_InvokeDynamic      = 18
)

/* Flags */

const (
	JVM_ACC_PUBLIC       = 0x0001
	JVM_ACC_PRIVATE      = 0x0002
	JVM_ACC_PROTECTED    = 0x0004
	JVM_ACC_STATIC       = 0x0008
	JVM_ACC_FINAL        = 0x0010
	JVM_ACC_SYNCHRONIZED = 0x0020
	JVM_ACC_SUPER        = 0x0020
	JVM_ACC_VOLATILE     = 0x0040
	JVM_ACC_BRIDGE       = 0x0040
	JVM_ACC_TRANSIENT    = 0x0080
	JVM_ACC_VARARGS      = 0x0080
	JVM_ACC_NATIVE       = 0x0100
	JVM_ACC_INTERFACE    = 0x0200
	JVM_ACC_ABSTRACT     = 0x0400
	JVM_ACC_STRICT       = 0x0800
	JVM_ACC_SYNTHETIC    = 0x1000
	JVM_ACC_ANNOTATION   = 0x2000
	JVM_ACC_ENUM         = 0x4000
)

type MethodAccessFlag uint16

const (
	JVM_METHOD_ACC_PUBLIC       MethodAccessFlag = JVM_ACC_PUBLIC
	JVM_METHOD_ACC_PRIVATE      MethodAccessFlag = JVM_ACC_PRIVATE
	JVM_METHOD_ACC_PROTECTED    MethodAccessFlag = JVM_ACC_PROTECTED
	JVM_METHOD_ACC_STATIC       MethodAccessFlag = JVM_ACC_STATIC
	JVM_METHOD_ACC_FINAL        MethodAccessFlag = JVM_ACC_FINAL
	JVM_METHOD_ACC_SYNCHRONIZED MethodAccessFlag = JVM_ACC_SYNCHRONIZED
	JVM_METHOD_ACC_BRIDGE       MethodAccessFlag = JVM_ACC_BRIDGE
	JVM_METHOD_ACC_VARARGS      MethodAccessFlag = JVM_ACC_VARARGS
	JVM_METHOD_ACC_NATIVE       MethodAccessFlag = JVM_ACC_NATIVE
	JVM_METHOD_ACC_ABSTRACT     MethodAccessFlag = JVM_ACC_ABSTRACT
	JVM_METHOD_ACC_STRICT       MethodAccessFlag = JVM_ACC_STRICT
	JVM_METHOD_ACC_SYNTHETIC    MethodAccessFlag = JVM_ACC_SYNTHETIC
)

type FieldAccessFlag uint16

const (
	JVM_FIELD_ACC_PUBLIC    FieldAccessFlag = JVM_ACC_PUBLIC
	JVM_FIELD_ACC_PRIVATE   FieldAccessFlag = JVM_ACC_PRIVATE
	JVM_FIELD_ACC_PROTECTED FieldAccessFlag = JVM_ACC_PROTECTED
	JVM_FIELD_ACC_STATIC    FieldAccessFlag = JVM_ACC_STATIC
	JVM_FIELD_ACC_FINAL     FieldAccessFlag = JVM_ACC_FINAL
	JVM_FIELD_ACC_VOLATILE  FieldAccessFlag = JVM_ACC_VOLATILE
	JVM_FIELD_ACC_TRANSIENT FieldAccessFlag = JVM_ACC_TRANSIENT
	JVM_FIELD_ACC_SYNTHETIC FieldAccessFlag = JVM_ACC_SYNTHETIC
	JVM_FIELD_ACC_ENUM      FieldAccessFlag = JVM_ACC_ENUM
)

const (
	JVM_CLASS_ACC_PUBLIC     = JVM_ACC_PUBLIC
	JVM_CLASS_ACC_FINAL      = JVM_ACC_FINAL
	JVM_CLASS_ACC_SUPER      = JVM_ACC_SUPER
	JVM_CLASS_ACC_INTERFACE  = JVM_ACC_INTERFACE
	JVM_CLASS_ACC_ABSTRACT   = JVM_ACC_ABSTRACT
	JVM_CLASS_ACC_SYNTHETIC  = JVM_ACC_SYNTHETIC
	JVM_CLASS_ACC_ANNOTATION = JVM_ACC_ANNOTATION
	JVM_CLASS_ACC_ENUM       = JVM_ACC_ENUM
)

/* Used in newarray instruction. */

const (
	JVM_T_BOOLEAN = 4
	JVM_T_CHAR    = 5
	JVM_T_FLOAT   = 6
	JVM_T_DOUBLE  = 7
	JVM_T_BYTE    = 8
	JVM_T_SHORT   = 9
	JVM_T_INT     = 10
	JVM_T_LONG    = 11
)

/* Constant Pool Entries */

const (
	JVM_CONSTANT_Utf8               = 1
	JVM_CONSTANT_Unicode            = 2 /* unused */
	JVM_CONSTANT_Integer            = 3
	JVM_CONSTANT_Float              = 4
	JVM_CONSTANT_Long               = 5
	JVM_CONSTANT_Double             = 6
	JVM_CONSTANT_Class              = 7
	JVM_CONSTANT_String             = 8
	JVM_CONSTANT_Fieldref           = 9
	JVM_CONSTANT_Methodref          = 10
	JVM_CONSTANT_InterfaceMethodref = 11
	JVM_CONSTANT_NameAndType        = 12
	JVM_CONSTANT_MethodHandle       = 15 // JSR 292
	JVM_CONSTANT_MethodType         = 16 // JSR 292
	JVM_CONSTANT_InvokeDynamic      = 18
)

/* JVM_CONSTANT_MethodHandle subtypes */
const (
	JVM_REF_getField         = 1
	JVM_REF_getStatic        = 2
	JVM_REF_putField         = 3
	JVM_REF_putStatic        = 4
	JVM_REF_invokeVirtual    = 5
	JVM_REF_invokeStatic     = 6
	JVM_REF_invokeSpecial    = 7
	JVM_REF_newInvokeSpecial = 8
	JVM_REF_invokeInterface  = 9
)

/* StackMapTable type item numbers */

const (
	JVM_ITEM_Top               = 0
	JVM_ITEM_Integer           = 1
	JVM_ITEM_Float             = 2
	JVM_ITEM_Double            = 3
	JVM_ITEM_Long              = 4
	JVM_ITEM_Null              = 5
	JVM_ITEM_UninitializedThis = 6
	JVM_ITEM_Object            = 7
	JVM_ITEM_Uninitialized     = 8
)

/* Type signatures */

const (
	JVM_SIGNATURE_ARRAY    = "["
	JVM_SIGNATURE_BYTE     = "B"
	JVM_SIGNATURE_CHAR     = "C"
	JVM_SIGNATURE_CLASS    = "L"
	JVM_SIGNATURE_ENDCLASS = ";"
	JVM_SIGNATURE_ENUM     = "E"
	JVM_SIGNATURE_FLOAT    = "F"
	JVM_SIGNATURE_DOUBLE   = "D"
	JVM_SIGNATURE_FUNC     = "("
	JVM_SIGNATURE_ENDFUNC  = ")"
	JVM_SIGNATURE_INT      = "I"
	JVM_SIGNATURE_LONG     = "J"
	JVM_SIGNATURE_SHORT    = "S"
	JVM_SIGNATURE_VOID     = "V"
	JVM_SIGNATURE_BOOLEAN  = "Z"
)

/* Opcodes */

const (
	JVM_OPC_nop             = 0
	JVM_OPC_aconst_null     = 1
	JVM_OPC_iconst_m1       = 2
	JVM_OPC_iconst_0        = 3
	JVM_OPC_iconst_1        = 4
	JVM_OPC_iconst_2        = 5
	JVM_OPC_iconst_3        = 6
	JVM_OPC_iconst_4        = 7
	JVM_OPC_iconst_5        = 8
	JVM_OPC_lconst_0        = 9
	JVM_OPC_lconst_1        = 10
	JVM_OPC_fconst_0        = 11
	JVM_OPC_fconst_1        = 12
	JVM_OPC_fconst_2        = 13
	JVM_OPC_dconst_0        = 14
	JVM_OPC_dconst_1        = 15
	JVM_OPC_bipush          = 16
	JVM_OPC_sipush          = 17
	JVM_OPC_ldc             = 18
	JVM_OPC_ldc_w           = 19
	JVM_OPC_ldc2_w          = 20
	JVM_OPC_iload           = 21
	JVM_OPC_lload           = 22
	JVM_OPC_fload           = 23
	JVM_OPC_dload           = 24
	JVM_OPC_aload           = 25
	JVM_OPC_iload_0         = 26
	JVM_OPC_iload_1         = 27
	JVM_OPC_iload_2         = 28
	JVM_OPC_iload_3         = 29
	JVM_OPC_lload_0         = 30
	JVM_OPC_lload_1         = 31
	JVM_OPC_lload_2         = 32
	JVM_OPC_lload_3         = 33
	JVM_OPC_fload_0         = 34
	JVM_OPC_fload_1         = 35
	JVM_OPC_fload_2         = 36
	JVM_OPC_fload_3         = 37
	JVM_OPC_dload_0         = 38
	JVM_OPC_dload_1         = 39
	JVM_OPC_dload_2         = 40
	JVM_OPC_dload_3         = 41
	JVM_OPC_aload_0         = 42
	JVM_OPC_aload_1         = 43
	JVM_OPC_aload_2         = 44
	JVM_OPC_aload_3         = 45
	JVM_OPC_iaload          = 46
	JVM_OPC_laload          = 47
	JVM_OPC_faload          = 48
	JVM_OPC_daload          = 49
	JVM_OPC_aaload          = 50
	JVM_OPC_baload          = 51
	JVM_OPC_caload          = 52
	JVM_OPC_saload          = 53
	JVM_OPC_istore          = 54
	JVM_OPC_lstore          = 55
	JVM_OPC_fstore          = 56
	JVM_OPC_dstore          = 57
	JVM_OPC_astore          = 58
	JVM_OPC_istore_0        = 59
	JVM_OPC_istore_1        = 60
	JVM_OPC_istore_2        = 61
	JVM_OPC_istore_3        = 62
	JVM_OPC_lstore_0        = 63
	JVM_OPC_lstore_1        = 64
	JVM_OPC_lstore_2        = 65
	JVM_OPC_lstore_3        = 66
	JVM_OPC_fstore_0        = 67
	JVM_OPC_fstore_1        = 68
	JVM_OPC_fstore_2        = 69
	JVM_OPC_fstore_3        = 70
	JVM_OPC_dstore_0        = 71
	JVM_OPC_dstore_1        = 72
	JVM_OPC_dstore_2        = 73
	JVM_OPC_dstore_3        = 74
	JVM_OPC_astore_0        = 75
	JVM_OPC_astore_1        = 76
	JVM_OPC_astore_2        = 77
	JVM_OPC_astore_3        = 78
	JVM_OPC_iastore         = 79
	JVM_OPC_lastore         = 80
	JVM_OPC_fastore         = 81
	JVM_OPC_dastore         = 82
	JVM_OPC_aastore         = 83
	JVM_OPC_bastore         = 84
	JVM_OPC_castore         = 85
	JVM_OPC_sastore         = 86
	JVM_OPC_pop             = 87
	JVM_OPC_pop2            = 88
	JVM_OPC_dup             = 89
	JVM_OPC_dup_x1          = 90
	JVM_OPC_dup_x2          = 91
	JVM_OPC_dup2            = 92
	JVM_OPC_dup2_x1         = 93
	JVM_OPC_dup2_x2         = 94
	JVM_OPC_swap            = 95
	JVM_OPC_iadd            = 96
	JVM_OPC_ladd            = 97
	JVM_OPC_fadd            = 98
	JVM_OPC_dadd            = 99
	JVM_OPC_isub            = 100
	JVM_OPC_lsub            = 101
	JVM_OPC_fsub            = 102
	JVM_OPC_dsub            = 103
	JVM_OPC_imul            = 104
	JVM_OPC_lmul            = 105
	JVM_OPC_fmul            = 106
	JVM_OPC_dmul            = 107
	JVM_OPC_idiv            = 108
	JVM_OPC_ldiv            = 109
	JVM_OPC_fdiv            = 110
	JVM_OPC_ddiv            = 111
	JVM_OPC_irem            = 112
	JVM_OPC_lrem            = 113
	JVM_OPC_frem            = 114
	JVM_OPC_drem            = 115
	JVM_OPC_ineg            = 116
	JVM_OPC_lneg            = 117
	JVM_OPC_fneg            = 118
	JVM_OPC_dneg            = 119
	JVM_OPC_ishl            = 120
	JVM_OPC_lshl            = 121
	JVM_OPC_ishr            = 122
	JVM_OPC_lshr            = 123
	JVM_OPC_iushr           = 124
	JVM_OPC_lushr           = 125
	JVM_OPC_iand            = 126
	JVM_OPC_land            = 127
	JVM_OPC_ior             = 128
	JVM_OPC_lor             = 129
	JVM_OPC_ixor            = 130
	JVM_OPC_lxor            = 131
	JVM_OPC_iinc            = 132
	JVM_OPC_i2l             = 133
	JVM_OPC_i2f             = 134
	JVM_OPC_i2d             = 135
	JVM_OPC_l2i             = 136
	JVM_OPC_l2f             = 137
	JVM_OPC_l2d             = 138
	JVM_OPC_f2i             = 139
	JVM_OPC_f2l             = 140
	JVM_OPC_f2d             = 141
	JVM_OPC_d2i             = 142
	JVM_OPC_d2l             = 143
	JVM_OPC_d2f             = 144
	JVM_OPC_i2b             = 145
	JVM_OPC_i2c             = 146
	JVM_OPC_i2s             = 147
	JVM_OPC_lcmp            = 148
	JVM_OPC_fcmpl           = 149
	JVM_OPC_fcmpg           = 150
	JVM_OPC_dcmpl           = 151
	JVM_OPC_dcmpg           = 152
	JVM_OPC_ifeq            = 153
	JVM_OPC_ifne            = 154
	JVM_OPC_iflt            = 155
	JVM_OPC_ifge            = 156
	JVM_OPC_ifgt            = 157
	JVM_OPC_ifle            = 158
	JVM_OPC_if_icmpeq       = 159
	JVM_OPC_if_icmpne       = 160
	JVM_OPC_if_icmplt       = 161
	JVM_OPC_if_icmpge       = 162
	JVM_OPC_if_icmpgt       = 163
	JVM_OPC_if_icmple       = 164
	JVM_OPC_if_acmpeq       = 165
	JVM_OPC_if_acmpne       = 166
	JVM_OPC_goto            = 167
	JVM_OPC_jsr             = 168
	JVM_OPC_ret             = 169
	JVM_OPC_tableswitch     = 170
	JVM_OPC_lookupswitch    = 171
	JVM_OPC_ireturn         = 172
	JVM_OPC_lreturn         = 173
	JVM_OPC_freturn         = 174
	JVM_OPC_dreturn         = 175
	JVM_OPC_areturn         = 176
	JVM_OPC_return          = 177
	JVM_OPC_getstatic       = 178
	JVM_OPC_putstatic       = 179
	JVM_OPC_getfield        = 180
	JVM_OPC_putfield        = 181
	JVM_OPC_invokevirtual   = 182
	JVM_OPC_invokespecial   = 183
	JVM_OPC_invokestatic    = 184
	JVM_OPC_invokeinterface = 185
	JVM_OPC_invokedynamic   = 186
	JVM_OPC_new             = 187
	JVM_OPC_newarray        = 188
	JVM_OPC_anewarray       = 189
	JVM_OPC_arraylength     = 190
	JVM_OPC_athrow          = 191
	JVM_OPC_checkcast       = 192
	JVM_OPC_instanceof      = 193
	JVM_OPC_monitorenter    = 194
	JVM_OPC_monitorexit     = 195
	JVM_OPC_wide            = 196
	JVM_OPC_multianewarray  = 197
	JVM_OPC_ifnull          = 198
	JVM_OPC_ifnonnull       = 199
	JVM_OPC_goto_w          = 200
	JVM_OPC_jsr_w           = 201
	JVM_OPC_breakpoint      = 202
	JVM_OPC_MAX             = 202
)

const JVM_OPCODE_VARIABLE_LENGTH = 99

/* Opcode length initializer use with something like:
 *   unsigned char opcode_length[JVM_OPC_MAX+1] = JVM_OPCODE_LENGTH_INITIALIZER;
 */
var JVM_OPCODE_LENGTH_INITIALIZER = [JVM_OPC_MAX + 1]int{
	1,                          /* nop */
	1,                          /* aconst_null */
	1,                          /* iconst_m1 */
	1,                          /* iconst_0 */
	1,                          /* iconst_1 */
	1,                          /* iconst_2 */
	1,                          /* iconst_3 */
	1,                          /* iconst_4 */
	1,                          /* iconst_5 */
	1,                          /* lconst_0 */
	1,                          /* lconst_1 */
	1,                          /* fconst_0 */
	1,                          /* fconst_1 */
	1,                          /* fconst_2 */
	1,                          /* dconst_0 */
	1,                          /* dconst_1 */
	2,                          /* bipush */
	3,                          /* sipush */
	2,                          /* ldc */
	3,                          /* ldc_w */
	3,                          /* ldc2_w */
	2,                          /* iload */
	2,                          /* lload */
	2,                          /* fload */
	2,                          /* dload */
	2,                          /* aload */
	1,                          /* iload_0 */
	1,                          /* iload_1 */
	1,                          /* iload_2 */
	1,                          /* iload_3 */
	1,                          /* lload_0 */
	1,                          /* lload_1 */
	1,                          /* lload_2 */
	1,                          /* lload_3 */
	1,                          /* fload_0 */
	1,                          /* fload_1 */
	1,                          /* fload_2 */
	1,                          /* fload_3 */
	1,                          /* dload_0 */
	1,                          /* dload_1 */
	1,                          /* dload_2 */
	1,                          /* dload_3 */
	1,                          /* aload_0 */
	1,                          /* aload_1 */
	1,                          /* aload_2 */
	1,                          /* aload_3 */
	1,                          /* iaload */
	1,                          /* laload */
	1,                          /* faload */
	1,                          /* daload */
	1,                          /* aaload */
	1,                          /* baload */
	1,                          /* caload */
	1,                          /* saload */
	2,                          /* istore */
	2,                          /* lstore */
	2,                          /* fstore */
	2,                          /* dstore */
	2,                          /* astore */
	1,                          /* istore_0 */
	1,                          /* istore_1 */
	1,                          /* istore_2 */
	1,                          /* istore_3 */
	1,                          /* lstore_0 */
	1,                          /* lstore_1 */
	1,                          /* lstore_2 */
	1,                          /* lstore_3 */
	1,                          /* fstore_0 */
	1,                          /* fstore_1 */
	1,                          /* fstore_2 */
	1,                          /* fstore_3 */
	1,                          /* dstore_0 */
	1,                          /* dstore_1 */
	1,                          /* dstore_2 */
	1,                          /* dstore_3 */
	1,                          /* astore_0 */
	1,                          /* astore_1 */
	1,                          /* astore_2 */
	1,                          /* astore_3 */
	1,                          /* iastore */
	1,                          /* lastore */
	1,                          /* fastore */
	1,                          /* dastore */
	1,                          /* aastore */
	1,                          /* bastore */
	1,                          /* castore */
	1,                          /* sastore */
	1,                          /* pop */
	1,                          /* pop2 */
	1,                          /* dup */
	1,                          /* dup_x1 */
	1,                          /* dup_x2 */
	1,                          /* dup2 */
	1,                          /* dup2_x1 */
	1,                          /* dup2_x2 */
	1,                          /* swap */
	1,                          /* iadd */
	1,                          /* ladd */
	1,                          /* fadd */
	1,                          /* dadd */
	1,                          /* isub */
	1,                          /* lsub */
	1,                          /* fsub */
	1,                          /* dsub */
	1,                          /* imul */
	1,                          /* lmul */
	1,                          /* fmul */
	1,                          /* dmul */
	1,                          /* idiv */
	1,                          /* ldiv */
	1,                          /* fdiv */
	1,                          /* ddiv */
	1,                          /* irem */
	1,                          /* lrem */
	1,                          /* frem */
	1,                          /* drem */
	1,                          /* ineg */
	1,                          /* lneg */
	1,                          /* fneg */
	1,                          /* dneg */
	1,                          /* ishl */
	1,                          /* lshl */
	1,                          /* ishr */
	1,                          /* lshr */
	1,                          /* iushr */
	1,                          /* lushr */
	1,                          /* iand */
	1,                          /* land */
	1,                          /* ior */
	1,                          /* lor */
	1,                          /* ixor */
	1,                          /* lxor */
	3,                          /* iinc */
	1,                          /* i2l */
	1,                          /* i2f */
	1,                          /* i2d */
	1,                          /* l2i */
	1,                          /* l2f */
	1,                          /* l2d */
	1,                          /* f2i */
	1,                          /* f2l */
	1,                          /* f2d */
	1,                          /* d2i */
	1,                          /* d2l */
	1,                          /* d2f */
	1,                          /* i2b */
	1,                          /* i2c */
	1,                          /* i2s */
	1,                          /* lcmp */
	1,                          /* fcmpl */
	1,                          /* fcmpg */
	1,                          /* dcmpl */
	1,                          /* dcmpg */
	3,                          /* ifeq */
	3,                          /* ifne */
	3,                          /* iflt */
	3,                          /* ifge */
	3,                          /* ifgt */
	3,                          /* ifle */
	3,                          /* if_icmpeq */
	3,                          /* if_icmpne */
	3,                          /* if_icmplt */
	3,                          /* if_icmpge */
	3,                          /* if_icmpgt */
	3,                          /* if_icmple */
	3,                          /* if_acmpeq */
	3,                          /* if_acmpne */
	3,                          /* goto */
	3,                          /* jsr */
	2,                          /* ret */
	JVM_OPCODE_VARIABLE_LENGTH, /* tableswitch */
	JVM_OPCODE_VARIABLE_LENGTH, /* lookupswitch */
	1,                          /* ireturn */
	1,                          /* lreturn */
	1,                          /* freturn */
	1,                          /* dreturn */
	1,                          /* areturn */
	1,                          /* return */
	3,                          /* getstatic */
	3,                          /* putstatic */
	3,                          /* getfield */
	3,                          /* putfield */
	3,                          /* invokevirtual */
	3,                          /* invokespecial */
	3,                          /* invokestatic */
	5,                          /* invokeinterface */
	5,                          /* invokedynamic */
	3,                          /* new */
	2,                          /* newarray */
	3,                          /* anewarray */
	1,                          /* arraylength */
	1,                          /* athrow */
	3,                          /* checkcast */
	3,                          /* instanceof */
	1,                          /* monitorenter */
	1,                          /* monitorexit */
	0,                          /* wide */
	4,                          /* multianewarray */
	3,                          /* ifnull */
	3,                          /* ifnonnull */
	5,                          /* goto_w */
	5,                          /* jsr_w */
}
