org.aspectj.apache.bcel.generic
Class InstructionSelect

java.lang.Object
  extended by org.aspectj.apache.bcel.generic.Instruction
      extended by org.aspectj.apache.bcel.generic.InstructionBranch
          extended by org.aspectj.apache.bcel.generic.InstructionSelect
All Implemented Interfaces:
java.io.Serializable, java.lang.Cloneable, Constants, InstructionTargeter
Direct Known Subclasses:
LOOKUPSWITCH, TABLESWITCH

public abstract class InstructionSelect
extends InstructionBranch

Select - Abstract super class for LOOKUPSWITCH and TABLESWITCH instructions.

See Also:
LOOKUPSWITCH, TABLESWITCH, InstructionList, Serialized Form

Field Summary
protected  int fixedLength
           
protected  int[] indices
           
protected  short length
           
protected  int[] match
           
protected  int matchLength
           
protected  int padding
           
protected  InstructionHandle[] targets
           
 
Fields inherited from class org.aspectj.apache.bcel.generic.InstructionBranch
positionOfThisInstruction, targetIndex, targetInstruction
 
Fields inherited from class org.aspectj.apache.bcel.generic.Instruction
opcode
 
Fields inherited from interface org.aspectj.apache.bcel.Constants
_unused, AALOAD, AASTORE, ACC_ABSTRACT, ACC_ANNOTATION, ACC_BRIDGE, ACC_ENUM, ACC_FINAL, ACC_INTERFACE, ACC_NATIVE, ACC_PRIVATE, ACC_PROTECTED, ACC_PUBLIC, ACC_STATIC, ACC_STRICT, ACC_SUPER, ACC_SYNCHRONIZED, ACC_TRANSIENT, ACC_VARARGS, ACC_VOLATILE, ACCESS_NAMES, ACONST_NULL, ALOAD, ALOAD_0, ALOAD_1, ALOAD_2, ALOAD_3, ANEWARRAY, ANEWARRAY_QUICK, ARETURN, ARRAYLENGTH, ASTORE, ASTORE_0, ASTORE_1, ASTORE_2, ASTORE_3, ATHROW, ATTR_ANNOTATION_DEFAULT, ATTR_BOOTSTRAPMETHODS, ATTR_CODE, ATTR_CONSTANT_VALUE, ATTR_DEPRECATED, ATTR_ENCLOSING_METHOD, ATTR_EXCEPTIONS, ATTR_INNER_CLASSES, ATTR_LINE_NUMBER_TABLE, ATTR_LOCAL_VARIABLE_TABLE, ATTR_LOCAL_VARIABLE_TYPE_TABLE, ATTR_PMG, ATTR_RUNTIME_INVISIBLE_ANNOTATIONS, ATTR_RUNTIME_INVISIBLE_PARAMETER_ANNOTATIONS, ATTR_RUNTIME_VISIBLE_ANNOTATIONS, ATTR_RUNTIME_VISIBLE_PARAMETER_ANNOTATIONS, ATTR_SIGNATURE, ATTR_SOURCE_FILE, ATTR_STACK_MAP, ATTR_SYNTHETIC, ATTR_UNKNOWN, ATTRIBUTE_NAMES, BALOAD, BASTORE, BIPUSH, BRANCH_INSTRUCTION, BREAKPOINT, CALOAD, CASTORE, CHECKCAST, CHECKCAST_QUICK, CLASS_TYPE_NAMES, CONSTANT_Class, CONSTANT_Double, CONSTANT_Fieldref, CONSTANT_Float, CONSTANT_INST, CONSTANT_Integer, CONSTANT_InterfaceMethodref, CONSTANT_InvokeDynamic, CONSTANT_Long, CONSTANT_MethodHandle, CONSTANT_Methodref, CONSTANT_MethodType, CONSTANT_NameAndType, CONSTANT_NAMES, CONSTANT_String, CONSTANT_Utf8, CONSTRUCTOR_NAME, CONSUME_STACK, CP_INST, D2F, D2I, D2L, DADD, DALOAD, DASTORE, DCMPG, DCMPL, DCONST_0, DCONST_1, DDIV, DLOAD, DLOAD_0, DLOAD_1, DLOAD_2, DLOAD_3, DMUL, DNEG, DREM, DRETURN, DSTORE, DSTORE_0, DSTORE_1, DSTORE_2, DSTORE_3, DSUB, DUP, DUP_X1, DUP_X2, DUP2, DUP2_X1, DUP2_X2, EXCEPTION_THROWER, F2D, F2I, F2L, FADD, FALOAD, FASTORE, FCMPG, FCMPL, FCONST_0, FCONST_1, FCONST_2, FDIV, FLOAD, FLOAD_0, FLOAD_1, FLOAD_2, FLOAD_3, FMUL, FNEG, FREM, FRETURN, FSTORE, FSTORE_0, FSTORE_1, FSTORE_2, FSTORE_3, FSUB, GETFIELD, GETFIELD_QUICK, GETFIELD_QUICK_W, GETFIELD2_QUICK, GETSTATIC, GETSTATIC_QUICK, GETSTATIC2_QUICK, GOTO, GOTO_W, I2B, I2C, I2D, I2F, I2L, I2S, IADD, IALOAD, IAND, IASTORE, ICONST_0, ICONST_1, ICONST_2, ICONST_3, ICONST_4, ICONST_5, ICONST_M1, IDIV, IF_ACMPEQ, IF_ACMPNE, IF_ICMPEQ, IF_ICMPGE, IF_ICMPGT, IF_ICMPLE, IF_ICMPLT, IF_ICMPNE, IF_INST, IFEQ, IFGE, IFGT, IFLE, IFLT, IFNE, IFNONNULL, IFNULL, IINC, iLen, ILLEGAL_OPCODE, ILLEGAL_TYPE, ILOAD, ILOAD_0, ILOAD_1, ILOAD_2, ILOAD_3, IMPDEP1, IMPDEP2, IMUL, INDEXED, INEG, INSTANCEOF, INSTANCEOF_QUICK, instExcs, instFlags, INT2BYTE, INT2CHAR, INT2SHORT, INTERFACES_IMPLEMENTED_BY_ARRAYS, INVOKEDYNAMIC, INVOKEINTERFACE, INVOKEINTERFACE_QUICK, INVOKENONVIRTUAL, INVOKENONVIRTUAL_QUICK, INVOKESPECIAL, INVOKESTATIC, INVOKESTATIC_QUICK, INVOKESUPER_QUICK, INVOKEVIRTUAL, INVOKEVIRTUAL_QUICK, INVOKEVIRTUAL_QUICK_W, INVOKEVIRTUALOBJECT_QUICK, IOR, IREM, IRETURN, ISHL, ISHR, ISTORE, ISTORE_0, ISTORE_1, ISTORE_2, ISTORE_3, ISUB, ITEM_Bogus, ITEM_Double, ITEM_Float, ITEM_InitObject, ITEM_Integer, ITEM_Long, ITEM_NAMES, ITEM_NewObject, ITEM_Null, ITEM_Object, IUSHR, IXOR, JSR, JSR_INSTRUCTION, JSR_W, KNOWN_ATTRIBUTES, L2D, L2F, L2I, LADD, LALOAD, LAND, LASTORE, LCMP, LCONST_0, LCONST_1, LDC, LDC_QUICK, LDC_W, LDC_W_QUICK, LDC2_W, LDC2_W_QUICK, LDIV, LLOAD, LLOAD_0, LLOAD_1, LLOAD_2, LLOAD_3, LMUL, LNEG, LOAD_INST, LOADCLASS_INST, LOOKUPSWITCH, LOR, LREM, LRETURN, LSHL, LSHR, LSTORE, LSTORE_0, LSTORE_1, LSTORE_2, LSTORE_3, LSUB, LUSHR, LV_INST, LXOR, MAJOR, MAJOR_1_1, MAJOR_1_2, MAJOR_1_3, MAJOR_1_4, MAJOR_1_5, MAJOR_1_6, MAX_ACC_FLAG, MAX_BYTE, MAX_CODE_SIZE, MAX_CP_ENTRIES, MAX_SHORT, MINOR, MINOR_1_1, MINOR_1_2, MINOR_1_3, MINOR_1_4, MINOR_1_5, MINOR_1_6, MONITORENTER, MONITOREXIT, MULTIANEWARRAY, MULTIANEWARRAY_QUICK, NEGATABLE, NEW, NEW_QUICK, NEWARRAY, NOP, OPCODE_NAMES, POP, POP_INST, POP2, PUSH, PUSH_INST, PUTFIELD, PUTFIELD_QUICK, PUTFIELD_QUICK_W, PUTFIELD2_QUICK, PUTSTATIC, PUTSTATIC_QUICK, PUTSTATIC2_QUICK, RESERVED, RET, RET_INST, RETURN, SALOAD, SASTORE, SHORT_TYPE_NAMES, SIPUSH, STACK_INST, stackEntriesProduced, STATIC_INITIALIZER_NAME, STORE_INST, SWAP, SWITCH, T_ADDRESS, T_ARRAY, T_BOOLEAN, T_BYTE, T_CHAR, T_DOUBLE, T_FLOAT, T_INT, T_LONG, T_OBJECT, T_REFERENCE, T_SHORT, T_UNKNOWN, T_VOID, TABLESWITCH, TARGETER_INSTRUCTION, TYPE_NAMES, TYPE_OF_OPERANDS, types, UNDEFINED, UNDEFINED_LENGTH, UNPREDICTABLE, VARIABLE_LENGTH, WIDE
 
Constructor Summary
InstructionSelect(short opcode, ByteSequence bytes)
           
 
Method Summary
 boolean containsTarget(InstructionHandle ih)
           
 void dump(java.io.DataOutputStream out)
          Dump instruction as byte code to stream out.
 boolean equals(java.lang.Object other)
          Only equal if they are the same branch instruction - otherwise too risky as the targets may only temporarily be pointing at the same destination.
 int[] getIndices()
           
 int getLength()
           
 int[] getMatchs()
           
protected  int getTargetOffset(InstructionHandle target)
           
 InstructionHandle[] getTargets()
           
 int hashCode()
           
 void setTarget(int i, InstructionHandle target)
          Set branch target for `i'th case
 java.lang.String toString(boolean verbose)
          Long output format:
protected  int updatePosition(int offset, int max_offset)
          Since this is a variable length instruction, it may shift the following instructions which then need to update their position.
 void updateTarget(InstructionHandle old_ih, InstructionHandle new_ih)
          Update the target destination for this instruction.
 
Methods inherited from class org.aspectj.apache.bcel.generic.InstructionBranch
getIndex, getTarget, getTargetOffset, getType, isIfInstruction, physicalSuccessor, setTarget
 
Methods inherited from class org.aspectj.apache.bcel.generic.Instruction
consumeStack, copy, getLoadClassType, getName, getOpcode, getType, getValue, getValue, isALOAD, isArrayCreationInstruction, isASTORE, isConstantInstruction, isConstantPoolInstruction, isIndexedInstruction, isJsrInstruction, isLoadInstruction, isLocalVariableInstruction, isReturnInstruction, isStackConsumer, isStackProducer, isStoreInstruction, produceStack, readInstruction, setIndex, toString
 
Methods inherited from class java.lang.Object
clone, finalize, getClass, notify, notifyAll, wait, wait, wait
 

Field Detail

match

protected int[] match

indices

protected int[] indices

targets

protected InstructionHandle[] targets

fixedLength

protected int fixedLength

matchLength

protected int matchLength

padding

protected int padding

length

protected short length
Constructor Detail

InstructionSelect

public InstructionSelect(short opcode,
                         ByteSequence bytes)
                  throws java.io.IOException
Throws:
java.io.IOException
Method Detail

getTargetOffset

protected int getTargetOffset(InstructionHandle target)

updatePosition

protected int updatePosition(int offset,
                             int max_offset)
Since this is a variable length instruction, it may shift the following instructions which then need to update their position. Called by InstructionList.setPositions when setting the position for every instruction. In the presence of variable length instructions `setPositions' performs multiple passes over the instruction list to calculate the correct (byte) positions and offsets by calling this function.

Overrides:
updatePosition in class InstructionBranch
Parameters:
offset - additional offset caused by preceding (variable length) instructions
max_offset - the maximum offset that may be caused by these instructions
Returns:
additional offset caused by possible change of this instruction's length

dump

public void dump(java.io.DataOutputStream out)
          throws java.io.IOException
Dump instruction as byte code to stream out.

Overrides:
dump in class InstructionBranch
Parameters:
out - Output stream
Throws:
java.io.IOException

toString

public java.lang.String toString(boolean verbose)
Description copied from class: InstructionBranch
Long output format:

Overrides:
toString in class InstructionBranch
Parameters:
verbose - long/short format switch
Returns:
mnemonic for instruction

setTarget

public void setTarget(int i,
                      InstructionHandle target)
Set branch target for `i'th case


updateTarget

public void updateTarget(InstructionHandle old_ih,
                         InstructionHandle new_ih)
Description copied from class: InstructionBranch
Update the target destination for this instruction. If an oldHandle is provided it is checked to verify that is where the target currently points to before changing it.

Specified by:
updateTarget in interface InstructionTargeter
Overrides:
updateTarget in class InstructionBranch
Parameters:
old_ih - old target
new_ih - new target

containsTarget

public boolean containsTarget(InstructionHandle ih)
Specified by:
containsTarget in interface InstructionTargeter
Overrides:
containsTarget in class InstructionBranch
Returns:
true, if ih is target of this instruction

getMatchs

public int[] getMatchs()
Returns:
array of match indices

getIndices

public int[] getIndices()
Returns:
array of match target offsets

equals

public boolean equals(java.lang.Object other)
Description copied from class: InstructionBranch
Only equal if they are the same branch instruction - otherwise too risky as the targets may only temporarily be pointing at the same destination.

Overrides:
equals in class InstructionBranch

hashCode

public int hashCode()
Overrides:
hashCode in class InstructionBranch

getTargets

public InstructionHandle[] getTargets()
Returns:
array of match targets

getLength

public int getLength()
Overrides:
getLength in class Instruction