/* NSC -- new Scala compiler
 * Copyright 2005-2010 LAMP/EPFL
 * @author  Martin Odersky
 */

package scala.tools.nsc
package symtab
package classfile

object ClassfileConstants {

  final val JAVA_MAGIC = 0xCAFEBABE
  final val JAVA_MAJOR_VERSION = 45
  final val JAVA_MINOR_VERSION = 3

  /** <p>
   *    (see http://java.sun.com/docs/books/jvms/second_edition/jvms-clarify.html)
   *  </p>
   *  <p>
   *    If the <code>ACC_INTERFACE</code> flag is set, the <code>ACC_ABSTRACT</code>
   *    flag must also be set (ch. 2.13.1).
   *  </p>
   *  <p>
   *    A class file cannot have both its <code>ACC_FINAL</code> and
   *    <code>ACC_ABSTRACT</code> flags set (ch. 2.8.2).
   *  </p>
   *  <p>
   *    A field may have at most one of its <code>ACC_PRIVATE</code>,
   *    <code>ACC_PROTECTED</code>, <code>ACC_PUBLIC</code> flags set (ch. 2.7.4).
   *  </p>
   *  <p>
   *    A field may not have both its <code>ACC_FINAL</code> and
   *    <code>ACC_VOLATILE</code> flags set (ch. 2.9.1).
   *  </p>
   *  <p>
   *    If a method has its <code>ACC_ABSTRACT</code> flag set it must not
   *    have any of its <code>ACC_FINAL</code>, <code>ACC_NATIVE</code>,
   *    <code>ACC_PRIVATE</code>, <code>ACC_STATIC</code>, <code>ACC_STRICT</code>,
   *    or <code>ACC_SYNCHRONIZED</code> flags set (ch. 2.13.3.2).
   *  </p>
   *  <p>
   *    All interface methods must have their <code>ACC_ABSTRACT</code> and
   *    <code>ACC_PUBLIC</code> flags set.
   *  </p>
   */                                        // Class   Field   Method
  final val JAVA_ACC_PUBLIC       = 0x0001   //   X       X        X
  final val JAVA_ACC_PRIVATE      = 0x0002   //           X        X
  final val JAVA_ACC_PROTECTED    = 0x0004   //           X        X
  final val JAVA_ACC_STATIC       = 0x0008   //           X        X
  final val JAVA_ACC_FINAL        = 0x0010   //   X       X        X
  final val JAVA_ACC_SUPER        = 0x0020   //   X
  final val JAVA_ACC_SYNCHRONIZED = 0x0020   //                    X
  final val JAVA_ACC_VOLATILE     = 0x0040   //           X
  final val JAVA_ACC_BRIDGE       = 0x0040   //                    X
  final val JAVA_ACC_TRANSIENT    = 0x0080   //           X
  final val JAVA_ACC_VARARGS      = 0x0080   //                    X
  final val JAVA_ACC_NATIVE       = 0x0100   //                    X
  final val JAVA_ACC_INTERFACE    = 0x0200   //   X
  final val JAVA_ACC_ABSTRACT     = 0x0400   //   X                X
  final val JAVA_ACC_STRICT       = 0x0800   //                    X
  final val JAVA_ACC_SYNTHETIC    = 0x1000   //   X       X        X
  final val JAVA_ACC_ANNOTATION   = 0x2000   //   X
  final val JAVA_ACC_ENUM         = 0x4000   //   X       X

  // tags describing the type of a literal in the constant pool
  final val CONSTANT_UTF8          =  1
  final val CONSTANT_UNICODE       =  2
  final val CONSTANT_INTEGER       =  3
  final val CONSTANT_FLOAT         =  4
  final val CONSTANT_LONG          =  5
  final val CONSTANT_DOUBLE        =  6
  final val CONSTANT_CLASS         =  7
  final val CONSTANT_STRING        =  8
  final val CONSTANT_FIELDREF      =  9
  final val CONSTANT_METHODREF     = 10
  final val CONSTANT_INTFMETHODREF = 11
  final val CONSTANT_NAMEANDTYPE   = 12

  // tags describing the type of a literal in attribute values
  final val BYTE_TAG   = 'B'
  final val CHAR_TAG   = 'C'
  final val DOUBLE_TAG = 'D'
  final val FLOAT_TAG  = 'F'
  final val INT_TAG    = 'I'
  final val LONG_TAG   = 'J'
  final val SHORT_TAG  = 'S'
  final val BOOL_TAG   = 'Z'
  final val STRING_TAG = 's'
  final val ENUM_TAG   = 'e'
  final val CLASS_TAG  = 'c'
  final val ARRAY_TAG  = '['
  final val VOID_TAG   = 'V'
  final val TVAR_TAG   = 'T'
  final val ANNOTATION_TAG = '@'
  final val SCALA_NOTHING = "scala.runtime.Nothing$"
  final val SCALA_NULL = "scala.runtime.Null$"

  
  // tags describing the type of newarray
  final val T_BOOLEAN = 4
  final val T_CHAR    = 5
  final val T_FLOAT   = 6
  final val T_DOUBLE  = 7
  final val T_BYTE    = 8
  final val T_SHORT   = 9
  final val T_INT     = 10
  final val T_LONG    = 11

  // JVM mnemonics
  final val nop         = 0x00
  final val aconst_null = 0x01
  final val iconst_m1   = 0x02
  
  final val iconst_0    = 0x03
  final val iconst_1    = 0x04
  final val iconst_2    = 0x05
  final val iconst_3    = 0x06
  final val iconst_4    = 0x07
  final val iconst_5    = 0x08
	
  final val lconst_0    = 0x09
  final val lconst_1    = 0x0a
  final val fconst_0    = 0x0b
  final val fconst_1    = 0x0c
  final val fconst_2    = 0x0d
  final val dconst_0    = 0x0e
  final val dconst_1    = 0x0f

  final val bipush      = 0x10
  final val sipush      = 0x11
  final val ldc         = 0x12
  final val ldc_w       = 0x13
  final val ldc2_w      = 0x14
  	  
  final val iload       = 0x15
  final val lload       = 0x16
  final val fload       = 0x17
  final val dload       = 0x18
  final val aload       = 0x19
  	  
  final val iload_0     = 0x1a
  final val iload_1     = 0x1b
  final val iload_2     = 0x1c
  final val iload_3     = 0x1d
  final val lload_0     = 0x1e
  final val lload_1     = 0x1f
  final val lload_2     = 0x20
  final val lload_3     = 0x21
  final val fload_0     = 0x22
  final val fload_1     = 0x23
  final val fload_2     = 0x24
  final val fload_3     = 0x25
  final val dload_0     = 0x26
  final val dload_1     = 0x27
  final val dload_2     = 0x28
  final val dload_3     = 0x29
  final val aload_0     = 0x2a
  final val aload_1     = 0x2b
  final val aload_2     = 0x2c
  final val aload_3     = 0x2d
  final val iaload      = 0x2e
  final val laload      = 0x2f
  final val faload      = 0x30
  final val daload      = 0x31
  final val aaload      = 0x32
  final val baload      = 0x33
  final val caload      = 0x34
  final val saload      = 0x35
  	  
  final val istore      = 0x36
  final val lstore      = 0x37
  final val fstore      = 0x38
  final val dstore      = 0x39
  final val astore      = 0x3a
  final val istore_0    = 0x3b
  final val istore_1    = 0x3c
  final val istore_2    = 0x3d
  final val istore_3    = 0x3e
  final val lstore_0    = 0x3f
  final val lstore_1    = 0x40
  final val lstore_2    = 0x41
  final val lstore_3    = 0x42
  final val fstore_0    = 0x43
  final val fstore_1    = 0x44
  final val fstore_2    = 0x45
  final val fstore_3    = 0x46
  final val dstore_0    = 0x47
  final val dstore_1    = 0x48
  final val dstore_2    = 0x49
  final val dstore_3    = 0x4a
  final val astore_0    = 0x4b
  final val astore_1    = 0x4c
  final val astore_2    = 0x4d
  final val astore_3    = 0x4e
  final val iastore     = 0x4f
  final val lastore     = 0x50
  final val fastore     = 0x51
  final val dastore     = 0x52
  final val aastore     = 0x53
  final val bastore     = 0x54
  final val castore     = 0x55
  final val sastore     = 0x56
	
  final val pop         = 0x57
  final val pop2        = 0x58
  final val dup         = 0x59
  final val dup_x1      = 0x5a
  final val dup_x2      = 0x5b
  final val dup2        = 0x5c
  final val dup2_x1     = 0x5d
  final val dup2_x2     = 0x5e
  final val swap        = 0x5f
  	  
  final val iadd        = 0x60
  final val ladd        = 0x61
  final val fadd        = 0x62
  final val dadd        = 0x63
  final val isub        = 0x64
  final val lsub        = 0x65
  final val fsub        = 0x66
  final val dsub        = 0x67
  final val imul        = 0x68
  final val lmul        = 0x69
  final val fmul        = 0x6a
  final val dmul        = 0x6b
  final val idiv        = 0x6c
  final val ldiv        = 0x6d
  final val fdiv        = 0x6e
  final val ddiv        = 0x6f
  final val irem        = 0x70
  final val lrem        = 0x71
  final val frem        = 0x72
  final val drem        = 0x73
  	  
  final val ineg        = 0x74
  final val lneg        = 0x75
  final val fneg        = 0x76
  final val dneg        = 0x77
	
  final val ishl        = 0x78
  final val lshl        = 0x79
  final val ishr        = 0x7a
  final val lshr        = 0x7b
  final val iushr       = 0x7c
  final val lushr       = 0x7d
  final val iand        = 0x7e
  final val land        = 0x7f
  final val ior         = 0x80
  final val lor         = 0x81
  final val ixor        = 0x82
  final val lxor        = 0x83
  final val iinc        = 0x84
  	  
  final val i2l         = 0x85
  final val i2f         = 0x86
  final val i2d         = 0x87
  final val l2i         = 0x88
  final val l2f         = 0x89
  final val l2d         = 0x8a
  final val f2i         = 0x8b
  final val f2l         = 0x8c
  final val f2d         = 0x8d
  final val d2i         = 0x8e
  final val d2l         = 0x8f
  final val d2f         = 0x90
  final val i2b         = 0x91
  final val i2c         = 0x92
  final val i2s         = 0x93
  	  
  final val lcmp        = 0x94
  final val fcmpl       = 0x95
  final val fcmpg       = 0x96
  final val dcmpl       = 0x97
  final val dcmpg       = 0x98
  	  
  final val ifeq        = 0x99
  final val ifne        = 0x9a
  final val iflt        = 0x9b
  final val ifge        = 0x9c
  final val ifgt        = 0x9d
  final val ifle        = 0x9e
  final val if_icmpeq   = 0x9f
  final val if_icmpne   = 0xa0
  final val if_icmplt   = 0xa1
  final val if_icmpge   = 0xa2
  final val if_icmpgt   = 0xa3
  final val if_icmple   = 0xa4
  final val if_acmpeq   = 0xa5
  final val if_acmpne   = 0xa6
  final val goto        = 0xa7
  final val jsr         = 0xa8
  final val ret         = 0xa9
  final val tableswitch = 0xaa
  final val lookupswitch = 0xab
  final val ireturn     = 0xac
  final val lreturn     = 0xad
  final val freturn     = 0xae
  final val dreturn     = 0xaf
  final val areturn     = 0xb0
  final val return_     = 0xb1

  final val getstatic   = 0xb2
  final val putstatic   = 0xb3
  final val getfield    = 0xb4
  final val putfield    = 0xb5
  	  	
  final val invokevirtual   = 0xb6
  final val invokespecial   = 0xb7
  final val invokestatic    = 0xb8
  final val invokeinterface = 0xb9
  final val xxxunusedxxxx   = 0xba
  	  
  final val new_          = 0xbb
  final val newarray      = 0xbc
  final val anewarray     = 0xbd
  final val arraylength   = 0xbe
  final val athrow        = 0xbf
  final val checkcast     = 0xc0
  final val instanceof    = 0xc1    
  final val monitorenter  = 0xc2
  final val monitorexit   = 0xc3
  final val wide          = 0xc4
  final val multianewarray = 0xc5
  final val ifnull        = 0xc6
  final val ifnonnull     = 0xc7
  final val goto_w        = 0xc8
  final val jsr_w         = 0xc9
  	  
  // reserved opcodes
  final val breakpoint    = 0xca
  final val impdep1       = 0xfe
  final val impdep2       = 0xff  
}
