Top Description Fields Constructors Methods
org.easymock.asm

public Class Label

extends Object
Class Inheritance

A position in the bytecode of a method. Labels are used for jump, goto, and switch instructions, and for try catch blocks. A label designates the instruction that is just after. Note however that there can be other elements between a label and the instruction it designates (such as other labels, stack map frames, line numbers, etc.).
Author
Eric Bruneton

Field Summary

Modifier and TypeField and Description
pack-priv int
bytecodeOffset

The offset of this label in the bytecode of its method, in bytes.

pack-priv static final Label
EMPTY_LIST

A sentinel element used to indicate the end of a list of labels.

pack-priv static final int
FLAG_DEBUG_ONLY

A flag indicating that a label is only used for debug attributes.

pack-priv static final int
FLAG_JUMP_TARGET

A flag indicating that a label is the target of a jump instruction, or the start of an exception handler.

pack-priv static final int
FLAG_LINE_NUMBER

A flag indicating that this label has at least one associated line number.

pack-priv static final int
FLAG_REACHABLE

A flag indicating that a label corresponds to a reachable basic block.

pack-priv static final int
FLAG_RESOLVED

A flag indicating that the bytecode offset of a label is known.

pack-priv static final int
FLAG_SUBROUTINE_CALLER

A flag indicating that the basic block corresponding to a label ends with a subroutine call.

pack-priv static final int
FLAG_SUBROUTINE_END

A flag indicating that the basic block corresponding to a label is the end of a subroutine.

pack-priv static final int
FLAG_SUBROUTINE_START

A flag indicating that the basic block corresponding to a label is the start of a subroutine.

pack-priv short
flags

The type and status of this label or its corresponding basic block.

pack-priv static final int
FORWARD_REFERENCE_HANDLE_MASK

The bit mask to extract the 'handle' of a forward reference to this label.

pack-priv static final int
FORWARD_REFERENCE_TYPE_MASK

The bit mask to extract the type of a forward reference to this label.

pack-priv static final int
FORWARD_REFERENCE_TYPE_SHORT

The type of forward references stored with two bytes in the bytecode.

pack-priv static final int
FORWARD_REFERENCE_TYPE_WIDE

The type of forward references stored in four bytes in the bytecode.

pack-priv static final int
FORWARD_REFERENCES_CAPACITY_INCREMENT

The number of elements to add to the forwardReferences array when it needs to be resized to store a new forward reference.

private int[]
forwardReferences

The forward references to this label.

pack-priv Frame
frame

The input and output stack map frames of the basic block corresponding to this label.

public Object
info

A user managed state associated with this label.

pack-priv short
inputStackSize

The number of elements in the input stack of the basic block corresponding to this label.

pack-priv static final int
LINE_NUMBERS_CAPACITY_INCREMENT

The number of elements to add to the otherLineNumbers array when it needs to be resized to store a new source line number.

private short
lineNumber

The source line number corresponding to this label, if FLAG_LINE_NUMBER is set.

pack-priv Label
nextBasicBlock

The successor of this label, in the order they are visited in MethodVisitor#visitLabel.

pack-priv Label
nextListElement

The next element in the list of labels to which this label belongs, or null if it does not belong to any list.

private int[]
otherLineNumbers

The source line numbers corresponding to this label, in addition to lineNumber, or null.

pack-priv Edge
outgoingEdges

The outgoing edges of the basic block corresponding to this label, in the control flow graph of its method.

pack-priv short
outputStackMax

The maximum height reached by the output stack, relatively to the top of the input stack, in the basic block corresponding to this label.

pack-priv short
outputStackSize

The number of elements in the output stack, at the end of the basic block corresponding to this label.

pack-priv short
subroutineId

The id of the subroutine to which this basic block belongs, or 0.

Constructor Summary

AccessConstructor and Description
public
Label()

Constructs a new label.

Method Summary

Modifier and TypeMethod and Description
pack-priv final void
accept(final MethodVisitor
a method visitor.
methodVisitor
,
final boolean
whether to visit of the label's source line numbers, if any.
visitLineNumbers
)

Makes the given visitor visit this label and its source line numbers, if applicable.

private void
addForwardReference(final int
the bytecode offset of the instruction that contains the reference stored at referenceHandle.
sourceInsnBytecodeOffset
,
final int referenceType, final int
the offset in the bytecode where the forward reference value must be stored.
referenceHandle
)

Adds a forward reference to this label.

pack-priv final void
addLineNumber(final int
a source line number (which should be strictly positive).
lineNumber
)

Adds a source line number corresponding to this label.

pack-priv final void
addSubroutineRetSuccessors(final Label
a basic block that ends with a jsr to the basic block corresponding to this label. This label is supposed to correspond to the start of a subroutine.
subroutineCaller
)

Finds the basic blocks that end a subroutine starting with the basic block corresponding to this label and, for each one of them, adds an outgoing edge to the basic block following the given subroutine call.

pack-priv final Label

Returns:

the label itself if frame is null, otherwise the Label's frame owner. This corresponds to the "canonical" label instance described above thanks to the way the label frame is set in MethodWriter#visitLabel.
getCanonicalInstance
()

Returns the "canonical" Label instance corresponding to this label's bytecode offset, if known, otherwise the label itself.

public int

Returns:

the bytecode offset corresponding to this label.
getOffset
()

Returns the bytecode offset corresponding to this label.

pack-priv final void
markSubroutine(final short
the id of the subroutine starting with the basic block corresponding to this label.
subroutineId
)

Finds the basic blocks that belong to the subroutine starting with the basic block corresponding to this label, and marks these blocks as belonging to this subroutine.

private Label

Returns:

the new list of blocks to process.
pushSuccessors
(final Label
a list of basic blocks to process, linked together with their nextListElement field.
listOfLabelsToProcess
)

Adds the successors of this label in the method's control flow graph (except those corresponding to a jsr target, and those already in a list of labels) to the given list of blocks to process, and returns the new list.

pack-priv final void
put(final ByteVector
the bytecode of the method. This is where the reference is appended.
code
,
final int
the bytecode offset of the instruction that contains the reference to be appended.
sourceInsnBytecodeOffset
,
final boolean
whether the reference must be stored in 4 bytes (instead of 2 bytes).
wideReference
)

Puts a reference to this label in the bytecode of a method.

pack-priv final boolean

Returns:

true if a blank that was left for this label was too small to store the offset. In such a case the corresponding jump instruction is replaced with an equivalent ASM specific instruction using an unsigned two bytes offset. These ASM specific instructions are later replaced with standard bytecode instructions with wider offsets (4 bytes instead of 2), in ClassReader.
resolve
(final byte[]
the bytecode of the method.
code
,
final int
the bytecode offset of this label.
bytecodeOffset
)

Sets the bytecode offset of this label to the given value and resolves the forward references to this label, if any.

public String

Returns:

a string representation of this label.
toString
()

Overrides java.lang.Object.toString.

Returns a string representation of this label.
Inherited from java.lang.Object:
cloneequalsfinalizegetClasshashCodenotifynotifyAllwaitwaitwait

Field Detail

bytecodeOffsetback to summary
pack-priv int bytecodeOffset

The offset of this label in the bytecode of its method, in bytes. This value is set if and only if the FLAG_RESOLVED flag is set.

EMPTY_LISTback to summary
pack-priv static final Label EMPTY_LIST

A sentinel element used to indicate the end of a list of labels.

See Also
nextListElement
FLAG_DEBUG_ONLYback to summary
pack-priv static final int FLAG_DEBUG_ONLY

A flag indicating that a label is only used for debug attributes. Such a label is not the start of a basic block, the target of a jump instruction, or an exception handler. It can be safely ignored in control flow graph analysis algorithms (for optimization purposes).

FLAG_JUMP_TARGETback to summary
pack-priv static final int FLAG_JUMP_TARGET

A flag indicating that a label is the target of a jump instruction, or the start of an exception handler.

FLAG_LINE_NUMBERback to summary
pack-priv static final int FLAG_LINE_NUMBER

A flag indicating that this label has at least one associated line number.

FLAG_REACHABLEback to summary
pack-priv static final int FLAG_REACHABLE

A flag indicating that a label corresponds to a reachable basic block.

FLAG_RESOLVEDback to summary
pack-priv static final int FLAG_RESOLVED

A flag indicating that the bytecode offset of a label is known.

FLAG_SUBROUTINE_CALLERback to summary
pack-priv static final int FLAG_SUBROUTINE_CALLER

A flag indicating that the basic block corresponding to a label ends with a subroutine call. By construction in MethodWriter#visitJumpInsn, labels with this flag set have at least two outgoing edges:

  • the first one corresponds to the instruction that follows the jsr instruction in the bytecode, i.e. where execution continues when it returns from the jsr call. This is a virtual control flow edge, since execution never goes directly from the jsr to the next instruction. Instead, it goes to the subroutine and eventually returns to the instruction following the jsr. This virtual edge is used to compute the real outgoing edges of the basic blocks ending with a ret instruction, in addSubroutineRetSuccessors.
  • the second one corresponds to the target of the jsr instruction,
FLAG_SUBROUTINE_ENDback to summary
pack-priv static final int FLAG_SUBROUTINE_END

A flag indicating that the basic block corresponding to a label is the end of a subroutine.

FLAG_SUBROUTINE_STARTback to summary
pack-priv static final int FLAG_SUBROUTINE_START

A flag indicating that the basic block corresponding to a label is the start of a subroutine.

flagsback to summary
pack-priv short flags

The type and status of this label or its corresponding basic block. Must be zero or more of FLAG_DEBUG_ONLY, FLAG_JUMP_TARGET, FLAG_RESOLVED, FLAG_REACHABLE, FLAG_SUBROUTINE_CALLER, FLAG_SUBROUTINE_START, FLAG_SUBROUTINE_END.

FORWARD_REFERENCE_HANDLE_MASKback to summary
pack-priv static final int FORWARD_REFERENCE_HANDLE_MASK

The bit mask to extract the 'handle' of a forward reference to this label. The extracted handle is the bytecode offset where the forward reference value is stored (using either 2 or 4 bytes, as indicated by the FORWARD_REFERENCE_TYPE_MASK).

See Also
forwardReferences
FORWARD_REFERENCE_TYPE_MASKback to summary
pack-priv static final int FORWARD_REFERENCE_TYPE_MASK

The bit mask to extract the type of a forward reference to this label. The extracted type is either FORWARD_REFERENCE_TYPE_SHORT or FORWARD_REFERENCE_TYPE_WIDE.

See Also
forwardReferences
FORWARD_REFERENCE_TYPE_SHORTback to summary
pack-priv static final int FORWARD_REFERENCE_TYPE_SHORT

The type of forward references stored with two bytes in the bytecode. This is the case, for instance, of a forward reference from an ifnull instruction.

FORWARD_REFERENCE_TYPE_WIDEback to summary
pack-priv static final int FORWARD_REFERENCE_TYPE_WIDE

The type of forward references stored in four bytes in the bytecode. This is the case, for instance, of a forward reference from a lookupswitch instruction.

FORWARD_REFERENCES_CAPACITY_INCREMENTback to summary
pack-priv static final int FORWARD_REFERENCES_CAPACITY_INCREMENT

The number of elements to add to the forwardReferences array when it needs to be resized to store a new forward reference.

forwardReferencesback to summary
private int[] forwardReferences

The forward references to this label. The first element is the number of forward references, times 2 (this corresponds to the index of the last element actually used in this array). Then, each forward reference is described with two consecutive integers noted 'sourceInsnBytecodeOffset' and 'reference':

  • 'sourceInsnBytecodeOffset' is the bytecode offset of the instruction that contains the forward reference,
  • 'reference' contains the type and the offset in the bytecode where the forward reference value must be stored, which can be extracted with FORWARD_REFERENCE_TYPE_MASK and FORWARD_REFERENCE_HANDLE_MASK.

For instance, for an ifnull instruction at bytecode offset x, 'sourceInsnBytecodeOffset' is equal to x, and 'reference' is of type FORWARD_REFERENCE_TYPE_SHORT with value x + 1 (because the ifnull instruction uses a 2 bytes bytecode offset operand stored one byte after the start of the instruction itself). For the default case of a lookupswitch instruction at bytecode offset x, 'sourceInsnBytecodeOffset' is equal to x, and 'reference' is of type FORWARD_REFERENCE_TYPE_WIDE with value between x + 1 and x + 4 (because the lookupswitch instruction uses a 4 bytes bytecode offset operand stored one to four bytes after the start of the instruction itself).

frameback to summary
pack-priv Frame frame

The input and output stack map frames of the basic block corresponding to this label. This field is only used when the MethodWriter#COMPUTE_ALL_FRAMES or MethodWriter#COMPUTE_INSERTED_FRAMES option is used.

infoback to summary
public Object info

A user managed state associated with this label.

Warning

this field is used by the ASM tree package. In order to use it with the ASM tree package you must override the getLabelNode method in MethodNode.

inputStackSizeback to summary
pack-priv short inputStackSize

The number of elements in the input stack of the basic block corresponding to this label. This field is computed in MethodWriter#computeMaxStackAndLocal.

LINE_NUMBERS_CAPACITY_INCREMENTback to summary
pack-priv static final int LINE_NUMBERS_CAPACITY_INCREMENT

The number of elements to add to the otherLineNumbers array when it needs to be resized to store a new source line number.

lineNumberback to summary
private short lineNumber

The source line number corresponding to this label, if FLAG_LINE_NUMBER is set. If there are several source line numbers corresponding to this label, the first one is stored in this field, and the remaining ones are stored in otherLineNumbers.

nextBasicBlockback to summary
pack-priv Label nextBasicBlock

The successor of this label, in the order they are visited in MethodVisitor#visitLabel. This linked list does not include labels used for debug info only. If the MethodWriter#COMPUTE_ALL_FRAMES or MethodWriter#COMPUTE_INSERTED_FRAMES option is used then it does not contain either successive labels that denote the same bytecode offset (in this case only the first label appears in this list).

nextListElementback to summary
pack-priv Label nextListElement

The next element in the list of labels to which this label belongs, or null if it does not belong to any list. All lists of labels must end with the EMPTY_LIST sentinel, in order to ensure that this field is null if and only if this label does not belong to a list of labels. Note that there can be several lists of labels at the same time, but that a label can belong to at most one list at a time (unless some lists share a common tail, but this is not used in practice).

List of labels are used in MethodWriter#computeAllFrames and MethodWriter#computeMaxStackAndLocal to compute stack map frames and the maximum stack size, respectively, as well as in markSubroutine and addSubroutineRetSuccessors to compute the basic blocks belonging to subroutines and their outgoing edges. Outside of these methods, this field should be null (this property is a precondition and a postcondition of these methods).

otherLineNumbersback to summary
private int[] otherLineNumbers

The source line numbers corresponding to this label, in addition to lineNumber, or null. The first element of this array is the number n of source line numbers it contains, which are stored between indices 1 and n (inclusive).

outgoingEdgesback to summary
pack-priv Edge outgoingEdges

The outgoing edges of the basic block corresponding to this label, in the control flow graph of its method. These edges are stored in a linked list of Edge objects, linked to each other by their Edge#nextEdge field.

outputStackMaxback to summary
pack-priv short outputStackMax

The maximum height reached by the output stack, relatively to the top of the input stack, in the basic block corresponding to this label. This maximum is always positive or null.

outputStackSizeback to summary
pack-priv short outputStackSize

The number of elements in the output stack, at the end of the basic block corresponding to this label. This field is only computed for basic blocks that end with a RET instruction.

subroutineIdback to summary
pack-priv short subroutineId

The id of the subroutine to which this basic block belongs, or 0. If the basic block belongs to several subroutines, this is the id of the "oldest" subroutine that contains it (with the convention that a subroutine calling another one is "older" than the callee). This field is computed in MethodWriter#computeMaxStackAndLocal, if the method contains JSR instructions.

Constructor Detail

Labelback to summary
public Label()

Constructs a new label.

Method Detail

acceptback to summary
pack-priv final void accept(final MethodVisitor methodVisitor, final boolean visitLineNumbers)

Makes the given visitor visit this label and its source line numbers, if applicable.

Parameters
methodVisitor:MethodVisitor

a method visitor.

visitLineNumbers:boolean

whether to visit of the label's source line numbers, if any.

addForwardReferenceback to summary
private void addForwardReference(final int sourceInsnBytecodeOffset, final int referenceType, final int referenceHandle)

Adds a forward reference to this label. This method must be called only for a true forward reference, i.e. only if this label is not resolved yet. For backward references, the relative bytecode offset of the reference can be, and must be, computed and stored directly.

Parameters
sourceInsnBytecodeOffset:int

the bytecode offset of the instruction that contains the reference stored at referenceHandle.

referenceType:int

either FORWARD_REFERENCE_TYPE_SHORT or FORWARD_REFERENCE_TYPE_WIDE.

referenceHandle:int

the offset in the bytecode where the forward reference value must be stored.

addLineNumberback to summary
pack-priv final void addLineNumber(final int lineNumber)

Adds a source line number corresponding to this label.

Parameters
lineNumber:int

a source line number (which should be strictly positive).

addSubroutineRetSuccessorsback to summary
pack-priv final void addSubroutineRetSuccessors(final Label subroutineCaller)

Finds the basic blocks that end a subroutine starting with the basic block corresponding to this label and, for each one of them, adds an outgoing edge to the basic block following the given subroutine call. In other words, completes the control flow graph by adding the edges corresponding to the return from this subroutine, when called from the given caller basic block.

Note

a precondition and postcondition of this method is that all labels must have a null nextListElement.

Parameters
subroutineCaller:Label

a basic block that ends with a jsr to the basic block corresponding to this label. This label is supposed to correspond to the start of a subroutine.

getCanonicalInstanceback to summary
pack-priv final Label getCanonicalInstance()

Returns the "canonical" Label instance corresponding to this label's bytecode offset, if known, otherwise the label itself. The canonical instance is the first label (in the order of their visit by MethodVisitor#visitLabel) corresponding to this bytecode offset. It cannot be known for labels which have not been visited yet.

This method should only be used when the MethodWriter#COMPUTE_ALL_FRAMES option is used.

Returns:Label

the label itself if frame is null, otherwise the Label's frame owner. This corresponds to the "canonical" label instance described above thanks to the way the label frame is set in MethodWriter#visitLabel.

getOffsetback to summary
public int getOffset()

Returns the bytecode offset corresponding to this label. This offset is computed from the start of the method's bytecode. This method is intended for Attribute sub classes, and is normally not needed by class generators or adapters.

Returns:int

the bytecode offset corresponding to this label.

Exceptions
IllegalStateException:
if this label is not resolved yet.
markSubroutineback to summary
pack-priv final void markSubroutine(final short subroutineId)

Finds the basic blocks that belong to the subroutine starting with the basic block corresponding to this label, and marks these blocks as belonging to this subroutine. This method follows the control flow graph to find all the blocks that are reachable from the current basic block WITHOUT following any jsr target.

Note

a precondition and postcondition of this method is that all labels must have a null nextListElement.

Parameters
subroutineId:short

the id of the subroutine starting with the basic block corresponding to this label.

pushSuccessorsback to summary
private Label pushSuccessors(final Label listOfLabelsToProcess)

Adds the successors of this label in the method's control flow graph (except those corresponding to a jsr target, and those already in a list of labels) to the given list of blocks to process, and returns the new list.

Parameters
listOfLabelsToProcess:Label

a list of basic blocks to process, linked together with their nextListElement field.

Returns:Label

the new list of blocks to process.

putback to summary
pack-priv final void put(final ByteVector code, final int sourceInsnBytecodeOffset, final boolean wideReference)

Puts a reference to this label in the bytecode of a method. If the bytecode offset of the label is known, the relative bytecode offset between the label and the instruction referencing it is computed and written directly. Otherwise, a null relative offset is written and a new forward reference is declared for this label.

Parameters
code:ByteVector

the bytecode of the method. This is where the reference is appended.

sourceInsnBytecodeOffset:int

the bytecode offset of the instruction that contains the reference to be appended.

wideReference:boolean

whether the reference must be stored in 4 bytes (instead of 2 bytes).

resolveback to summary
pack-priv final boolean resolve(final byte[] code, final int bytecodeOffset)

Sets the bytecode offset of this label to the given value and resolves the forward references to this label, if any. This method must be called when this label is added to the bytecode of the method, i.e. when its bytecode offset becomes known. This method fills in the blanks that where left in the bytecode by each forward reference previously added to this label.

Parameters
code:byte[]

the bytecode of the method.

bytecodeOffset:int

the bytecode offset of this label.

Returns:boolean

true if a blank that was left for this label was too small to store the offset. In such a case the corresponding jump instruction is replaced with an equivalent ASM specific instruction using an unsigned two bytes offset. These ASM specific instructions are later replaced with standard bytecode instructions with wider offsets (4 bytes instead of 2), in ClassReader.

toStringback to summary
public String toString()

Overrides java.lang.Object.toString.

Returns a string representation of this label.

Returns:String

a string representation of this label.

Annotations
@Override