// Change in stack size (+ or -) associated with each opcode.
// For certain opcodes, this number isn't a constant;
// the only one in our current subset is INVOKESTATIC.


#define UNDEFINED_SIZE_CHANGE (-777)

  static int stack_size_change[] = 
    {0, // 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, 
     UNDEFINED_SIZE_CHANGE, // LCONST_0,
     UNDEFINED_SIZE_CHANGE, // LCONST_1,
     UNDEFINED_SIZE_CHANGE, // FCONST_0,
     UNDEFINED_SIZE_CHANGE, // FCONST_1,
     UNDEFINED_SIZE_CHANGE, // FCONST_2,
     UNDEFINED_SIZE_CHANGE, // DCONST_0,
     UNDEFINED_SIZE_CHANGE, // DCONST_1,
     1, // BIPUSH, 
     1, // SIPUSH, 
     1, // LDC, 
     1, // LDC_W,
     UNDEFINED_SIZE_CHANGE, // LDC2_W,
     1, // ILOAD, 
     UNDEFINED_SIZE_CHANGE, // LLOAD,2
     UNDEFINED_SIZE_CHANGE, // FLOAD,3
     UNDEFINED_SIZE_CHANGE, // DLOAD,4
     1, // ALOAD, 
     1, // ILOAD_0,
     1, // ILOAD_1,
     1, // ILOAD_2,
     1, // ILOAD_3,
     UNDEFINED_SIZE_CHANGE, // LLOAD_0,
     UNDEFINED_SIZE_CHANGE, // LLOAD_1,
     UNDEFINED_SIZE_CHANGE, // LLOAD_2,
     UNDEFINED_SIZE_CHANGE, // LLOAD_3,
     UNDEFINED_SIZE_CHANGE, // FLOAD_0,
     UNDEFINED_SIZE_CHANGE, // FLOAD_1,
     UNDEFINED_SIZE_CHANGE, // FLOAD_2,
     UNDEFINED_SIZE_CHANGE, // FLOAD_3,
     UNDEFINED_SIZE_CHANGE, // DLOAD_0,
     UNDEFINED_SIZE_CHANGE, // DLOAD_1,
     UNDEFINED_SIZE_CHANGE, // DLOAD_2,
     UNDEFINED_SIZE_CHANGE, // DLOAD_3,
     1, // ALOAD_0,
     1, // ALOAD_1,
     1, // ALOAD_2,
     1, // ALOAD_3,
     -1,// IALOAD, 
     UNDEFINED_SIZE_CHANGE, // LALOAD,
     UNDEFINED_SIZE_CHANGE, // FALOAD,
     UNDEFINED_SIZE_CHANGE, // DALOAD,
     UNDEFINED_SIZE_CHANGE, // AALOAD,
     UNDEFINED_SIZE_CHANGE, // BALOAD,
     UNDEFINED_SIZE_CHANGE, // CALOAD,
     UNDEFINED_SIZE_CHANGE, // SALOAD,
     -1, // ISTORE,
     UNDEFINED_SIZE_CHANGE, // LSTORE,
     UNDEFINED_SIZE_CHANGE, // FSTORE,
     UNDEFINED_SIZE_CHANGE, // DSTORE,
     -1, // ASTORE, 
     -1, // ISTORE_0, 
     -1, // ISTORE_1,
     -1, // ISTORE_2,
     -1, // ISTORE_3,
     UNDEFINED_SIZE_CHANGE, // LSTORE_0,
     UNDEFINED_SIZE_CHANGE, // LSTORE_1,
     UNDEFINED_SIZE_CHANGE, // LSTORE_2,
     UNDEFINED_SIZE_CHANGE, // LSTORE_3,
     UNDEFINED_SIZE_CHANGE, // FSTORE_0,
     UNDEFINED_SIZE_CHANGE, // FSTORE_1,
     UNDEFINED_SIZE_CHANGE, // FSTORE_2,
     UNDEFINED_SIZE_CHANGE, // FSTORE_3,
     UNDEFINED_SIZE_CHANGE, // DSTORE_0,
     UNDEFINED_SIZE_CHANGE, // DSTORE_1,
     UNDEFINED_SIZE_CHANGE, // DSTORE_2,
     UNDEFINED_SIZE_CHANGE, // DSTORE_3,
     -1, // ASTORE_0, 
     -1, // ASTORE_1,
     -1, // ASTORE_2,
     -1, // ASTORE_3,
     -3, // IASTORE, 
     UNDEFINED_SIZE_CHANGE, // LASTORE,
     UNDEFINED_SIZE_CHANGE, // FASTORE,
     UNDEFINED_SIZE_CHANGE, // DASTORE,
     UNDEFINED_SIZE_CHANGE, // AASTORE,
     UNDEFINED_SIZE_CHANGE, // BASTORE,
     UNDEFINED_SIZE_CHANGE, // CASTORE,
     UNDEFINED_SIZE_CHANGE, // SASTORE,
     -1, // POP,
     -2, // POP2, 
     1, // DUP,
     UNDEFINED_SIZE_CHANGE, // DUP_X1,
     UNDEFINED_SIZE_CHANGE, // DUP_X2,
     2, // DUP2
     UNDEFINED_SIZE_CHANGE, // DUP2_X1,
     UNDEFINED_SIZE_CHANGE, // DUP2_X2,
     0, // SWAP, 
     -1, // IADD, 
     UNDEFINED_SIZE_CHANGE, // LADD,
     UNDEFINED_SIZE_CHANGE, // FADD,
     UNDEFINED_SIZE_CHANGE, // DADD,
     -1, // ISUB, 
     UNDEFINED_SIZE_CHANGE, // LSUB,
     UNDEFINED_SIZE_CHANGE, // FSUB,
     UNDEFINED_SIZE_CHANGE, // DSUB,
     -1, // IMUL, 
     UNDEFINED_SIZE_CHANGE, // LMUL,
     UNDEFINED_SIZE_CHANGE, // FMUL,
     UNDEFINED_SIZE_CHANGE, // DMUL,
     -1, // IDIV, 
     UNDEFINED_SIZE_CHANGE, // LDIV,
     UNDEFINED_SIZE_CHANGE, // FDIV,
     UNDEFINED_SIZE_CHANGE, // DDIV,
     -1, // IREM, 
     UNDEFINED_SIZE_CHANGE, // LREM,
     UNDEFINED_SIZE_CHANGE, // FREM,
     UNDEFINED_SIZE_CHANGE, // DREM,
     0, // INEG, 
     UNDEFINED_SIZE_CHANGE, // LNEG,
     UNDEFINED_SIZE_CHANGE, // FNEG,
     UNDEFINED_SIZE_CHANGE, // DNEG,
     UNDEFINED_SIZE_CHANGE, // ISHL,
     UNDEFINED_SIZE_CHANGE, // LSHL,
     UNDEFINED_SIZE_CHANGE, // ISHR,
     UNDEFINED_SIZE_CHANGE, // LSHR,
     UNDEFINED_SIZE_CHANGE, // IUSHR,
     UNDEFINED_SIZE_CHANGE, // LUSHR,
     -1, // IAND, 
     UNDEFINED_SIZE_CHANGE, // LAND,
     -1, // IOR, 
     UNDEFINED_SIZE_CHANGE, // LOR,
     -1, // IXOR, 
     UNDEFINED_SIZE_CHANGE, // LXOR,
     0, // IINC, 
     UNDEFINED_SIZE_CHANGE, // I2L,
     UNDEFINED_SIZE_CHANGE, // I2F,
     UNDEFINED_SIZE_CHANGE, // I2D,
     UNDEFINED_SIZE_CHANGE, // L2I,
     UNDEFINED_SIZE_CHANGE, // L2F,
     UNDEFINED_SIZE_CHANGE, // L2D,
     UNDEFINED_SIZE_CHANGE, // F2I,
     UNDEFINED_SIZE_CHANGE, // F2L,
     UNDEFINED_SIZE_CHANGE, // F2D,
     UNDEFINED_SIZE_CHANGE, // D2I,
     UNDEFINED_SIZE_CHANGE, // D2L,
     UNDEFINED_SIZE_CHANGE, // D2F,
     UNDEFINED_SIZE_CHANGE, // INT2BYTE,
     UNDEFINED_SIZE_CHANGE, // INT2CHAR,
     UNDEFINED_SIZE_CHANGE, // INT2SHORT,
     UNDEFINED_SIZE_CHANGE, // LCMP,
     UNDEFINED_SIZE_CHANGE, // FCMPL,
     UNDEFINED_SIZE_CHANGE, // FCMPG,
     UNDEFINED_SIZE_CHANGE, // DCMPL,
     UNDEFINED_SIZE_CHANGE, // DCMPG,
     -1, // IFEQ, 
     -1, // IFNE, 
     -1, // IFLT,
     -1, // IFGE,
     -1, // IFGT,
     -1, // IFLE,
     -2, // IF_ICMPEQ, 
     -2, // IF_ICMPNE, 
     -2, // IF_ICMPLT,
     -2, // IF_ICMPGE,
     -2, // IF_ICMPGT,
     -2, // IF_ICMPLE,
     -2, // IF_ACMPEQ, 
     -2, // IF_ACMPNE, 
     0, // GOTO, 
     UNDEFINED_SIZE_CHANGE, // JSR,
     UNDEFINED_SIZE_CHANGE, // RET,
     UNDEFINED_SIZE_CHANGE, // TABLESWITCH,
     UNDEFINED_SIZE_CHANGE, // LOOKUPSWITCH,
     -1, // IRETURN, 
     UNDEFINED_SIZE_CHANGE, // LRETURN,
     UNDEFINED_SIZE_CHANGE, // FRETURN,
     UNDEFINED_SIZE_CHANGE, // DRETURN,
     -1, // ARETURN, 
     0, // RETURN, 
     1, // GETSTATIC, 
     UNDEFINED_SIZE_CHANGE, // PUTSTATIC,
     UNDEFINED_SIZE_CHANGE, // GETFIELD,
     UNDEFINED_SIZE_CHANGE, // PUTFIELD,
     -2, // INVOKEVIRTUAL,
     UNDEFINED_SIZE_CHANGE, // INVOKESPECIAL,
     UNDEFINED_SIZE_CHANGE, // INVOKESTATIC, 
     UNDEFINED_SIZE_CHANGE, // INVOKEINTERFACE,
     UNDEFINED_SIZE_CHANGE, // unused
     UNDEFINED_SIZE_CHANGE, // NEW,
     0, // NEWARRAY,  
     UNDEFINED_SIZE_CHANGE, // ANEWARRAY, 
     0, // ARRAYLENGTH, 
     UNDEFINED_SIZE_CHANGE, // ATHROW,
     UNDEFINED_SIZE_CHANGE, // CHECKCAST,
     UNDEFINED_SIZE_CHANGE, // INSTANCEOF,
     UNDEFINED_SIZE_CHANGE, // MONITORENTER,
     UNDEFINED_SIZE_CHANGE, // MONITOREXIT,
     UNDEFINED_SIZE_CHANGE, // WIDE,
     UNDEFINED_SIZE_CHANGE, // MULTIANEWARRAY,
     -1, // IFNULL,
     -1, // IFNONNULL,  
     0, // GOTO_W,  
     UNDEFINED_SIZE_CHANGE  // JSR_W
    };
