All Downloads are FREE. Search and download functionalities are using the official Maven repository.

soot.coffi.ByteCode Maven / Gradle / Ivy

There is a newer version: 1.12.0
Show newest version
/* Soot - a J*va Optimization Framework
 * Copyright (C) 1997 Clark Verbrugge
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the
 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
 * Boston, MA 02111-1307, USA.
 */

/*
 * Modified by the Sable Research Group and others 1997-1999.  
 * See the 'credits' file distributed with Soot for the complete list of
 * contributors.  (Soot is distributed at http://www.sable.mcgill.ca/soot)
 */







package soot.coffi;
import soot.*;

/** Procedural code for parsing and otherwise handling bytecode.
 * @author Clark Verbrugge
 */
class ByteCode {

   public static final int NOP = 0;
   public static final int ACONST_NULL = 1;
   public static final int ICONST_M1 = 2;
   public static final int ICONST_0 = 3;
   public static final int ICONST_1 = 4;
   public static final int ICONST_2 = 5;
   public static final int ICONST_3 = 6;
   public static final int ICONST_4 = 7;
   public static final int ICONST_5 = 8;
   public static final int LCONST_0 = 9;
   public static final int LCONST_1 = 10;
   public static final int FCONST_0 = 11;
   public static final int FCONST_1 = 12;
   public static final int FCONST_2 = 13;
   public static final int DCONST_0 = 14;
   public static final int DCONST_1 = 15;
   public static final int BIPUSH = 16;
   public static final int SIPUSH = 17;
   public static final int LDC1 = 18;
   public static final int LDC2 = 19;
   public static final int LDC2W = 20;
   public static final int ILOAD = 21;
   public static final int LLOAD = 22;
   public static final int FLOAD = 23;
   public static final int DLOAD = 24;
   public static final int ALOAD = 25;
   public static final int ILOAD_0 = 26;
   public static final int ILOAD_1 = 27;
   public static final int ILOAD_2 = 28;
   public static final int ILOAD_3 = 29;
   public static final int LLOAD_0 = 30;
   public static final int LLOAD_1 = 31;
   public static final int LLOAD_2 = 32;
   public static final int LLOAD_3 = 33;
   public static final int FLOAD_0 = 34;
   public static final int FLOAD_1 = 35;
   public static final int FLOAD_2 = 36;
   public static final int FLOAD_3 = 37;
   public static final int DLOAD_0 = 38;
   public static final int DLOAD_1 = 39;
   public static final int DLOAD_2 = 40;
   public static final int DLOAD_3 = 41;
   public static final int ALOAD_0 = 42;
   public static final int ALOAD_1 = 43;
   public static final int ALOAD_2 = 44;
   public static final int ALOAD_3 = 45;
   public static final int IALOAD = 46;
   public static final int LALOAD = 47;
   public static final int FALOAD = 48;
   public static final int DALOAD = 49;
   public static final int AALOAD = 50;
   public static final int BALOAD = 51;
   public static final int CALOAD = 52;
   public static final int SALOAD = 53;
   public static final int ISTORE = 54;
   public static final int LSTORE = 55;
   public static final int FSTORE = 56;
   public static final int DSTORE = 57;
   public static final int ASTORE = 58;
   public static final int ISTORE_0 = 59;
   public static final int ISTORE_1 = 60;
   public static final int ISTORE_2 = 61;
   public static final int ISTORE_3 = 62;
   public static final int LSTORE_0 = 63;
   public static final int LSTORE_1 = 64;
   public static final int LSTORE_2 = 65;
   public static final int LSTORE_3 = 66;
   public static final int FSTORE_0 = 67;
   public static final int FSTORE_1 = 68;
   public static final int FSTORE_2 = 69;
   public static final int FSTORE_3 = 70;
   public static final int DSTORE_0 = 71;
   public static final int DSTORE_1 = 72;
   public static final int DSTORE_2 = 73;
   public static final int DSTORE_3 = 74;
   public static final int ASTORE_0 = 75;
   public static final int ASTORE_1 = 76;
   public static final int ASTORE_2 = 77;
   public static final int ASTORE_3 = 78;
   public static final int IASTORE = 79;
   public static final int LASTORE = 80;
   public static final int FASTORE = 81;
   public static final int DASTORE = 82;
   public static final int AASTORE = 83;
   public static final int BASTORE = 84;
   public static final int CASTORE = 85;
   public static final int SASTORE = 86;
   public static final int POP = 87;
   public static final int POP2 = 88;
   public static final int DUP = 89;
   public static final int DUP_X1 = 90;
   public static final int DUP_X2 = 91;
   public static final int DUP2 = 92;
   public static final int DUP2_X1 = 93;
   public static final int DUP2_X2 = 94;
   public static final int SWAP = 95;
   public static final int IADD = 96;
   public static final int LADD = 97;
   public static final int FADD = 98;
   public static final int DADD = 99;
   public static final int ISUB = 100;
   public static final int LSUB = 101;
   public static final int FSUB = 102;
   public static final int DSUB = 103;
   public static final int IMUL = 104;
   public static final int LMUL = 105;
   public static final int FMUL = 106;
   public static final int DMUL = 107;
   public static final int IDIV = 108;
   public static final int LDIV = 109;
   public static final int FDIV = 110;
   public static final int DDIV = 111;
   public static final int IREM = 112;
   public static final int LREM = 113;
   public static final int FREM = 114;
   public static final int DREM = 115;
   public static final int INEG = 116;
   public static final int LNEG = 117;
   public static final int FNEG = 118;
   public static final int DNEG = 119;
   public static final int ISHL = 120;
   public static final int LSHL = 121;
   public static final int ISHR = 122;
   public static final int LSHR = 123;
   public static final int IUSHR = 124;
   public static final int LUSHR = 125;
   public static final int IAND = 126;
   public static final int LAND = 127;
   public static final int IOR = 128;
   public static final int LOR = 129;
   public static final int IXOR = 130;
   public static final int LXOR = 131;
   public static final int IINC = 132;
   public static final int I2L = 133;
   public static final int I2F = 134;
   public static final int I2D = 135;
   public static final int L2I = 136;
   public static final int L2F = 137;
   public static final int L2D = 138;
   public static final int F2I = 139;
   public static final int F2L = 140;
   public static final int F2D = 141;
   public static final int D2I = 142;
   public static final int D2L = 143;
   public static final int D2F = 144;
   public static final int INT2BYTE = 145;
   public static final int INT2CHAR = 146;
   public static final int INT2SHORT = 147;
   public static final int LCMP = 148;
   public static final int FCMPL = 149;
   public static final int FCMPG = 150;
   public static final int DCMPL = 151;
   public static final int DCMPG = 152;
   public static final int IFEQ = 153;
   public static final int IFNE = 154;
   public static final int IFLT = 155;
   public static final int IFGE = 156;
   public static final int IFGT = 157;
   public static final int IFLE = 158;
   public static final int IF_ICMPEQ = 159;
   public static final int IF_ICMPNE = 160;
   public static final int IF_ICMPLT = 161;
   public static final int IF_ICMPGE = 162;
   public static final int IF_ICMPGT = 163;
   public static final int IF_ICMPLE = 164;
   public static final int IF_ACMPEQ = 165;
   public static final int IF_ACMPNE = 166;
   public static final int GOTO = 167;
   public static final int JSR = 168;
   public static final int RET = 169;
   public static final int TABLESWITCH = 170;
   public static final int LOOKUPSWITCH = 171;
   public static final int IRETURN = 172;
   public static final int LRETURN = 173;
   public static final int FRETURN = 174;
   public static final int DRETURN = 175;
   public static final int ARETURN = 176;
   public static final int RETURN = 177;
   public static final int GETSTATIC = 178;
   public static final int PUTSTATIC = 179;
   public static final int GETFIELD = 180;
   public static final int PUTFIELD = 181;
   public static final int INVOKEVIRTUAL = 182;
   public static final int INVOKENONVIRTUAL = 183;
   public static final int INVOKESTATIC = 184;
   public static final int INVOKEINTERFACE = 185;
   public static final int INVOKEDYNAMIC = 186;
   public static final int NEW = 187;
   public static final int NEWARRAY = 188;
   public static final int ANEWARRAY = 189;
   public static final int ARRAYLENGTH = 190;
   public static final int ATHROW = 191;
   public static final int CHECKCAST = 192;
   public static final int INSTANCEOF = 193;
   public static final int MONITORENTER = 194;
   public static final int MONITOREXIT = 195;
   public static final int WIDE = 196;
   public static final int MULTIANEWARRAY = 197;
   public static final int IFNULL = 198;
   public static final int IFNONNULL = 199;
   public static final int GOTO_W = 200;
   public static final int JSR_W = 201;
   public static final int BREAKPOINT = 202;
   /*    public static final int  = 203;
        public static final int  = 204;
        public static final int  = 205;
        public static final int  = 206;
        public static final int  = 207;
        public static final int  = 208;*/
   public static final int RET_W = 209;
   /*    public static final int  = 210;
        public static final int  = 211;
        public static final int  = 212;
        public static final int  = 213;
        public static final int  = 214;
        public static final int  = 215;
        public static final int  = 216;
        public static final int  = 217;
        public static final int  = 218;
        public static final int  = 219;
        public static final int  = 220;
        public static final int  = 221;
        public static final int  = 222;
        public static final int  = 223;
        public static final int  = 224;
        public static final int  = 225;
        public static final int  = 226;
        public static final int  = 227;
        public static final int  = 228;
        public static final int  = 229;
        public static final int  = 230;
        public static final int  = 231;
        public static final int  = 232;
        public static final int  = 233;
        public static final int  = 234;
        public static final int  = 235;
        public static final int  = 236;
        public static final int  = 237;
        public static final int  = 238;
        public static final int  = 239;
        public static final int  = 240;
        public static final int  = 241;
        public static final int  = 242;
        public static final int  = 243;
        public static final int  = 244;
        public static final int  = 245;
        public static final int  = 246;
        public static final int  = 247;
        public static final int  = 248;
        public static final int  = 249;
        public static final int  = 250;
        public static final int  = 251;
        public static final int  = 252;
        public static final int  = 253;
        public static final int  = 254;
        public static final int  = 255;*/

   private int icount;
   private Instruction instructions[];

   /** Constructor---does nothing. */
   ByteCode() {  }

   /** Main.v() entry point for disassembling bytecode into Instructions; this
    * method converts the given single bytecode into an Instruction (with
    * label set to index).
    * @param bc complete array of bytecode.
    * @param index offset within bc of the bytecode to parse.
    * @return a single Instruction object; note that Instruction references will
    * not be filled in (use build to post-process).
    * @see ClassFile#parseMethod
    * @see Instruction#parse
    * @see ByteCode#build
    */
   public Instruction disassemble_bytecode(byte bc[],int index) {
      // returns a string representing the disassembly of the
      // bytecode at the given index
      byte b = bc[index];
      boolean isWide = false;
      Instruction i;
      int x;

      x = (b)&0xff;

      switch(x) {
      case BIPUSH:
         i = new Instruction_Bipush();
         break;
      case SIPUSH:
         i = new Instruction_Sipush();
         break;
      case LDC1:
         i = new Instruction_Ldc1();
         break;
      case LDC2:
         i = new Instruction_Ldc2();
         break;
      case LDC2W:
         i = new Instruction_Ldc2w();
         break;
      case ACONST_NULL:
         i = new Instruction_Aconst_null();
         break;
      case ICONST_M1:
         i = new Instruction_Iconst_m1();
         break;
      case ICONST_0:
         i = new Instruction_Iconst_0();
         break;
      case ICONST_1:
         i = new Instruction_Iconst_1();
         break;
      case ICONST_2:
         i = new Instruction_Iconst_2();
         break;
      case ICONST_3:
         i = new Instruction_Iconst_3();
         break;
      case ICONST_4:
         i = new Instruction_Iconst_4();
         break;
      case ICONST_5:
         i = new Instruction_Iconst_5();
         break;
      case LCONST_0:
         i = new Instruction_Lconst_0();
         break;
      case LCONST_1:
         i = new Instruction_Lconst_1();
         break;
      case FCONST_0:
         i = new Instruction_Fconst_0();
         break;
      case FCONST_1:
         i = new Instruction_Fconst_1();
         break;
      case FCONST_2:
         i = new Instruction_Fconst_2();
         break;
      case DCONST_0:
         i = new Instruction_Dconst_0();
         break;
      case DCONST_1:
         i = new Instruction_Dconst_1();
         break;
      case ILOAD:
         i = new Instruction_Iload();
         break;
      case ILOAD_0:
         i = new Instruction_Iload_0();
         break;
      case ILOAD_1:
         i = new Instruction_Iload_1();
         break;
      case ILOAD_2:
         i = new Instruction_Iload_2();
         break;
      case ILOAD_3:
         i = new Instruction_Iload_3();
         break;
      case LLOAD:
         i = new Instruction_Lload();
         break;
      case LLOAD_0:
         i = new Instruction_Lload_0();
         break;
      case LLOAD_1:
         i = new Instruction_Lload_1();
         break;
      case LLOAD_2:
         i = new Instruction_Lload_2();
         break;
      case LLOAD_3:
         i = new Instruction_Lload_3();
         break;
      case FLOAD:
         i = new Instruction_Fload();
         break;
      case FLOAD_0:
         i = new Instruction_Fload_0();
         break;
      case FLOAD_1:
         i = new Instruction_Fload_1();
         break;
      case FLOAD_2:
         i = new Instruction_Fload_2();
         break;
      case FLOAD_3:
         i = new Instruction_Fload_3();
         break;
      case DLOAD:
         i = new Instruction_Dload();
         break;
      case DLOAD_0:
         i = new Instruction_Dload_0();
         break;
      case DLOAD_1:
         i = new Instruction_Dload_1();
         break;
      case DLOAD_2:
         i = new Instruction_Dload_2();
         break;
      case DLOAD_3:
         i = new Instruction_Dload_3();
         break;
      case ALOAD:
         i = new Instruction_Aload();
         break;
      case ALOAD_0:
         i = new Instruction_Aload_0();
         break;
      case ALOAD_1:
         i = new Instruction_Aload_1();
         break;
      case ALOAD_2:
         i = new Instruction_Aload_2();
         break;
      case ALOAD_3:
         i = new Instruction_Aload_3();
         break;
      case ISTORE:
         i = new Instruction_Istore();
         break;
      case ISTORE_0:
         i = new Instruction_Istore_0();
         break;
      case ISTORE_1:
         i = new Instruction_Istore_1();
         break;
      case ISTORE_2:
         i = new Instruction_Istore_2();
         break;
      case ISTORE_3:
         i = new Instruction_Istore_3();
         break;
      case LSTORE:
         i = new Instruction_Lstore();
         break;
      case LSTORE_0:
         i = new Instruction_Lstore_0();
         break;
      case LSTORE_1:
         i = new Instruction_Lstore_1();
         break;
      case LSTORE_2:
         i = new Instruction_Lstore_2();
         break;
      case LSTORE_3:
         i = new Instruction_Lstore_3();
         break;
      case FSTORE:
         i = new Instruction_Fstore();
         break;
      case FSTORE_0:
         i = new Instruction_Fstore_0();
         break;
      case FSTORE_1:
         i = new Instruction_Fstore_1();
         break;
      case FSTORE_2:
         i = new Instruction_Fstore_2();
         break;
      case FSTORE_3:
         i = new Instruction_Fstore_3();
         break;
      case DSTORE:
         i = new Instruction_Dstore();
         break;
      case DSTORE_0:
         i = new Instruction_Dstore_0();
         break;
      case DSTORE_1:
         i = new Instruction_Dstore_1();
         break;
      case DSTORE_2:
         i = new Instruction_Dstore_2();
         break;
      case DSTORE_3:
         i = new Instruction_Dstore_3();
         break;
      case ASTORE:
         i = new Instruction_Astore();
         break;
      case ASTORE_0:
         i = new Instruction_Astore_0();
         break;
      case ASTORE_1:
         i = new Instruction_Astore_1();
         break;
      case ASTORE_2:
         i = new Instruction_Astore_2();
         break;
      case ASTORE_3:
         i = new Instruction_Astore_3();
         break;
      case IINC:
         i = new Instruction_Iinc();
         break;
      case WIDE:
      {
         int nextIndex = (bc[index+1]) & 0xff;

         switch(nextIndex)
         {
            case ILOAD:
                i = new Instruction_Iload();
                break;

            case FLOAD:
                i = new Instruction_Fload();
                break;

            case ALOAD:
                i = new Instruction_Aload();
                break;

            case LLOAD:
                i = new Instruction_Lload();
                break;

            case DLOAD:
                i = new Instruction_Dload();
                break;

            case ISTORE:
                i = new Instruction_Istore();
                break;

            case FSTORE:
                i = new Instruction_Fstore();
                break;

            case ASTORE:
                i = new Instruction_Astore();
                break;

            case LSTORE:
                i = new Instruction_Lstore();
                break;

            case DSTORE:
                i = new Instruction_Dstore();
                break;

            case RET:
                i = new Instruction_Ret();
                break;

            case IINC:
                i = new Instruction_Iinc();
                break;

            default:
                throw new RuntimeException("invalid wide instruction: " + nextIndex);
         }

         ((Instruction_bytevar) i).isWide = true;
         isWide = true;
      }

        break;

      case NEWARRAY:
         i = new Instruction_Newarray();
         break;
      case ANEWARRAY:
         i = new Instruction_Anewarray();
         break;
      case MULTIANEWARRAY:
         i = new Instruction_Multianewarray();
         break;
      case ARRAYLENGTH:
         i = new Instruction_Arraylength();
         break;
      case IALOAD:
         i = new Instruction_Iaload();
         break;
      case LALOAD:
         i = new Instruction_Laload();
         break;
      case FALOAD:
         i = new Instruction_Faload();
         break;
      case DALOAD:
         i = new Instruction_Daload();
         break;
      case AALOAD:
         i = new Instruction_Aaload();
         break;
      case BALOAD:
         i = new Instruction_Baload();
         break;
      case CALOAD:
         i = new Instruction_Caload();
         break;
      case SALOAD:
         i = new Instruction_Saload();
         break;
      case IASTORE:
         i = new Instruction_Iastore();
         break;
      case LASTORE:
         i = new Instruction_Lastore();
         break;
      case FASTORE:
         i = new Instruction_Fastore();
         break;
      case DASTORE:
         i = new Instruction_Dastore();
         break;
      case AASTORE:
         i = new Instruction_Aastore();
         break;
      case BASTORE:
         i = new Instruction_Bastore();
         break;
      case CASTORE:
         i = new Instruction_Castore();
         break;
      case SASTORE:
         i = new Instruction_Sastore();
         break;
      case NOP:
         i = new Instruction_Nop();
         break;
      case POP:
         i = new Instruction_Pop();
         break;
      case POP2:
         i = new Instruction_Pop2();
         break;
      case DUP:
         i = new Instruction_Dup();
         break;
      case DUP2:
         i = new Instruction_Dup2();
         break;
      case DUP_X1:
         i = new Instruction_Dup_x1();
         break;
      case DUP_X2:
         i = new Instruction_Dup_x2();
         break;
      case DUP2_X1:
         i = new Instruction_Dup2_x1();
         break;
      case DUP2_X2:
         i = new Instruction_Dup2_x2();
         break;
      case SWAP:
         i = new Instruction_Swap();
         break;
      case IADD:
         i = new Instruction_Iadd();
         break;
      case LADD:
         i = new Instruction_Ladd();
         break;
      case FADD:
         i = new Instruction_Fadd();
         break;
      case DADD:
         i = new Instruction_Dadd();
         break;
      case ISUB:
         i = new Instruction_Isub();
         break;
      case LSUB:
         i = new Instruction_Lsub();
         break;
      case FSUB:
         i = new Instruction_Fsub();
         break;
      case DSUB:
         i = new Instruction_Dsub();
         break;
      case IMUL:
         i = new Instruction_Imul();
         break;
      case LMUL:
         i = new Instruction_Lmul();
         break;
      case FMUL:
         i = new Instruction_Fmul();
         break;
      case DMUL:
         i = new Instruction_Dmul();
         break;
      case IDIV:
         i = new Instruction_Idiv();
         break;
      case LDIV:
         i = new Instruction_Ldiv();
         break;
      case FDIV:
         i = new Instruction_Fdiv();
         break;
      case DDIV:
         i = new Instruction_Ddiv();
         break;
      case IREM:
         i = new Instruction_Irem();
         break;
      case LREM:
         i = new Instruction_Lrem();
         break;
      case FREM:
         i = new Instruction_Frem();
         break;
      case DREM:
         i = new Instruction_Drem();
         break;
      case INEG:
         i = new Instruction_Ineg();
         break;
      case LNEG:
         i = new Instruction_Lneg();
         break;
      case FNEG:
         i = new Instruction_Fneg();
         break;
      case DNEG:
         i = new Instruction_Dneg();
         break;
      case ISHL:
         i = new Instruction_Ishl();
         break;
      case ISHR:
         i = new Instruction_Ishr();
         break;
      case IUSHR:
         i = new Instruction_Iushr();
         break;
      case LSHL:
         i = new Instruction_Lshl();
         break;
      case LSHR:
         i = new Instruction_Lshr();
         break;
      case LUSHR:
         i = new Instruction_Lushr();
         break;
      case IAND:
         i = new Instruction_Iand();
         break;
      case LAND:
         i = new Instruction_Land();
         break;
      case IOR:
         i = new Instruction_Ior();
         break;
      case LOR:
         i = new Instruction_Lor();
         break;
      case IXOR:
         i = new Instruction_Ixor();
         break;
      case LXOR:
         i = new Instruction_Lxor();
         break;
      case I2L:
         i = new Instruction_I2l();
         break;
      case I2F:
         i = new Instruction_I2f();
         break;
      case I2D:
         i = new Instruction_I2d();
         break;
      case L2I:
         i = new Instruction_L2i();
         break;
      case L2F:
         i = new Instruction_L2f();
         break;
      case L2D:
         i = new Instruction_L2d();
         break;
      case F2I:
         i = new Instruction_F2i();
         break;
      case F2L:
         i = new Instruction_F2l();
         break;
      case F2D:
         i = new Instruction_F2d();
         break;
      case D2I:
         i = new Instruction_D2i();
         break;
      case D2L:
         i = new Instruction_D2l();
         break;
      case D2F:
         i = new Instruction_D2f();
         break;
      case INT2BYTE:
         i = new Instruction_Int2byte();
         break;
      case INT2CHAR:
         i = new Instruction_Int2char();
         break;
      case INT2SHORT:
         i = new Instruction_Int2short();
         break;
      case IFEQ:
         i = new Instruction_Ifeq();
         break;
      case IFNULL:
         i = new Instruction_Ifnull();
         break;
      case IFLT:
         i = new Instruction_Iflt();
         break;
      case IFLE:
         i = new Instruction_Ifle();
         break;
      case IFNE:
         i = new Instruction_Ifne();
         break;
      case IFNONNULL:
         i = new Instruction_Ifnonnull();
         break;
      case IFGT:
         i = new Instruction_Ifgt();
         break;
      case IFGE:
         i = new Instruction_Ifge();
         break;
      case IF_ICMPEQ:
         i = new Instruction_If_icmpeq();
         break;
      case IF_ICMPLT:
         i = new Instruction_If_icmplt();
         break;
      case IF_ICMPLE:
         i = new Instruction_If_icmple();
         break;
      case IF_ICMPNE:
         i = new Instruction_If_icmpne();
         break;
      case IF_ICMPGT:
         i = new Instruction_If_icmpgt();
         break;
      case IF_ICMPGE:
         i = new Instruction_If_icmpge();
         break;
      case LCMP:
         i = new Instruction_Lcmp();
         break;
      case FCMPL:
         i = new Instruction_Fcmpl();
         break;
      case FCMPG:
         i = new Instruction_Fcmpg();
         break;
      case DCMPL:
         i = new Instruction_Dcmpl();
         break;
      case DCMPG:
         i = new Instruction_Dcmpg();
         break;
      case IF_ACMPEQ:
         i = new Instruction_If_acmpeq();
         break;
      case IF_ACMPNE:
         i = new Instruction_If_acmpne();
         break;
      case GOTO:
         i = new Instruction_Goto();
         break;
      case GOTO_W:
         i = new Instruction_Goto_w();
         break;
      case JSR:
         i = new Instruction_Jsr();
         break;
      case JSR_W:
         i = new Instruction_Jsr_w();
         break;
      case RET:
         i = new Instruction_Ret();
         break;
      case RET_W:
         i = new Instruction_Ret_w();
         break;
      case RETURN:
         i = new Instruction_Return();
         break;
      case IRETURN:
         i = new Instruction_Ireturn();
         break;
      case LRETURN:
         i = new Instruction_Lreturn();
         break;
      case FRETURN:
         i = new Instruction_Freturn();
         break;
      case DRETURN:
         i = new Instruction_Dreturn();
         break;
      case ARETURN:
         i = new Instruction_Areturn();
         break;
      case BREAKPOINT:
         i = new Instruction_Breakpoint();
         break;
      case TABLESWITCH:
         i = (Instruction)new Instruction_Tableswitch();
         break;
      case LOOKUPSWITCH:
         i = (Instruction)new Instruction_Lookupswitch();
         break;
      case PUTFIELD:
         i = (Instruction)new Instruction_Putfield();
         break;
      case GETFIELD:
         i = (Instruction)new Instruction_Getfield();
         break;
      case PUTSTATIC:
         i = (Instruction)new Instruction_Putstatic();
         break;
      case GETSTATIC:
         i = (Instruction)new Instruction_Getstatic();
         break;
      case INVOKEVIRTUAL:
         i = (Instruction)new Instruction_Invokevirtual();
         break;
      case INVOKENONVIRTUAL:
         i = (Instruction)new Instruction_Invokenonvirtual();
         break;
      case INVOKESTATIC:
         i = (Instruction)new Instruction_Invokestatic();
         break;
      case INVOKEINTERFACE:
         i = (Instruction)new Instruction_Invokeinterface();
         break;
      case INVOKEDYNAMIC:
          i = (Instruction)new Instruction_Invokedynamic();
          break;
      case ATHROW:
         i = (Instruction)new Instruction_Athrow();
         break;
      case NEW:
         i = (Instruction)new Instruction_New();
         break;
      case CHECKCAST:
         i = (Instruction)new Instruction_Checkcast();
         break;
      case INSTANCEOF:
         i = (Instruction)new Instruction_Instanceof();
         break;
      case MONITORENTER:
         i = (Instruction)new Instruction_Monitorenter();
         break;
      case MONITOREXIT:
         i = (Instruction)new Instruction_Monitorexit();
         break;
      default:
         //int j;
         //j = ((int)b)&0xff;
         //G.v().out.println("Unknown instruction op=" + j +
         //                   " at offset " + index);
         i = (Instruction)new Instruction_Unknown(b);
         break;
      }

      i.label = index;

      if(isWide)
        i.parse(bc,index+2);
      else
        i.parse(bc,index+1);

      return i;
   }

   /** Given a list of Instructions, this method converts all offsets
    * to pointers.
    * @param insts list of instructions; labels must be accurate.
    * @see Instruction#offsetToPointer
    * @see ClassFile#parseMethod
    * @see ClassFile#relabel
    */
   public void build(Instruction insts) {
      Instruction i;
      i = insts;
      // find out how many instructions that is
      icount = 0;
      while (i != null) {
         icount++;
         i = i.next;
      }
      // build array of instructions
      if (icount>0) {
         instructions = new Instruction[icount];
         // and put the instructions into the array
         // identify targets of branch instructions. Why build an array
         // when we already have a list? In order to be able to locate
         // an instruction given its numeric label quickly.
         int k;
         k = 0;
         i = insts;
         while (i != null) {
            instructions[k] = i;
            k++;
            i = i.next;
         }

         // now convert all offsets to pointers
         i = insts;
         while (i!=null) {
            i.offsetToPointer(this);
            i = i.next;
         }
      }
   }

   /** Displays the code (in the form of Instructions) for the given list
    * of Instructions.
    * @param inst input list of instructions.
    * @param constant_pool constant pool of the ClassFile object.
    * @see ByteCode#showCode(Instruction, int, cp_info)
    */
   public static void showCode(Instruction inst,cp_info constant_pool[]) {
      showCode(inst,0,constant_pool);
   }
   /** Displays the code (in the form of Instructions) for the given list
    * of Instructions.
    * @param inst input list of instructions.
    * @param startinst index of the label of the instruction at which to begin.
    * @param constant_pool constant pool of the ClassFile object.
    * @see ByteCode#showCode(Instruction, cp_info)
    */
   public static void showCode(Instruction inst,int startinst,cp_info constant_pool[]) {
      int i;
      Instruction j = inst;
      String pref;
      i = startinst;
      while (j!=null) {
         if (i>999) pref = "";
         else if (i>99) pref = " ";
         else if (i>9) pref = "  ";
         else pref = "   ";
         G.v().out.print(pref + i + ": ");
         G.v().out.println(j.toString(constant_pool));
         i = j.nextOffset(i);
         j = j.next;
      }
   }

   /** Locates the Instruction in the list with the given label.
    * @param index label of desired instruction
    * @return Instruction object wiht that label, or null if not found.
    */
   // locates the instruction with an index value of the given
   public Instruction locateInst(int index) {
      return locateInstr(index,0,icount);
   }
   /** Performs a binary search of the instructions[] array. */
   private Instruction locateInstr(int index,int mini,int maxi) {
      int mid = (maxi-mini)/2 + mini;

      if (mini>maxi) return null;
      if (instructions[mid].label==index)
         return instructions[mid];
      if (instructions[mid].label > index)
         return locateInstr(index,mini,mid-1);
      return locateInstr(index,mid+1,maxi);
   }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy