/*
 * @(#)classfile_constants.h	1.3 05/01/04
 * 
 * Copyright (c) 2005 Sun Microsystems, Inc. All Rights Reserved.
 * 
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 * 
 * -Redistribution of source code must retain the above copyright notice, this
 *  list of conditions and the following disclaimer.
 * 
 * -Redistribution in binary form must reproduce the above copyright notice, 
 *  this list of conditions and the following disclaimer in the documentation
 *  and/or other materials provided with the distribution.
 * 
 * Neither the name of Sun Microsystems, Inc. or the names of contributors may 
 * be used to endorse or promote products derived from this software without 
 * specific prior written permission.
 * 
 * This software is provided "AS IS," without a warranty of any kind. ALL 
 * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING
 * ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
 * OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN MIDROSYSTEMS, INC. ("SUN")
 * AND ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE
 * AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
 * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST 
 * REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, 
 * INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY 
 * OF LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, 
 * EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
 * 
 * You acknowledge that this software is not designed, licensed or intended
 * for use in the design, construction, operation or maintenance of any
 * nuclear facility.
 */

#ifndef CLASSFILE_CONSTANTS_H
#define CLASSFILE_CONSTANTS_H

/* Flags */

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

enum {
    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
};

/* Type signatures */

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

/* Opcodes */

enum {
  opc_nop 		= 0,
  opc_aconst_null 	= 1,
  opc_iconst_m1 	= 2,
  opc_iconst_0 		= 3,
  opc_iconst_1 		= 4,
  opc_iconst_2 		= 5,
  opc_iconst_3 		= 6,
  opc_iconst_4 		= 7,
  opc_iconst_5 		= 8,
  opc_lconst_0 		= 9,
  opc_lconst_1 		= 10,
  opc_fconst_0 		= 11,
  opc_fconst_1 		= 12,
  opc_fconst_2 		= 13,
  opc_dconst_0 		= 14,
  opc_dconst_1 		= 15,
  opc_bipush 		= 16,
  opc_sipush 		= 17,
  opc_ldc 		= 18,
  opc_ldc_w 		= 19,
  opc_ldc2_w 		= 20,
  opc_iload 		= 21,
  opc_lload 		= 22,
  opc_fload 		= 23,
  opc_dload 		= 24,
  opc_aload 		= 25,
  opc_iload_0 		= 26,
  opc_iload_1 		= 27,
  opc_iload_2 		= 28,
  opc_iload_3 		= 29,
  opc_lload_0 		= 30,
  opc_lload_1 		= 31,
  opc_lload_2 		= 32,
  opc_lload_3 		= 33,
  opc_fload_0 		= 34,
  opc_fload_1 		= 35,
  opc_fload_2 		= 36,
  opc_fload_3 		= 37,
  opc_dload_0 		= 38,
  opc_dload_1 		= 39,
  opc_dload_2 		= 40,
  opc_dload_3 		= 41,
  opc_aload_0 		= 42,
  opc_aload_1 		= 43,
  opc_aload_2 		= 44,
  opc_aload_3 		= 45,
  opc_iaload 		= 46,
  opc_laload 		= 47,
  opc_faload 		= 48,
  opc_daload 		= 49,
  opc_aaload 		= 50,
  opc_baload 		= 51,
  opc_caload 		= 52,
  opc_saload 		= 53,
  opc_istore 		= 54,
  opc_lstore 		= 55,
  opc_fstore 		= 56,
  opc_dstore 		= 57,
  opc_astore 		= 58,
  opc_istore_0 		= 59,
  opc_istore_1 		= 60,
  opc_istore_2 		= 61,
  opc_istore_3 		= 62,
  opc_lstore_0 		= 63,
  opc_lstore_1 		= 64,
  opc_lstore_2 		= 65,
  opc_lstore_3 		= 66,
  opc_fstore_0 		= 67,
  opc_fstore_1 		= 68,
  opc_fstore_2 		= 69,
  opc_fstore_3 		= 70,
  opc_dstore_0 		= 71,
  opc_dstore_1 		= 72,
  opc_dstore_2 		= 73,
  opc_dstore_3 		= 74,
  opc_astore_0 		= 75,
  opc_astore_1 		= 76,
  opc_astore_2 		= 77,
  opc_astore_3 		= 78,
  opc_iastore 		= 79,
  opc_lastore 		= 80,
  opc_fastore 		= 81,
  opc_dastore 		= 82,
  opc_aastore 		= 83,
  opc_bastore 		= 84,
  opc_castore 		= 85,
  opc_sastore 		= 86,
  opc_pop 		= 87,
  opc_pop2 		= 88,
  opc_dup 		= 89,
  opc_dup_x1 		= 90,
  opc_dup_x2 		= 91,
  opc_dup2 		= 92,
  opc_dup2_x1 		= 93,
  opc_dup2_x2 		= 94,
  opc_swap 		= 95,
  opc_iadd 		= 96,
  opc_ladd 		= 97,
  opc_fadd 		= 98,
  opc_dadd 		= 99,
  opc_isub 		= 100,
  opc_lsub 		= 101,
  opc_fsub 		= 102,
  opc_dsub 		= 103,
  opc_imul 		= 104,
  opc_lmul 		= 105,
  opc_fmul 		= 106,
  opc_dmul 		= 107,
  opc_idiv 		= 108,
  opc_ldiv 		= 109,
  opc_fdiv 		= 110,
  opc_ddiv 		= 111,
  opc_irem 		= 112,
  opc_lrem 		= 113,
  opc_frem 		= 114,
  opc_drem 		= 115,
  opc_ineg 		= 116,
  opc_lneg 		= 117,
  opc_fneg 		= 118,
  opc_dneg 		= 119,
  opc_ishl 		= 120,
  opc_lshl 		= 121,
  opc_ishr 		= 122,
  opc_lshr 		= 123,
  opc_iushr 		= 124,
  opc_lushr 		= 125,
  opc_iand 		= 126,
  opc_land 		= 127,
  opc_ior 		= 128,
  opc_lor 		= 129,
  opc_ixor 		= 130,
  opc_lxor 		= 131,
  opc_iinc 		= 132,
  opc_i2l 		= 133,
  opc_i2f 		= 134,
  opc_i2d 		= 135,
  opc_l2i 		= 136,
  opc_l2f 		= 137,
  opc_l2d 		= 138,
  opc_f2i 		= 139,
  opc_f2l 		= 140,
  opc_f2d 		= 141,
  opc_d2i 		= 142,
  opc_d2l 		= 143,
  opc_d2f 		= 144,
  opc_i2b 		= 145,
  opc_i2c 		= 146,
  opc_i2s 		= 147,
  opc_lcmp 		= 148,
  opc_fcmpl 		= 149,
  opc_fcmpg 		= 150,
  opc_dcmpl 		= 151,
  opc_dcmpg 		= 152,
  opc_ifeq 		= 153,
  opc_ifne 		= 154,
  opc_iflt 		= 155,
  opc_ifge 		= 156,
  opc_ifgt 		= 157,
  opc_ifle 		= 158,
  opc_if_icmpeq 	= 159,
  opc_if_icmpne 	= 160,
  opc_if_icmplt 	= 161,
  opc_if_icmpge 	= 162,
  opc_if_icmpgt 	= 163,
  opc_if_icmple 	= 164,
  opc_if_acmpeq 	= 165,
  opc_if_acmpne 	= 166,
  opc_goto 		= 167,
  opc_jsr 		= 168,
  opc_ret 		= 169,
  opc_tableswitch 	= 170,
  opc_lookupswitch 	= 171,
  opc_ireturn 		= 172,
  opc_lreturn 		= 173,
  opc_freturn 		= 174,
  opc_dreturn 		= 175,
  opc_areturn 		= 176,
  opc_return 		= 177,
  opc_getstatic 	= 178,
  opc_putstatic 	= 179,
  opc_getfield 		= 180,
  opc_putfield 		= 181,
  opc_invokevirtual 	= 182,
  opc_invokespecial 	= 183,
  opc_invokestatic 	= 184,
  opc_invokeinterface 	= 185,
  opc_xxxunusedxxx 	= 186,
  opc_new 		= 187,
  opc_newarray 		= 188,
  opc_anewarray 	= 189,
  opc_arraylength 	= 190,
  opc_athrow 		= 191,
  opc_checkcast 	= 192,
  opc_instanceof 	= 193,
  opc_monitorenter 	= 194,
  opc_monitorexit 	= 195,
  opc_wide 		= 196,
  opc_multianewarray 	= 197,
  opc_ifnull 		= 198,
  opc_ifnonnull 	= 199,
  opc_goto_w 		= 200,
  opc_jsr_w 		= 201,
  opc_MAX 		= 201
};

/* Opcode length initializer, use with something like:
 *   unsigned char opcode_length[opc_MAX+1] = JVM_OPCODE_LENGTH_INITIALIZER;
 */
#define JVM_OPCODE_LENGTH_INITIALIZER { 	\
   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 */			\
   99,	/* tableswitch */		\
   99,	/* 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 */		\
   0,	/* xxxunusedxxx */		\
   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 */			\
}

#endif

