JML

org.multijava.util.classfile
Class SwitchInstruction

java.lang.Object
  extended byorg.multijava.util.classfile.AbstractInstructionAccessor
      extended byorg.multijava.util.classfile.Instruction
          extended byorg.multijava.util.classfile.SwitchInstruction
All Implemented Interfaces:
AccessorContainer, Constants, InstructionAccessor

public class SwitchInstruction
extends Instruction
implements AccessorContainer

Some instructions are persnickety enough that its simpler to write them separately instead of smushing them with all the rest. The multiarray instruction is one of them.


Field Summary
private  InstructionAccessor deflab
           
private  int[] matches
           
private  int pad
           
private  InstructionAccessor[] targets
           
 
Fields inherited from class org.multijava.util.classfile.Instruction
 
Fields inherited from interface org.multijava.util.classfile.Constants
ACC_ABSTRACT, ACC_FINAL, ACC_INTERFACE, ACC_NATIVE, ACC_PRIVATE, ACC_PROTECTED, ACC_PUBLIC, ACC_STATIC, ACC_STRICT, ACC_SUPER, ACC_SYNCHRONIZED, ACC_SYNTHETIC, ACC_TRANSIENT, ACC_VOLATILE, ACCESS_FLAG_ARRAY, ACCESS_FLAG_NAMES, ATT_ANCHOR, ATT_BRIDGE, ATT_CODE, ATT_CONSTANTVALUE, ATT_DEPRECATED, ATT_DISPATCHER, ATT_EXCEPTIONS, ATT_GENERIC, ATT_GENERIC_FUNCTIONS, ATT_INNERCLASSES, ATT_LINENUMBERTABLE, ATT_LOCALVARIABLETABLE, ATT_MM_BODY, ATT_REDIRECTOR, ATT_RMJ_GLUE, ATT_RMJ_SIGNATURE, ATT_RUNTIME_VISIBLE_ANNOTATIONS, ATT_RUNTIME_VISIBLE_PARAMETER_ANNOTATIONS, ATT_SIGNATURE, ATT_SOURCEFILE, ATT_SYNTHETIC, ATT_UNIVERSE_FIELD, ATT_UNIVERSE_METHOD, ATT_UNIVERSE_VERSION, 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_dup2, opc_dup2_x1, opc_dup2_x2, opc_dup_x1, opc_dup_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_ldc2_w, opc_ldc_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
private SwitchInstruction(InstructionAccessor deflab)
          Helper constructor
  SwitchInstruction(InstructionAccessor deflab, int[] matches, InstructionAccessor[] targets)
          Constructs a switch instruction
  SwitchInstruction(InstructionAccessor deflab, ArrayList matches, ArrayList 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.
private  int computeSize(int start)
          Compute the size of this instruction
 int getMatch(int position)
          Returns the case's value at a position
 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'
 InstructionAccessor getTarget(int position)
          Returns the target at a position
(package private)  void resolveConstants(ConstantPool cp)
          Insert or check location of constant value on constant pool
 void selectSwitchType()
          Select the appropriate switch type (tableswitch or lookupswitch)
 void setTarget(int position, InstructionAccessor accessor)
          Returns the target at a position
 void setTarget(InstructionAccessor target, int position)
          Sets the target for this instruction
private static void sort(int[] matches, InstructionAccessor[] instrs)
          Bubble sort an array
 void transformAccessors(AccessorTransformer transformer)
          Transforms targets (deferences to actual instructions).
(package private)  void write(ConstantPool cp, DataOutput out)
          Write this instruction into a file
 
Methods inherited from class org.multijava.util.classfile.Instruction
dump, getAddress, getLocalVar, getOpcode, getPoppedFromStack, isLiteral, setAddress, setOpcode
 
Methods inherited from class org.multijava.util.classfile.AbstractInstructionAccessor
transform
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

pad

private int pad

deflab

private InstructionAccessor deflab

matches

private int[] matches

targets

private InstructionAccessor[] targets
Constructor Detail

SwitchInstruction

private SwitchInstruction(InstructionAccessor deflab)
Helper constructor


SwitchInstruction

public SwitchInstruction(InstructionAccessor deflab,
                         int[] matches,
                         InstructionAccessor[] targets)
Constructs a switch instruction

Parameters:
deflab - 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 deflab,
                         ArrayList matches,
                         ArrayList targets)
Constructs a switch instruction

Parameters:
deflab - 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.


transformAccessors

public void transformAccessors(AccessorTransformer transformer)
                        throws BadAccessorException
Transforms targets (deferences to actual instructions).

Specified by:
transformAccessors in interface AccessorContainer
Parameters:
transformer - the transformer used to transform accessors
Throws:
BadAccessorException

setTarget

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


getSwitchCount

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


getMatch

public int getMatch(int position)
Returns the case's value at a position


getTarget

public InstructionAccessor getTarget(int position)
Returns the target at a position


setTarget

public void setTarget(int position,
                      InstructionAccessor accessor)
Returns the target at a position


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.


getReturnType

public byte getReturnType()
Returns the type pushed on the stack


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


getStack

public int getStack()
Return the amount of stack (positive or negative) used by this instruction


resolveConstants

void resolveConstants(ConstantPool cp)
Insert or check location of constant value on constant pool

Parameters:
cp - the constant pool for this class

write

void write(ConstantPool cp,
           DataOutput out)
     throws IOException
Write this instruction into a file

Parameters:
cp - the constant pool that contain all data
out - the file where to write this object info
Throws:
IOException - an io problem has occured

computeSize

private int computeSize(int start)
Compute the size of this instruction


sort

private static final void sort(int[] matches,
                               InstructionAccessor[] instrs)
Bubble sort an array


JML

JML is Copyright (C) 1998-2002 by Iowa State University and is distributed under the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This release depends on code from the MultiJava project and is based in part on the Kopi project Copyright (C) 1990-99 DMS Decision Management Systems Ges.m.b.H.