at.dms.classfile
Class SwitchInstruction

java.lang.Object
  |
  +--at.dms.classfile.AbstractInstructionAccessor
        |
        +--at.dms.classfile.Instruction
              |
              +--at.dms.classfile.SwitchInstruction
All Implemented Interfaces:
AccessorContainer, Constants, InstructionAccessor

public class SwitchInstruction
extends Instruction
implements AccessorContainer

Complex switch instruction. This class decides whether to use the lookupswitch or tableswitch opcode.

Some instructions are perniticky enough that its simpler to write them separately instead of smushing them with all the rest. The Switch Intstruction is one of them.


Fields inherited from interface at.dms.classfile.Constants
ACC_ABSTRACT, ACC_FINAL, ACC_INTERFACE, ACC_NATIVE, ACC_NBR_FLAGS, ACC_PRIVATE, ACC_PROTECTED, ACC_PUBLIC, ACC_STATIC, ACC_STRICT, ACC_SUPER, ACC_SYNCHRONIZED, ACC_TRANSIENT, ACC_VOLATILE, ATT_CODE, ATT_CONSTANTVALUE, ATT_DEPRECATED, ATT_EXCEPTIONS, ATT_GENERIC, ATT_INNERCLASSES, ATT_LINENUMBERTABLE, ATT_LOCALVARIABLETABLE, ATT_SOURCEFILE, ATT_SYNTHETIC, CST_CLASS, CST_DOUBLE, CST_FIELD, CST_FLOAT, CST_INTEGER, CST_INTERFACEMETHOD, CST_LONG, CST_METHOD, CST_NAMEANDTYPE, CST_STRING, CST_UTF8, ENV_DEBUG_MODE, ENV_USE_CACHE, JAVA_MAGIC, JAVA_MAJOR, JAVA_MINOR, MAX_CODE_PER_METHOD, opc_aaload, opc_aastore, opc_aconst_null, opc_aload, opc_aload_0, opc_aload_1, opc_aload_2, opc_aload_3, opc_anewarray, opc_areturn, opc_arraylength, opc_astore, opc_astore_0, opc_astore_1, opc_astore_2, opc_astore_3, opc_athrow, opc_baload, opc_bastore, opc_bipush, opc_caload, opc_castore, opc_checkcast, opc_d2f, opc_d2i, opc_d2l, opc_dadd, opc_daload, opc_dastore, opc_dcmpg, opc_dcmpl, opc_dconst_0, opc_dconst_1, opc_ddiv, opc_dload, opc_dload_0, opc_dload_1, opc_dload_2, opc_dload_3, opc_dmul, opc_dneg, opc_drem, opc_dreturn, opc_dstore, opc_dstore_0, opc_dstore_1, opc_dstore_2, opc_dstore_3, opc_dsub, opc_dup, opc_dup_x1, opc_dup_x2, opc_dup2, opc_dup2_x1, opc_dup2_x2, opc_f2d, opc_f2i, opc_f2l, opc_fadd, opc_faload, opc_fastore, opc_fcmpg, opc_fcmpl, opc_fconst_0, opc_fconst_1, opc_fconst_2, opc_fdiv, opc_fload, opc_fload_0, opc_fload_1, opc_fload_2, opc_fload_3, opc_fmul, opc_fneg, opc_frem, opc_freturn, opc_fstore, opc_fstore_0, opc_fstore_1, opc_fstore_2, opc_fstore_3, opc_fsub, opc_getfield, opc_getstatic, opc_goto, opc_goto_w, opc_i2b, opc_i2c, opc_i2d, opc_i2f, opc_i2l, opc_i2s, opc_iadd, opc_iaload, opc_iand, opc_iastore, opc_iconst_0, opc_iconst_1, opc_iconst_2, opc_iconst_3, opc_iconst_4, opc_iconst_5, opc_iconst_m1, opc_idiv, opc_if_acmpeq, opc_if_acmpne, opc_if_icmpeq, opc_if_icmpge, opc_if_icmpgt, opc_if_icmple, opc_if_icmplt, opc_if_icmpne, opc_ifeq, opc_ifge, opc_ifgt, opc_ifle, opc_iflt, opc_ifne, opc_ifnonnull, opc_ifnull, opc_iinc, opc_iload, opc_iload_0, opc_iload_1, opc_iload_2, opc_iload_3, opc_imul, opc_ineg, opc_instanceof, opc_invokeinterface, opc_invokespecial, opc_invokestatic, opc_invokevirtual, opc_ior, opc_irem, opc_ireturn, opc_ishl, opc_ishr, opc_istore, opc_istore_0, opc_istore_1, opc_istore_2, opc_istore_3, opc_isub, opc_iushr, opc_ixor, opc_jsr, opc_jsr_w, opc_l2d, opc_l2f, opc_l2i, opc_ladd, opc_laload, opc_land, opc_lastore, opc_lcmp, opc_lconst_0, opc_lconst_1, opc_ldc, opc_ldc_w, opc_ldc2_w, opc_ldiv, opc_lload, opc_lload_0, opc_lload_1, opc_lload_2, opc_lload_3, opc_lmul, opc_lneg, opc_lookupswitch, opc_lor, opc_lrem, opc_lreturn, opc_lshl, opc_lshr, opc_lstore, opc_lstore_0, opc_lstore_1, opc_lstore_2, opc_lstore_3, opc_lsub, opc_lushr, opc_lxor, opc_monitorenter, opc_monitorexit, opc_multianewarray, opc_new, opc_newarray, opc_nop, opc_pop, opc_pop2, opc_putfield, opc_putstatic, opc_ret, opc_return, opc_saload, opc_sastore, opc_sipush, opc_swap, opc_tableswitch, opc_wide, opc_xxxunusedxxx, POO_ASCII_CONSTANT, POO_CLASS_CONSTANT, POO_DOUBLE_CONSTANT, POO_FLOAT_CONSTANT, POO_INTEGER_CONSTANT, POO_LONG_CONSTANT, POO_NAT_CONSTANT, POO_REF_CONSTANT, POO_STRING_CONSTANT, TYP_ADDRESS, TYP_DOUBLE, TYP_FLOAT, TYP_INT, TYP_LONG, TYP_REFERENCE, TYP_VOID
 
Constructor Summary
SwitchInstruction(InstructionAccessor defaultTarget, int[] matches, InstructionAccessor[] targets)
          Constructs a switch instruction.
SwitchInstruction(InstructionAccessor defaultTarget, java.util.List matches, java.util.List targets)
          Constructs a switch instruction.
 
Method Summary
 boolean canComplete()
          Returns true iff control flow can reach the next instruction in textual order.
(package private)  void check(CodeEnv env, int curStack)
          Verifies the enclosed instruction and computes the stack height.
(package private)  void computeEndAddress(CodePosition position)
          Computes the address of the end of the instruction.
 int getMatch(int position)
          Returns the case label's value at the specified position in the list of cases.
 int getPushedOnStack()
          Returns the size of data pushed on the stack by this instruction.
 byte getReturnType()
          Returns the type pushed on the stack.
(package private)  int getSize()
          Returns the number of bytes used by the the instruction in the code array.
 int getStack()
          Return the amount of stack (positive or negative) used by this instruction.
 int getSwitchCount()
          Gets the number of 'case' labels.
 InstructionAccessor getTarget(int position)
          Returns the target of the specified position in the list of cases.
(package private)  void resolveConstants(ConstantPool cp)
          Insert or check location of constant value on constant pool.
 void selectSwitchType()
          Select the appropriate switch type.
 void setTarget(InstructionAccessor target, int position)
          Sets the target for this instruction.
 void setTarget(int position, InstructionAccessor accessor)
          Sets the target of the specified position in the list of cases.
 void transformAccessors(AccessorTransformer transformer)
          Transforms targets.
(package private)  void write(ConstantPool cp, java.io.DataOutput out)
          Write this instruction into a file.
 
Methods inherited from class at.dms.classfile.Instruction
dump, getAddress, getLocalVar, getOpcode, getPoppedFromStack, isLiteral, setAddress, setOpcode
 
Methods inherited from class at.dms.classfile.AbstractInstructionAccessor
transform
 
Methods inherited from class java.lang.Object
, clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

SwitchInstruction

public SwitchInstruction(InstructionAccessor defaultTarget,
                         int[] matches,
                         InstructionAccessor[] targets)
Constructs a switch instruction.
Parameters:
defaultTarget - Default target for switch.
matches - Array of match values to compare the key to.
targets - Array of target instructions for each match value.

SwitchInstruction

public SwitchInstruction(InstructionAccessor defaultTarget,
                         java.util.List matches,
                         java.util.List targets)
Constructs a switch instruction.
Parameters:
defaultTarget - Default target for switch.
matches - List of match values to compare the key to.
targets - List of target instructions for each match value.
Method Detail

canComplete

public boolean canComplete()
Returns true iff control flow can reach the next instruction in textual order.
Overrides:
canComplete in class Instruction

transformAccessors

public void transformAccessors(AccessorTransformer transformer)
                        throws BadAccessorException
Transforms targets. (deferences to actual instructions)
Specified by:
transformAccessors in interface AccessorContainer
Following copied from interface: at.dms.classfile.AccessorContainer
Parameters:
transformer - The transformer used to transform accessors.

setTarget

public void setTarget(InstructionAccessor target,
                      int position)
Sets the target for this instruction.

getSwitchCount

public int getSwitchCount()
Gets the number of 'case' labels.

getMatch

public int getMatch(int position)
Returns the case label's value at the specified position in the list of cases.

getTarget

public InstructionAccessor getTarget(int position)
Returns the target of the specified position in the list of cases.

setTarget

public void setTarget(int position,
                      InstructionAccessor accessor)
Sets the target of the specified position in the list of cases.

selectSwitchType

public void selectSwitchType()
Select the appropriate switch type. (tableswitch or lookupswitch)

getSize

int getSize()
Returns the number of bytes used by the the instruction in the code array.
Overrides:
getSize in class Instruction

getReturnType

public byte getReturnType()
Returns the type pushed on the stack.
Overrides:
getReturnType in class Instruction

check

void check(CodeEnv env,
           int curStack)
     throws ClassFileFormatException
Verifies the enclosed instruction and computes the stack height.
Overrides:
check in class Instruction
Parameters:
env - The check environment.
curStack - The stack height at the end of the execution of the instruction.
Returns:
true iff the next instruction in textual order needs to be checked, i.e. this instruction has not been checked before and it can complete normally.
Throws:
ClassFileFormatException - A problem was detected.

computeEndAddress

void computeEndAddress(CodePosition position)
Computes the address of the end of the instruction.
Overrides:
computeEndAddress in class Instruction
Parameters:
position - The minimum and maximum address of the begin of this instruction. This parameter is changed to the minimum and maximum address of the end of this instruction.

getPushedOnStack

public int getPushedOnStack()
Returns the size of data pushed on the stack by this instruction.
Overrides:
getPushedOnStack in class Instruction

getStack

public int getStack()
Return the amount of stack (positive or negative) used by this instruction.
Overrides:
getStack in class Instruction

resolveConstants

void resolveConstants(ConstantPool cp)
Insert or check location of constant value on constant pool.
Overrides:
resolveConstants in class Instruction
Parameters:
cp - The constant pool for this class.

write

void write(ConstantPool cp,
           java.io.DataOutput out)
     throws java.io.IOException
Write this instruction into a file.
Overrides:
write in class Instruction
Parameters:
cp - The constant pool that contain all data.
out - The file where to write this object info.
Throws:
java.io.IOException - An io problem has occured.