⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jvmbytecodesdebug.jrag

📁 JDK1.4编译器后端
💻 JRAG
📖 第 1 页 / 共 3 页
字号:
                  }                  break;        case LOOKUPSWITCH:                   {                    int db = ((index + 4) / 4) * 4; // Align-4, step to defaultbytes                    int val = fourByteToInt(codes, db);                    db+=4;                    res = "defaultbytes:" + val;                    int npairs = fourByteToInt(codes, db);                    db+=4;                    res += ", npairs:" + npairs;                    for(int i = 0; i < npairs; i++)                      res += "\n\t" + "match:" + fourByteToInt(codes, db + i * 8) + ", offset:" + fourByteToInt(codes, db + i * 8 + 4);                  }                  break;        case IRETURN: break;        case LRETURN: break;        case FRETURN: break;        case DRETURN: break;        case ARETURN: break;        case RETURN: break;        case GETSTATIC: res = getCharOperand(codes, index+1);break;        case PUTSTATIC: res = getCharOperand(codes, index+1);break;        case GETFIELD: res = getCharOperand(codes, index+1);break;        case PUTFIELD: res = getCharOperand(codes, index+1);break;        case INVOKEVIRTUAL: res = getCharOperand(codes, index+1);break;        case INVOKESPECIAL: res = getCharOperand(codes, index+1);break;        case INVOKESTATIC: res = getCharOperand(codes, index+1);break;        case INVOKEINTERFACE: res = getCharOperand(codes, index+1)+" "+getByteOperand(codes, index+3);break;        case NEW: res = getCharOperand(codes, index+1);break;        case NEWARRAY: res = getByteOperand(codes, index+1);break;        case ANEWARRAY: res = getCharOperand(codes, index+1);break;        case ARRAYLENGTH: break;        case ATHROW: break;        case CHECKCAST: res = getCharOperand(codes, index+1);;break;        case INSTANCEOF: res = getCharOperand(codes, index+1);;break;        case MONITORENTER: break;        case MONITOREXIT: break;        case WIDE: res = "XXX";break;        case MULTIANEWARRAY: res = getCharOperand(codes, index+1)+" "+getByteOperand(codes, index+3);break;        case IFNULL: res = getCharOperand(codes, index+1);break;        case IFNONNULL: res = getCharOperand(codes, index+1);break;        case GOTO_W: res = getIntOperand(codes, index+1);break;        case JSR_W: res = getIntOperand(codes, index+1);break;        case BREAKPOINT: break;        case IMPDEP1: break;        case IMPDEP2: break;        default: res = "<UNKNOWN BYTECODE:"+codes[index]+">";      }      return res;    }    public static int fourByteToInt(byte[] codes, int pos) {      int b1 = (int)codes[pos + 0];      int b2 = (int)codes[pos + 1];      int b3 = (int)codes[pos + 2];      int b4 = (int)codes[pos + 3];      int val = b1 << 24 | b2 << 16 | b3 << 8 | b4;       return val;     }    public static int stepBytecode(byte[] codes, int index)    {      int res = 0;      switch (codes[index]) {        case NOP:res++;break;        case ACONST_NULL:res++;break;        case LDC2_W:        case LDC_W:res+=3;break;        case LDC:res+=2;break;        case DCONST_0:        case DCONST_1:        case LCONST_0:        case LCONST_1:res++;break;        case BIPUSH:res+=2;break;        case SIPUSH:res+=3;break;        case FCONST_1:        case FCONST_2:        case FCONST_0:        case ICONST_M1:        case ICONST_0:        case ICONST_1:        case ICONST_2:        case ICONST_3:        case ICONST_4:        case ICONST_5:res++;break;        case FALOAD:        case BALOAD:        case CALOAD:        case SALOAD:        case IALOAD:res++;break;        case DALOAD:        case LALOAD:res++;break;        case AALOAD:res++;break;        case FLOAD:        case FSTORE:        case ILOAD:        case ISTORE:res+=2;break;        case FLOAD_0:        case FSTORE_0:        case ILOAD_0:        case ISTORE_0:res++;break;        case FLOAD_1:        case FSTORE_1:        case ILOAD_1:        case ISTORE_1:res++;break;        case FLOAD_2:        case FSTORE_2:        case ILOAD_2:        case ISTORE_2:res++;break;        case FLOAD_3:        case FSTORE_3:        case ILOAD_3:        case ISTORE_3:res++;break;        case DLOAD:        case DSTORE:        case LLOAD:        case LSTORE:res+=2;break;        case DLOAD_0:        case DSTORE_0:        case LLOAD_0:        case LSTORE_0:res++;break;        case DLOAD_1:        case DSTORE_1:        case LLOAD_1:        case LSTORE_1:res++;break;        case DLOAD_2:        case DSTORE_2:        case LLOAD_2:        case LSTORE_2:res++;break;        case DLOAD_3:        case DSTORE_3:        case LLOAD_3:        case LSTORE_3:res++;break;        case ALOAD:        case ASTORE:res+=2;break;        case ALOAD_0:        case ASTORE_0:res++;break;        case ALOAD_1:        case ASTORE_1:res++;break;        case ALOAD_2:        case ASTORE_2:res++;break;        case ALOAD_3:        case ASTORE_3:res++;break;        case FASTORE:        case IASTORE:res++;break;        case DASTORE:        case LASTORE:res++;break;        case AASTORE:res++;break;        case BASTORE:res++;break;        case CASTORE:        case SASTORE:res++;break;        case POP:res++;break;        case POP2:res++;break;        case DUP:res++;break;        case DUP_X1:res++;break;        case DUP_X2:res++;break;        case DUP2:res++;break;        case DUP2_X1:res++;break;        case DUP2_X2:res++;break;        case SWAP:res++;break;        case IADD:res++;break;        case FADD:res++;break;        case DADD:res++;break;        case LADD:res++;break;        case ISUB:res++;break;        case FSUB:res++;break;        case DSUB:res++;break;        case LSUB:res++;break;        case IMUL:res++;break;        case LMUL:res++;break;        case DMUL:res++;break;        case FMUL:res++;break;        case IDIV:res++;break;        case LDIV:res++;break;        case DDIV:res++;break;        case FDIV:res++;break;        case IREM:res++;break;        case LREM:res++;break;        case DREM:res++;break;        case FREM:res++;break;        case INEG:res++;break;        case LNEG:res++;break;        case DNEG:res++;break;        case FNEG:res++;break;        case ISHL:res++;break;        case LSHL:res++;break;        case ISHR:res++;break;        case LSHR:res++;break;        case IUSHR:res++;break;        case LUSHR:res++;break;        case IAND:res++;break;        case LAND:res++;break;        case IOR:res++;break;        case LOR:res++;break;        case IXOR:res++;break;        case LXOR:res++;break;        case IINC:res+=3;break;        case I2L:res++;break;        case I2F:res++;break;        case I2D:res++;break;        case L2I:res++;break;        case L2F:res++;break;        case L2D:res++;break;        case F2I:res++;break;        case F2L:res++;break;        case F2D:res++;break;        case D2I:res++;break;        case D2L:res++;break;        case D2F:res++;break;        case I2B:res++;break;        case I2C:res++;break;        case I2S:res++;break;        case LCMP:res++;break;        case FCMPL:res++;break;        case FCMPG:res++;break;        case DCMPL:res++;break;        case DCMPG:res++;break;        case IFEQ:res+=3;break;        case IFNE:res+=3;break;        case IFLT:res+=3;break;        case IFGE:res+=3;break;        case IFGT:res+=3;break;        case IFLE:res+=3;break;        case IF_ICMPEQ:res+=3;break;        case IF_ICMPNE:res+=3;break;        case IF_ICMPLT:res+=3;break;        case IF_ICMPGE:res+=3;break;        case IF_ICMPGT:res+=3;break;        case IF_ICMPLE:res+=3;break;        case IF_ACMPEQ:res+=3;break;        case IF_ACMPNE:res+=3;break;        case GOTO:res+=3;break;        case JSR:res+=3;break;        case RET:res+=2;break;        case TABLESWITCH:                 {                   int db = ((index + 4) / 4) * 4; // Align-4, step to defaultbytes                   db += 4;                   int low = fourByteToInt(codes, db);                   db += 4;                   int high = fourByteToInt(codes, db);                   db += 4;                   db += (high-low+1)*4;                   res = db;                 }                 break;        case LOOKUPSWITCH:                 {                   int db = ((index + 4) / 4) * 4; // Align-4, step to defaultbytes                   db += 4;                   int np = fourByteToInt(codes, db);                   db += 4;                   db += np * 8;                   res = db;                 }                 break;        case FRETURN:        case IRETURN:res++;break;        case LRETURN:        case DRETURN:res++;break;        case ARETURN:res++;break;        case RETURN:res++;break;        case GETSTATIC:        case PUTSTATIC:        case GETFIELD:        case PUTFIELD:res+=3;break;        case INVOKEVIRTUAL:res+=3;break;        case INVOKESPECIAL:res+=3;break;        case INVOKESTATIC:res+=3;break;        case INVOKEINTERFACE:res+=5;break;        case NEW:res+=3; break;        case NEWARRAY:res+=2;break;        case ANEWARRAY:res+=3;break;        case ARRAYLENGTH:res++;break;        case ATHROW:res++;break;        case CHECKCAST:res+=3;break;        case INSTANCEOF:res+=3;break;        case MONITORENTER:res++;break;        case MONITOREXIT:res++;break;        case WIDE:                         switch (codes[index+1])                         {                           case ILOAD:res+=4;break;                           case FLOAD:res+=4;break;                           case ALOAD:res+=4;break;                           case LLOAD:res+=4;break;                           case DLOAD:res+=4;break;                           case ISTORE:res+=4;break;                           case FSTORE:res+=4;break;                           case ASTORE:res+=4;break;                           case LSTORE:res+=4;break;                           case DSTORE:res+=4;break;                           case RET:res+=4;break;                           case IINC:res+=6;break;                           default:System.err.println("ERROR_INVALID_OPCODE in stepBytecode (wide)");break;                         }                         break;        case MULTIANEWARRAY:res+=4;break;        case IFNULL:res+=3;break;        case IFNONNULL:res+=3;break;        case GOTO_W:res+=5;break;        case JSR_W:res+=5;break;                   //        case BREAKPOINT: res++;break;                   //        case IMPDEP1: res++;break;                   //        case IMPDEP2: res++;break;        default:res++;System.err.println("INVALID BYTECODE " + codes[index] + " IN stepBytecode");      }      return res;    }    public static void printBytecode(PrintStream p, byte[] codes, int index) {      p.print(toString(codes[index])+" "+getOperands(codes, index));    }     public static void printBytecodes(PrintStream p, byte[] codes) {      for (int i=0,cnt=1; i<codes.length; i+=stepBytecode(codes,i),cnt++) {        p.print("\t"+i+"\t"+cnt+"\t");        printBytecode(p, codes, i);        p.println();      }    }    public static void appendBytecodes(StringBuffer p, byte[] codes) {      for(int i = 0, cnt = 1; i < codes.length; i += stepBytecode(codes,i), cnt++) {        p.append(" " + i + " " + cnt + "\t");        p.append(toString(codes[i])+" "+getOperands(codes, i));        p.append("\n");      }    }  }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -