com.ibm.wala.shrikeBT
Class Decoder

java.lang.Object
  extended by com.ibm.wala.shrikeBT.Decoder
All Implemented Interfaces:
Constants
Direct Known Subclasses:
CTDecoder

public abstract class Decoder
extends java.lang.Object
implements Constants

A Decoder translates a method's Java bytecode into shrikeBT code, i.e. an array of Instruction objects and an array of lists of ExceptionHandlers. This class implements basic decoding functionality. A toolkit for reading class files must specialize this class with particular constant pool reader implementation. Normal usage of this class looks like this:

 
    Decoder d = new MyToolkitDecoder(...);
    try {
      d.decode();
    } catch (Decoder.InvalidBytecodeException ex) {
      ...
    }
    Instruction[] myInstructions = d.getInstructions();
    ExceptionHandler[][] exnHandlers = d.getHandlers();
  
 


Nested Class Summary
static class Decoder.InvalidBytecodeException
          This exception is thrown when the Decoder detects invalid incoming bytecode (code that would not pass the Java verifier).
 
Field Summary
 
Fields inherited from interface com.ibm.wala.shrikeBT.Constants
ACC_ABSTRACT, ACC_FINAL, ACC_INTERFACE, ACC_NATIVE, ACC_PRIVATE, ACC_PROTECTED, ACC_PUBLIC, ACC_STATIC, ACC_STRICT, ACC_SUPER, ACC_SYNCHRONIZED, ACC_TRANSIENT, ACC_VOLATILE, CONSTANT_Class, CONSTANT_Double, CONSTANT_FieldRef, CONSTANT_Float, CONSTANT_Integer, CONSTANT_InterfaceMethodRef, CONSTANT_Long, CONSTANT_MethodRef, CONSTANT_NameAndType, CONSTANT_String, CONSTANT_Utf8, indexedTypes, indexedTypes_T, MAYBE, NO, OP_aaload, OP_aastore, OP_aconst_null, OP_aload, OP_aload_0, OP_aload_1, OP_aload_2, OP_aload_3, OP_anewarray, OP_areturn, OP_arraylength, OP_astore, OP_astore_0, OP_astore_1, OP_astore_2, OP_astore_3, OP_athrow, OP_baload, OP_bastore, OP_bipush, OP_caload, OP_castore, OP_checkcast, OP_d2f, OP_d2i, OP_d2l, OP_dadd, OP_daload, OP_dastore, OP_dcmpg, OP_dcmpl, OP_dconst_0, OP_dconst_1, OP_ddiv, OP_dload, OP_dload_0, OP_dload_1, OP_dload_2, OP_dload_3, OP_dmul, OP_dneg, OP_drem, OP_dreturn, OP_dstore, OP_dstore_0, OP_dstore_1, OP_dstore_2, OP_dstore_3, OP_dsub, OP_dup, OP_dup_x1, OP_dup_x2, OP_dup2, OP_dup2_x1, OP_dup2_x2, OP_f2d, OP_f2i, OP_f2l, OP_fadd, OP_faload, OP_fastore, OP_fcmpg, OP_fcmpl, OP_fconst_0, OP_fconst_1, OP_fconst_2, OP_fdiv, OP_fload, OP_fload_0, OP_fload_1, OP_fload_2, OP_fload_3, OP_fmul, OP_fneg, OP_frem, OP_freturn, OP_fstore, OP_fstore_0, OP_fstore_1, OP_fstore_2, OP_fstore_3, OP_fsub, OP_getfield, OP_getstatic, OP_goto, OP_goto_w, OP_i2b, OP_i2c, OP_i2d, OP_i2f, OP_i2l, OP_i2s, OP_iadd, OP_iaload, OP_iand, OP_iastore, OP_iconst_0, OP_iconst_1, OP_iconst_2, OP_iconst_3, OP_iconst_4, OP_iconst_5, OP_iconst_m1, OP_idiv, OP_if_acmpeq, OP_if_acmpne, OP_if_icmpeq, OP_if_icmpge, OP_if_icmpgt, OP_if_icmple, OP_if_icmplt, OP_if_icmpne, OP_ifeq, OP_ifge, OP_ifgt, OP_ifle, OP_iflt, OP_ifne, OP_ifnonnull, OP_ifnull, OP_iinc, OP_iload, OP_iload_0, OP_iload_1, OP_iload_2, OP_iload_3, OP_imul, OP_ineg, OP_instanceof, OP_invokeinterface, OP_invokespecial, OP_invokestatic, OP_invokevirtual, OP_ior, OP_irem, OP_ireturn, OP_ishl, OP_ishr, OP_istore, OP_istore_0, OP_istore_1, OP_istore_2, OP_istore_3, OP_isub, OP_iushr, OP_ixor, OP_jsr, OP_jsr_w, OP_l2d, OP_l2f, OP_l2i, OP_ladd, OP_laload, OP_land, OP_lastore, OP_lcmp, OP_lconst_0, OP_lconst_1, OP_ldc, OP_ldc_w, OP_ldc2_w, OP_ldiv, OP_lload, OP_lload_0, OP_lload_1, OP_lload_2, OP_lload_3, OP_lmul, OP_lneg, OP_lookupswitch, OP_lor, OP_lrem, OP_lreturn, OP_lshl, OP_lshr, OP_lstore, OP_lstore_0, OP_lstore_1, OP_lstore_2, OP_lstore_3, OP_lsub, OP_lushr, OP_lxor, OP_monitorenter, OP_monitorexit, OP_multianewarray, OP_new, OP_newarray, OP_nop, OP_pop, OP_pop2, OP_putfield, OP_putstatic, OP_ret, OP_return, OP_saload, OP_sastore, OP_sipush, OP_swap, OP_tableswitch, OP_wide, OP_xxxunusedxxx, T_BOOLEAN, T_BYTE, T_CHAR, T_DOUBLE, T_FLOAT, T_INT, T_LONG, T_SHORT, TYPE_boolean, TYPE_boolean_index, TYPE_byte, TYPE_byte_index, TYPE_char, TYPE_char_index, TYPE_Class, TYPE_double, TYPE_double_index, TYPE_Error, TYPE_Exception, TYPE_float, TYPE_float_index, TYPE_int, TYPE_int_index, TYPE_long, TYPE_long_index, TYPE_null, TYPE_Object, TYPE_Object_index, TYPE_RuntimeException, TYPE_short, TYPE_short_index, TYPE_String, TYPE_Throwable, TYPE_unknown, TYPE_void, YES
 
Constructor Summary
protected Decoder(byte[] code, int[] rawHandlers, ConstantPoolReader cp)
          This constructor is only supposed to be used by subclasses.
 
Method Summary
 void decode()
          Perform the decoding.
 ConstantPoolReader getConstantPool()
           
 ExceptionHandler[][] getHandlers()
          Get the decoded exception handlers.
 Instruction[] getInstructions()
          Get the decoded instructions.
 int[] getInstructionsToBytecodes()
          Get the mapping between instructions and input bytecodes.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

Decoder

protected Decoder(byte[] code,
                  int[] rawHandlers,
                  ConstantPoolReader cp)
This constructor is only supposed to be used by subclasses.

Parameters:
code - the bytecodes for a method as per JVM spec
rawHandlers - flattened array of (startPC, endPC, targetPC, classIndex) tuples defined as per the JVM spec
Method Detail

getConstantPool

public ConstantPoolReader getConstantPool()

decode

public final void decode()
                  throws Decoder.InvalidBytecodeException
Perform the decoding.

Throws:
Decoder.InvalidBytecodeException - the incoming code is invalid and would fail Java bytecode verification

getInstructions

public final Instruction[] getInstructions()
Get the decoded instructions.

Returns:
array of decoded instructions

getHandlers

public final ExceptionHandler[][] getHandlers()
Get the decoded exception handlers.

Returns:
array of exception handler lists

getInstructionsToBytecodes

public final int[] getInstructionsToBytecodes()
Get the mapping between instructions and input bytecodes.

Returns:
an array m such that m[i] is the offset of the bytecode instruction which gave rise to the Instruction referenced in the instructions array at offset i