in src/main/java/org/apache/bcel/generic/Instruction.java [79:395]
public static Instruction readInstruction(final ByteSequence bytes) throws IOException {
boolean wide = false;
short opcode = (short) bytes.readUnsignedByte();
Instruction obj = null;
if (opcode == Const.WIDE) { // Read next opcode after wide byte
wide = true;
opcode = (short) bytes.readUnsignedByte();
}
final Instruction instruction = InstructionConst.getInstruction(opcode);
if (instruction != null) {
return instruction; // Used predefined immutable object, if available
}
switch (opcode) {
case Const.BIPUSH:
obj = new BIPUSH();
break;
case Const.SIPUSH:
obj = new SIPUSH();
break;
case Const.LDC:
obj = new LDC();
break;
case Const.LDC_W:
obj = new LDC_W();
break;
case Const.LDC2_W:
obj = new LDC2_W();
break;
case Const.ILOAD:
obj = new ILOAD();
break;
case Const.LLOAD:
obj = new LLOAD();
break;
case Const.FLOAD:
obj = new FLOAD();
break;
case Const.DLOAD:
obj = new DLOAD();
break;
case Const.ALOAD:
obj = new ALOAD();
break;
case Const.ILOAD_0:
obj = new ILOAD(0);
break;
case Const.ILOAD_1:
obj = new ILOAD(1);
break;
case Const.ILOAD_2:
obj = new ILOAD(2);
break;
case Const.ILOAD_3:
obj = new ILOAD(3);
break;
case Const.LLOAD_0:
obj = new LLOAD(0);
break;
case Const.LLOAD_1:
obj = new LLOAD(1);
break;
case Const.LLOAD_2:
obj = new LLOAD(2);
break;
case Const.LLOAD_3:
obj = new LLOAD(3);
break;
case Const.FLOAD_0:
obj = new FLOAD(0);
break;
case Const.FLOAD_1:
obj = new FLOAD(1);
break;
case Const.FLOAD_2:
obj = new FLOAD(2);
break;
case Const.FLOAD_3:
obj = new FLOAD(3);
break;
case Const.DLOAD_0:
obj = new DLOAD(0);
break;
case Const.DLOAD_1:
obj = new DLOAD(1);
break;
case Const.DLOAD_2:
obj = new DLOAD(2);
break;
case Const.DLOAD_3:
obj = new DLOAD(3);
break;
case Const.ALOAD_0:
obj = new ALOAD(0);
break;
case Const.ALOAD_1:
obj = new ALOAD(1);
break;
case Const.ALOAD_2:
obj = new ALOAD(2);
break;
case Const.ALOAD_3:
obj = new ALOAD(3);
break;
case Const.ISTORE:
obj = new ISTORE();
break;
case Const.LSTORE:
obj = new LSTORE();
break;
case Const.FSTORE:
obj = new FSTORE();
break;
case Const.DSTORE:
obj = new DSTORE();
break;
case Const.ASTORE:
obj = new ASTORE();
break;
case Const.ISTORE_0:
obj = new ISTORE(0);
break;
case Const.ISTORE_1:
obj = new ISTORE(1);
break;
case Const.ISTORE_2:
obj = new ISTORE(2);
break;
case Const.ISTORE_3:
obj = new ISTORE(3);
break;
case Const.LSTORE_0:
obj = new LSTORE(0);
break;
case Const.LSTORE_1:
obj = new LSTORE(1);
break;
case Const.LSTORE_2:
obj = new LSTORE(2);
break;
case Const.LSTORE_3:
obj = new LSTORE(3);
break;
case Const.FSTORE_0:
obj = new FSTORE(0);
break;
case Const.FSTORE_1:
obj = new FSTORE(1);
break;
case Const.FSTORE_2:
obj = new FSTORE(2);
break;
case Const.FSTORE_3:
obj = new FSTORE(3);
break;
case Const.DSTORE_0:
obj = new DSTORE(0);
break;
case Const.DSTORE_1:
obj = new DSTORE(1);
break;
case Const.DSTORE_2:
obj = new DSTORE(2);
break;
case Const.DSTORE_3:
obj = new DSTORE(3);
break;
case Const.ASTORE_0:
obj = new ASTORE(0);
break;
case Const.ASTORE_1:
obj = new ASTORE(1);
break;
case Const.ASTORE_2:
obj = new ASTORE(2);
break;
case Const.ASTORE_3:
obj = new ASTORE(3);
break;
case Const.IINC:
obj = new IINC();
break;
case Const.IFEQ:
obj = new IFEQ();
break;
case Const.IFNE:
obj = new IFNE();
break;
case Const.IFLT:
obj = new IFLT();
break;
case Const.IFGE:
obj = new IFGE();
break;
case Const.IFGT:
obj = new IFGT();
break;
case Const.IFLE:
obj = new IFLE();
break;
case Const.IF_ICMPEQ:
obj = new IF_ICMPEQ();
break;
case Const.IF_ICMPNE:
obj = new IF_ICMPNE();
break;
case Const.IF_ICMPLT:
obj = new IF_ICMPLT();
break;
case Const.IF_ICMPGE:
obj = new IF_ICMPGE();
break;
case Const.IF_ICMPGT:
obj = new IF_ICMPGT();
break;
case Const.IF_ICMPLE:
obj = new IF_ICMPLE();
break;
case Const.IF_ACMPEQ:
obj = new IF_ACMPEQ();
break;
case Const.IF_ACMPNE:
obj = new IF_ACMPNE();
break;
case Const.GOTO:
obj = new GOTO();
break;
case Const.JSR:
obj = new JSR();
break;
case Const.RET:
obj = new RET();
break;
case Const.TABLESWITCH:
obj = new TABLESWITCH();
break;
case Const.LOOKUPSWITCH:
obj = new LOOKUPSWITCH();
break;
case Const.GETSTATIC:
obj = new GETSTATIC();
break;
case Const.PUTSTATIC:
obj = new PUTSTATIC();
break;
case Const.GETFIELD:
obj = new GETFIELD();
break;
case Const.PUTFIELD:
obj = new PUTFIELD();
break;
case Const.INVOKEVIRTUAL:
obj = new INVOKEVIRTUAL();
break;
case Const.INVOKESPECIAL:
obj = new INVOKESPECIAL();
break;
case Const.INVOKESTATIC:
obj = new INVOKESTATIC();
break;
case Const.INVOKEINTERFACE:
obj = new INVOKEINTERFACE();
break;
case Const.INVOKEDYNAMIC:
obj = new INVOKEDYNAMIC();
break;
case Const.NEW:
obj = new NEW();
break;
case Const.NEWARRAY:
obj = new NEWARRAY();
break;
case Const.ANEWARRAY:
obj = new ANEWARRAY();
break;
case Const.CHECKCAST:
obj = new CHECKCAST();
break;
case Const.INSTANCEOF:
obj = new INSTANCEOF();
break;
case Const.MULTIANEWARRAY:
obj = new MULTIANEWARRAY();
break;
case Const.IFNULL:
obj = new IFNULL();
break;
case Const.IFNONNULL:
obj = new IFNONNULL();
break;
case Const.GOTO_W:
obj = new GOTO_W();
break;
case Const.JSR_W:
obj = new JSR_W();
break;
case Const.BREAKPOINT:
obj = new BREAKPOINT();
break;
case Const.IMPDEP1:
obj = new IMPDEP1();
break;
case Const.IMPDEP2:
obj = new IMPDEP2();
break;
default:
throw new ClassGenException("Illegal opcode detected: " + opcode);
}
if (wide && !(obj instanceof LocalVariableInstruction || obj instanceof RET)) {
throw new ClassGenException("Illegal opcode after wide: " + opcode);
}
obj.setOpcode(opcode);
obj.initFromFile(bytes, wide); // Do further initializations, if any
return obj;
}