com.caucho.bytecode
Class CodeEnhancer

java.lang.Object
  extended by com.caucho.bytecode.CodeVisitor
      extended by com.caucho.bytecode.CodeEnhancer

public class CodeEnhancer
extends CodeVisitor

Visitor for travelling the code.


Field Summary
 
Fields inherited from class com.caucho.bytecode.CodeVisitor
_codeAttr, _offset, AALOAD, AASTORE, ACONST_NULL, ALOAD, ALOAD_0, ALOAD_1, ALOAD_2, ALOAD_3, ANEWARRAY, ARETURN, ARRAYLENGTH, ASTORE, ASTORE_0, ASTORE_1, ASTORE_2, ASTORE_3, ATHROW, BALOAD, BASTORE, BIPUSH, CALOAD, CASTORE, CHECKCAST, 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, 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, GETSTATIC, 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, IFEQ, IFGE, IFGT, IFLE, IFLT, IFNE, IFNONNULL, IFNULL, IINC, ILOAD, ILOAD_0, ILOAD_1, ILOAD_2, ILOAD_3, IMUL, INEG, INSTANCEOF, INVOKEINTERFACE, INVOKESPECIAL, INVOKESTATIC, INVOKEVIRTUAL, IOR, IREM, IRETURN, ISHL, ISHR, ISTORE, ISTORE_0, ISTORE_1, ISTORE_2, ISTORE_3, ISUB, IUSHR, IXOR, JSR, JSR_W, L2D, L2F, L2I, LADD, LALOAD, LAND, LASTORE, LCMP, LCONST_0, LCONST_1, LDC, LDC_W, LDC2_W, LDIV, LLOAD, LLOAD_0, LLOAD_1, LLOAD_2, LLOAD_3, LMUL, LNEG, LOOKUPSWITCH, LOR, LREM, LRETURN, LSHL, LSHR, LSTORE, LSTORE_0, LSTORE_1, LSTORE_2, LSTORE_3, LSUB, LUSHR, LXOR, MONITORENTER, MONITOREXIT, MULTIANEWARRAY, NEW, NEWARRAY, NOP, POP, POP2, PUTFIELD, PUTSTATIC, RESERVED_0, RET, RETURN, SALOAD, SASTORE, SIPUSH, SWAP, TABLESWITCH, WIDE
 
Constructor Summary
CodeEnhancer()
           
CodeEnhancer(JavaClass javaClass, CodeAttribute code)
           
 
Method Summary
 void add(int offset, byte[] buffer, int bufOffset, int length)
          Adds a byte to the code.
 void addByte(int offset, int value)
          Adds a byte to the code.
 void addNulls(int offset, int count)
          Adds a byte to the code.
 void addShort(int offset, int value)
          Adds a short to the code.
 void analyze(Analyzer analyzer, boolean allowFlow)
          Analyzes the code for a method
protected  void analyzeJumps()
           
 byte[] getCode()
          Returns the code buffer.
 int getLength()
          Returns the length.
 void init(JavaClass javaClass, CodeAttribute codeAttr)
           
protected  void insertCode(int offset, int count)
          Updates indices when adding a chunk of code.
 void remove(int offset, int count)
          Removes a range from the code.
protected  void removeCode(int offset, int count)
           
 void setByte(int offset, int value)
          Adds a byte to the code.
 void update()
          Updates the code.
 
Methods inherited from class com.caucho.bytecode.CodeVisitor
analyze, analyzeImpl, getBranchTarget, getByte, getByteArg, getByteArg, getCodeAttribute, getConstantArg, getExceptions, getInt, getIntArg, getJavaClass, getOffset, getOpcode, getShort, getShortArg, getShortArg, getSwitchTargets, isBranch, isSwitch, next, nextOffset, setByteArg, setInt, setOffset, setShort, setShortArg
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

CodeEnhancer

public CodeEnhancer()

CodeEnhancer

public CodeEnhancer(JavaClass javaClass,
                    CodeAttribute code)
Method Detail

init

public void init(JavaClass javaClass,
                 CodeAttribute codeAttr)
Overrides:
init in class CodeVisitor

analyze

public void analyze(Analyzer analyzer,
                    boolean allowFlow)
             throws java.lang.Exception
Analyzes the code for a method

Overrides:
analyze in class CodeVisitor
Throws:
java.lang.Exception

getCode

public byte[] getCode()
Returns the code buffer.

Overrides:
getCode in class CodeVisitor

getLength

public int getLength()
Returns the length.


addByte

public void addByte(int offset,
                    int value)
Adds a byte to the code.


setByte

public void setByte(int offset,
                    int value)
Adds a byte to the code.


addShort

public void addShort(int offset,
                     int value)
Adds a short to the code.


add

public void add(int offset,
                byte[] buffer,
                int bufOffset,
                int length)
Adds a byte to the code.


remove

public void remove(int offset,
                   int count)
Removes a range from the code.


addNulls

public void addNulls(int offset,
                     int count)
Adds a byte to the code.


insertCode

protected void insertCode(int offset,
                          int count)
Updates indices when adding a chunk of code. The operation at the given offset moves, e.g. adding 6 bytes to the beginning of the program moves the initial byte down by 6 and therefore needs to update the links as well. Therefore, enhancers which expand an opcode from 2 bytes to 3 bytes must insert the new bytes after the initial opcode.


removeCode

protected void removeCode(int offset,
                          int count)

analyzeJumps

protected void analyzeJumps()

update

public void update()
Updates the code.