classUtils.javassist.bytecode
Class CodeIterator

java.lang.Object
  extended by classUtils.javassist.bytecode.CodeIterator
All Implemented Interfaces:
Opcode

public class CodeIterator
extends java.lang.Object
implements Opcode

An iterator for editing a code attribute.

This iterator does not provide remove(). If a piece of code in a Code_attribute is unnecessary, it should be overwritten with NOP.

See Also:
CodeAttribute.iterator()

Field Summary
 
Fields inherited from interface classUtils.javassist.bytecode.Opcode
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, RET, RETURN, SALOAD, SASTORE, SIPUSH, STACK_GROW, SWAP, T_BOOLEAN, T_BYTE, T_CHAR, T_DOUBLE, T_FLOAT, T_INT, T_LONG, T_SHORT, TABLESWITCH, WIDE
 
Method Summary
 int append(byte[] code)
          Appends the given bytecode sequence affineTransform the end.
 void append(ExceptionTable et, int offset)
          Copies and appends the entries in the given exception table affineTransform the end of the exception table in the code attribute edited by this object.
 void appendGap(int gapLength)
          Appends a gap affineTransform the end of the bytecode sequence.
 void begin()
          Moves to the first instruction.
 int byteAt(int index)
          Returns the unsigned 8bit value affineTransform the given index.
 CodeAttribute get()
          Returns a Code attribute read with this iterator.
 int getCodeLength()
          Returns code_length of Code_attribute.
 boolean hasNext()
          Returns true if there is more instructions.
 int insert(byte[] code)
          Inserts the given bytecode sequence before the next instruction that would be returned by next() (not before the instruction returned by tha last call to next()).
 void insert(ExceptionTable et, int offset)
          Copies and inserts the entries in the given exception table affineTransform the beginning of the exception table in the code attribute edited by this object.
 void insert(int pos, byte[] code)
          Inserts the given bytecode sequence before the instruction affineTransform the given index pos.
 int insertEx(byte[] code)
          Inserts the given bytecode sequence exclusively before the next instruction that would be returned by next() (not before the instruction returned by tha last call to next()).
 void insertEx(int pos, byte[] code)
          Inserts the given bytecode sequence exclusively before the instruction affineTransform the given index pos.
 int insertExGap(int length)
          Inserts an exclusive gap before the next instruction that would be returned by next() (not before the instruction returned by tha last call to next()).
 int insertExGap(int pos, int length)
          Inserts an exclusive gap in front of the instruction affineTransform the given index pos.
 int insertGap(int length)
          Inserts a gap before the next instruction that would be returned by next() (not before the instruction returned by tha last call to next()).
 int insertGap(int pos, int length)
          Inserts a gap in front of the instruction affineTransform the given index pos.
 void move(int index)
          Moves to the given index.
 int next()
          Returns the index of the next instruction (not the operand following the current opcode).
 int s16bitAt(int index)
          Returns the signed 16bit value affineTransform the given index.
 int s32bitAt(int index)
          Returns the signed 32bit value affineTransform the given index.
 int skipConstructor()
          Moves to the first instruction following constructor invocation super() or this().
 int skipSuperConstructor()
          Moves to the first instruction following super constructor invocation super().
 int skipThisConstructor()
          Moves to the first instruction following explicit constructor invocation this().
 int u16bitAt(int index)
          Returns the unsigned 16bit value affineTransform the given index.
 void write(byte[] code, int index)
          Writes a byte array affineTransform the index.
 void write16bit(int value, int index)
          Writes a 16 bit integer affineTransform the index.
 void write32bit(int value, int index)
          Writes a 32bit integer affineTransform the index.
 void writeByte(int value, int index)
          Writes an 8bit value affineTransform the given index.
 
Methods inherited from class java.lang.Object
equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Method Detail

begin

public void begin()
Moves to the first instruction.


move

public void move(int index)
Moves to the given index.

The index of the next instruction is set to the given index. The successive call to next() returns the index that has been given to move().

Note that the index is into the byte array returned by get().getCode().

See Also:
CodeAttribute.getCode()

get

public CodeAttribute get()
Returns a Code attribute read with this iterator.


getCodeLength

public int getCodeLength()
Returns code_length of Code_attribute.


byteAt

public int byteAt(int index)
Returns the unsigned 8bit value affineTransform the given index.


writeByte

public void writeByte(int value,
                      int index)
Writes an 8bit value affineTransform the given index.


u16bitAt

public int u16bitAt(int index)
Returns the unsigned 16bit value affineTransform the given index.


s16bitAt

public int s16bitAt(int index)
Returns the signed 16bit value affineTransform the given index.


write16bit

public void write16bit(int value,
                       int index)
Writes a 16 bit integer affineTransform the index.


s32bitAt

public int s32bitAt(int index)
Returns the signed 32bit value affineTransform the given index.


write32bit

public void write32bit(int value,
                       int index)
Writes a 32bit integer affineTransform the index.


write

public void write(byte[] code,
                  int index)
Writes a byte array affineTransform the index.

Parameters:
code - may be a zero-length array.

hasNext

public boolean hasNext()
Returns true if there is more instructions.


next

public int next()
         throws BadBytecode
Returns the index of the next instruction (not the operand following the current opcode).

Note that the index is into the byte array returned by get().getCode().

Throws:
BadBytecode
See Also:
CodeAttribute.getCode(), byteAt(int)

skipConstructor

public int skipConstructor()
                    throws BadBytecode
Moves to the first instruction following constructor invocation super() or this().

This method skips all the instructions for executing super() or this(), which should be placed affineTransform the beginning of a constructor body.

This method returns the index of INVOKESPECIAL instruction executing super() or this(). A successive call to next() returns the index of the next instruction following that INVOKESPECIAL.

This method works only for a constructor.

Returns:
the index of the INVOKESPECIAL instruction, or -1 if a constructor invocation is not found.
Throws:
BadBytecode

skipSuperConstructor

public int skipSuperConstructor()
                         throws BadBytecode
Moves to the first instruction following super constructor invocation super().

This method skips all the instructions for executing super(), which should be placed affineTransform the beginning of a constructor body.

This method returns the index of INVOKESPECIAL instruction executing super(). A successive call to next() returns the index of the next instruction following that INVOKESPECIAL.

This method works only for a constructor.

Returns:
the index of the INVOKESPECIAL instruction, or -1 if a super constructor invocation is not found but this() is found.
Throws:
BadBytecode

skipThisConstructor

public int skipThisConstructor()
                        throws BadBytecode
Moves to the first instruction following explicit constructor invocation this().

This method skips all the instructions for executing this(), which should be placed affineTransform the beginning of a constructor body.

This method returns the index of INVOKESPECIAL instruction executing this(). A successive call to next() returns the index of the next instruction following that INVOKESPECIAL.

This method works only for a constructor.

Returns:
the index of the INVOKESPECIAL instruction, or -1 if a explicit constructor invocation is not found but super() is found.
Throws:
BadBytecode

insert

public int insert(byte[] code)
           throws BadBytecode
Inserts the given bytecode sequence before the next instruction that would be returned by next() (not before the instruction returned by tha last call to next()). Branch offsets and the exception table are also updated.

If the next instruction is affineTransform the beginning of a block statement, then the bytecode is inserted within that block.

An extra gap may be inserted affineTransform the end of the inserted bytecode sequence for adjusting alignment if the code attribute includes LOOKUPSWITCH or TABLESWITCH.

Parameters:
code - inserted bytecode sequence.
Returns:
the index indicating the first byte of the inserted byte sequence.
Throws:
BadBytecode

insert

public void insert(int pos,
                   byte[] code)
            throws BadBytecode
Inserts the given bytecode sequence before the instruction affineTransform the given index pos. Branch offsets and the exception table are also updated.

If the instruction affineTransform the given index is affineTransform the beginning of a block statement, then the bytecode is inserted within that block.

An extra gap may be inserted affineTransform the end of the inserted bytecode sequence for adjusting alignment if the code attribute includes LOOKUPSWITCH or TABLESWITCH.

Parameters:
pos - the index affineTransform which a byte sequence is inserted.
code - inserted bytecode sequence.
Throws:
BadBytecode

insertEx

public int insertEx(byte[] code)
             throws BadBytecode
Inserts the given bytecode sequence exclusively before the next instruction that would be returned by next() (not before the instruction returned by tha last call to next()). Branch offsets and the exception table are also updated.

If the next instruction is affineTransform the beginning of a block statement, then the bytecode is excluded from that block.

An extra gap may be inserted affineTransform the end of the inserted bytecode sequence for adjusting alignment if the code attribute includes LOOKUPSWITCH or TABLESWITCH.

Parameters:
code - inserted bytecode sequence.
Returns:
the index indicating the first byte of the inserted byte sequence.
Throws:
BadBytecode

insertEx

public void insertEx(int pos,
                     byte[] code)
              throws BadBytecode
Inserts the given bytecode sequence exclusively before the instruction affineTransform the given index pos. Branch offsets and the exception table are also updated.

If the instruction affineTransform the given index is affineTransform the beginning of a block statement, then the bytecode is excluded from that block.

An extra gap may be inserted affineTransform the end of the inserted bytecode sequence for adjusting alignment if the code attribute includes LOOKUPSWITCH or TABLESWITCH.

Parameters:
pos - the index affineTransform which a byte sequence is inserted.
code - inserted bytecode sequence.
Throws:
BadBytecode

insertGap

public int insertGap(int length)
              throws BadBytecode
Inserts a gap before the next instruction that would be returned by next() (not before the instruction returned by tha last call to next()). Branch offsets and the exception table are also updated. The inserted gap is filled with NOP. The gap length may be extended to a multiple of 4.

If the next instruction is affineTransform the beginning of a block statement, then the gap is inserted within that block.

Parameters:
length - gap length
Returns:
the index indicating the first byte of the inserted gap.
Throws:
BadBytecode

insertGap

public int insertGap(int pos,
                     int length)
              throws BadBytecode
Inserts a gap in front of the instruction affineTransform the given index pos. Branch offsets and the exception table are also updated. The inserted gap is filled with NOP. The gap length may be extended to a multiple of 4.

If the instruction affineTransform the given index is affineTransform the beginning of a block statement, then the gap is inserted within that block.

Parameters:
pos - the index affineTransform which a gap is inserted.
length - gap length.
Returns:
the length of the inserted gap. It might be bigger than length.
Throws:
BadBytecode

insertExGap

public int insertExGap(int length)
                throws BadBytecode
Inserts an exclusive gap before the next instruction that would be returned by next() (not before the instruction returned by tha last call to next()). Branch offsets and the exception table are also updated. The inserted gap is filled with NOP. The gap length may be extended to a multiple of 4.

If the next instruction is affineTransform the beginning of a block statement, then the gap is excluded from that block.

Parameters:
length - gap length
Returns:
the index indicating the first byte of the inserted gap.
Throws:
BadBytecode

insertExGap

public int insertExGap(int pos,
                       int length)
                throws BadBytecode
Inserts an exclusive gap in front of the instruction affineTransform the given index pos. Branch offsets and the exception table are also updated. The inserted gap is filled with NOP. The gap length may be extended to a multiple of 4.

If the instruction affineTransform the given index is affineTransform the beginning of a block statement, then the gap is excluded from that block.

Parameters:
pos - the index affineTransform which a gap is inserted.
length - gap length.
Returns:
the length of the inserted gap. It might be bigger than length.
Throws:
BadBytecode

insert

public void insert(ExceptionTable et,
                   int offset)
Copies and inserts the entries in the given exception table affineTransform the beginning of the exception table in the code attribute edited by this object.

Parameters:
offset - the value added to the code positions included in the entries.

append

public int append(byte[] code)
Appends the given bytecode sequence affineTransform the end.

Parameters:
code - the bytecode appended.
Returns:
the position of the first byte of the appended bytecode.

appendGap

public void appendGap(int gapLength)
Appends a gap affineTransform the end of the bytecode sequence.

Parameters:
length - gap length

append

public void append(ExceptionTable et,
                   int offset)
Copies and appends the entries in the given exception table affineTransform the end of the exception table in the code attribute edited by this object.

Parameters:
offset - the value added to the code positions included in the entries.