Package org.aspectj.apache.bcel.generic
Class InstructionList
java.lang.Object
org.aspectj.apache.bcel.generic.InstructionList
- All Implemented Interfaces:
Serializable
This class is a container for a list of Instruction objects. Instructions can be appended,
inserted, moved, deleted, etc.. Instructions are being wrapped into InstructionHandles
objects that are returned upon append/insert operations. They give the user (read only) access to the list structure, such that
it can be traversed and manipulated in a controlled way.
A list is finally dumped to a byte code array with getByteCode.
- Version:
- $Id: InstructionList.java,v 1.12 2011/09/02 22:33:04 aclement Exp $
- Author:
- M. Dahm, Abraham Nevado
- See Also:
Instruction
,InstructionHandle
,BranchHandle
, Serialized Form
-
Constructor Summary
-
Method Summary
Modifier and TypeMethodDescriptionappend(Instruction i)
Append an instruction to the end of this list.Append a branch instruction to the end of this list.append(InstructionHandle ih, Instruction i)
Append an instruction after instruction (handle) ih contained in this list.append(InstructionHandle ih, InstructionBranch i)
Append an instruction after instruction (handle) ih contained in this list.append(InstructionHandle appendTo, InstructionList appendee)
Append another list after instruction (handle) ih contained in this list.append(InstructionList il)
Append another list to this one.append(Instruction i, Instruction j)
Append a single instruction j after another instruction i, which must be in this list of course!append(Instruction i, InstructionList il)
Append another list after instruction i contained in this list.boolean
contains(Instruction i)
boolean
copy()
void
delete(InstructionHandle ih)
Remove instruction from this list.void
delete(InstructionHandle from, InstructionHandle to)
Remove instructions from instruction `from' to instruction `to' contained in this list.void
delete(Instruction from, Instruction to)
Remove instructions from instruction `from' to instruction `to' contained in this list.void
dispose()
Delete contents of list.findHandle(int pos)
Get instruction handle for instruction at byte code position pos.findHandle(int pos, InstructionHandle[] instructionArray)
findHandle(int pos, InstructionHandle[] instructionArray, boolean useClosestApproximationIfNoExactFound)
static InstructionHandle
findHandle(InstructionHandle[] ihs, int[] pos, int count, int target)
static InstructionHandle
findHandle(InstructionHandle[] ihs, int[] pos, int count, int target, boolean returnClosestIfNoExactMatch)
Find the target instruction (handle) that corresponds to the given target position (byte code offset).byte[]
When everything is finished, use this method to convert the instruction list into an array of bytes.getEnd()
int[]
Get positions (offsets) of all instructions in the list.int
getStart()
insert(Instruction i)
Insert an instruction at start of this list.Insert a branch instruction at start of this list.insert(InstructionHandle ih, Instruction i)
Insert an instruction before instruction (handle) ih contained in this list.insert(InstructionHandle ih, InstructionBranch i)
Insert an instruction before instruction (handle) ih contained in this list.insert(InstructionHandle ih, InstructionList il)
Insert another list before Instruction handle ih contained in this list.insert(InstructionList il)
Insert another list.insert(Instruction i, Instruction j)
Insert a single instruction j before another instruction i, which must be in this list of course!insert(Instruction i, InstructionList il)
Insert another list before Instruction i contained in this list.boolean
isEmpty()
iterator()
void
move(InstructionHandle ih, InstructionHandle target)
Move a single instruction (handle) to a new location.void
move(InstructionHandle start, InstructionHandle end, InstructionHandle target)
Take all instructions (handles) from "start" to "end" and append them after the new location "target".void
redirectBranches(InstructionHandle old_target, InstructionHandle new_target)
Redirect all references from old_target to new_target, i.e., update targets of branch instructions.void
redirectExceptionHandlers(CodeExceptionGen[] exceptions, InstructionHandle old_target, InstructionHandle new_target)
Redirect all references of exception handlers from old_target to new_target.void
redirectLocalVariables(LocalVariableGen[] lg, InstructionHandle old_target, InstructionHandle new_target)
Redirect all references of local variables from old_target to new_target.void
replaceConstantPool(ConstantPool old_cp, ConstantPool new_cp)
Replace all references to the old constant pool with references to the new constant poolvoid
void
setPositions(boolean check)
Give all instructions their position number (offset in byte stream), i.e., make the list ready to be dumped.int
size()
toString()
toString(boolean verbose)
-
Constructor Details
-
InstructionList
public InstructionList() -
InstructionList
-
InstructionList
public InstructionList(byte[] code)Initialize instruction list from byte array.- Parameters:
code
- byte array containing the instructions
-
-
Method Details
-
isEmpty
public boolean isEmpty() -
findHandle
public static InstructionHandle findHandle(InstructionHandle[] ihs, int[] pos, int count, int target) -
findHandle
public static InstructionHandle findHandle(InstructionHandle[] ihs, int[] pos, int count, int target, boolean returnClosestIfNoExactMatch)Find the target instruction (handle) that corresponds to the given target position (byte code offset).- Parameters:
ihs
- array of instruction handles, i.e. il.getInstructionHandles()pos
- array of positions corresponding to ihs, i.e. il.getInstructionPositions()count
- length of arraystarget
- target position to search for- Returns:
- target position's instruction handle if available
-
findHandle
Get instruction handle for instruction at byte code position pos. This only works properly, if the list is freshly initialized from a byte array or setPositions() has been called before this method.- Parameters:
pos
- byte code position to search for- Returns:
- target position's instruction handle if available
-
getInstructionsAsArray
-
findHandle
-
findHandle
public InstructionHandle findHandle(int pos, InstructionHandle[] instructionArray, boolean useClosestApproximationIfNoExactFound) -
append
Append another list after instruction (handle) ih contained in this list. Consumes argument list, i.e., it becomes empty.- Parameters:
appendTo
- where to append the instruction listappendee
- Instruction list to append to this one- Returns:
- instruction handle pointing to the first appended instruction
-
append
Append another list after instruction i contained in this list. Consumes argument list, i.e., it becomes empty.- Parameters:
i
- where to append the instruction listil
- Instruction list to append to this one- Returns:
- instruction handle pointing to the first appended instruction
-
append
Append another list to this one. Consumes argument list, i.e., it becomes empty.- Parameters:
il
- list to append to end of this list- Returns:
- instruction handle of the first appended instruction
-
append
Append an instruction to the end of this list.- Parameters:
i
- instruction to append- Returns:
- instruction handle of the appended instruction
-
appendDUP
-
appendNOP
-
appendPOP
-
append
Append a branch instruction to the end of this list.- Parameters:
i
- branch instruction to append- Returns:
- branch instruction handle of the appended instruction
-
append
Append a single instruction j after another instruction i, which must be in this list of course!- Parameters:
i
- Instruction in listj
- Instruction to append after i in list- Returns:
- instruction handle of the first appended instruction
-
append
Append an instruction after instruction (handle) ih contained in this list.- Parameters:
ih
- where to append the instruction listi
- Instruction to append- Returns:
- instruction handle pointing to the first appended instruction
-
append
Append an instruction after instruction (handle) ih contained in this list.- Parameters:
ih
- where to append the instruction listi
- Instruction to append- Returns:
- instruction handle pointing to the first appended instruction
-
insert
Insert another list before Instruction handle ih contained in this list. Consumes argument list, i.e., it becomes empty.- Parameters:
i
- where to append the instruction listil
- Instruction list to insert- Returns:
- instruction handle of the first inserted instruction
-
insert
Insert another list.- Parameters:
il
- list to insert before start of this list- Returns:
- instruction handle of the first inserted instruction
-
insert
Insert another list before Instruction i contained in this list. Consumes argument list, i.e., it becomes empty.- Parameters:
i
- where to append the instruction listil
- Instruction list to insert- Returns:
- instruction handle pointing to the first inserted instruction, i.e., il.getStart()
-
insert
Insert an instruction at start of this list.- Parameters:
i
- instruction to insert- Returns:
- instruction handle of the inserted instruction
-
insert
Insert a branch instruction at start of this list.- Parameters:
i
- branch instruction to insert- Returns:
- branch instruction handle of the appended instruction
-
insert
Insert a single instruction j before another instruction i, which must be in this list of course!- Parameters:
i
- Instruction in listj
- Instruction to insert before i in list- Returns:
- instruction handle of the first inserted instruction
-
insert
Insert an instruction before instruction (handle) ih contained in this list.- Parameters:
ih
- where to insert to the instruction listi
- Instruction to insert- Returns:
- instruction handle of the first inserted instruction
-
insert
Insert an instruction before instruction (handle) ih contained in this list.- Parameters:
ih
- where to insert to the instruction listi
- Instruction to insert- Returns:
- instruction handle of the first inserted instruction
-
move
Take all instructions (handles) from "start" to "end" and append them after the new location "target". Of course, "end" must be after "start" and target must not be located withing this range. If you want to move something to the start of the list use null as value for target.
Any instruction targeters pointing to handles within the block, keep their targets.- Parameters:
start
- of moved blockend
- of moved blocktarget
- of moved block
-
move
Move a single instruction (handle) to a new location.- Parameters:
ih
- moved instructiontarget
- new location of moved instruction
-
delete
Remove instruction from this list. The corresponding Instruction handles must not be reused!- Parameters:
ih
- instruction (handle) to remove- Throws:
TargetLostException
-
delete
Remove instructions from instruction `from' to instruction `to' contained in this list. The user must ensure that `from' is an instruction before `to', or risk havoc. The corresponding Instruction handles must not be reused!- Parameters:
from
- where to start deleting (inclusive)to
- where to end deleting (inclusive)- Throws:
TargetLostException
-
delete
Remove instructions from instruction `from' to instruction `to' contained in this list. The user must ensure that `from' is an instruction before `to', or risk havoc. The corresponding Instruction handles must not be reused!- Parameters:
from
- where to start deleting (inclusive)to
- where to end deleting (inclusive)- Throws:
TargetLostException
-
contains
-
contains
-
setPositions
public void setPositions() -
setPositions
public void setPositions(boolean check)Give all instructions their position number (offset in byte stream), i.e., make the list ready to be dumped.- Parameters:
check
- Perform sanity checks, e.g. if all targeted instructions really belong to this list
-
getByteCode
public byte[] getByteCode()When everything is finished, use this method to convert the instruction list into an array of bytes.- Returns:
- the byte code ready to be dumped
-
getInstructions
- Returns:
- an array of instructions without target information for branch instructions.
-
toString
-
toString
- Parameters:
verbose
- toggle output format- Returns:
- String containing all instructions in this list.
-
iterator
- Returns:
- Enumeration that lists all instructions (handles)
-
getInstructionHandles
- Returns:
- array containing all instructions (handles)
-
getInstructionPositions
public int[] getInstructionPositions()Get positions (offsets) of all instructions in the list. This relies on that the list has been freshly created from an byte code array, or that setPositions() has been called. Otherwise this may be inaccurate.- Returns:
- array containing all instruction's offset in byte code
-
copy
- Returns:
- complete, i.e., deep copy of this list
-
replaceConstantPool
Replace all references to the old constant pool with references to the new constant pool -
dispose
public void dispose()Delete contents of list. Provides better memory utilization, because the system then may reuse the instruction handles. This method is typically called right afterMethodGen.getMethod(). -
getStart
- Returns:
- start of list
-
getEnd
- Returns:
- end of list
-
getLength
public int getLength()- Returns:
- length of list (Number of instructions, not bytes)
-
size
public int size()- Returns:
- length of list (Number of instructions, not bytes)
-
redirectBranches
Redirect all references from old_target to new_target, i.e., update targets of branch instructions.- Parameters:
old_target
- the old target instruction handlenew_target
- the new target instruction handle
-
redirectLocalVariables
public void redirectLocalVariables(LocalVariableGen[] lg, InstructionHandle old_target, InstructionHandle new_target)Redirect all references of local variables from old_target to new_target.- Parameters:
lg
- array of local variablesold_target
- the old target instruction handlenew_target
- the new target instruction handle- See Also:
MethodGen
-
redirectExceptionHandlers
public void redirectExceptionHandlers(CodeExceptionGen[] exceptions, InstructionHandle old_target, InstructionHandle new_target)Redirect all references of exception handlers from old_target to new_target.- Parameters:
exceptions
- array of exception handlersold_target
- the old target instruction handlenew_target
- the new target instruction handle- See Also:
MethodGen
-