org.apache.bcel.verifier.structurals

Class ControlFlowGraph.InstructionContextImpl

private class ControlFlowGraph.InstructionContextImpl extends Object implements InstructionContext

Objects of this class represent a node in a ControlFlowGraph. These nodes are instructions, not basic blocks.
Field Summary
ArrayListexecutionPredecessors
The 'execution predecessors' - a list of type InstructionContext of those instances that have been execute()d before in that order.
MapinFrames
The 'incoming' execution Frames.
InstructionHandleinstruction
The InstructionHandle this InstructionContext is wrapped around.
MapoutFrames
The 'outgoing' execution Frames.
intTAG
The TAG field is here for external temporary flagging, such as graph colouring.
Constructor Summary
InstructionContextImpl(InstructionHandle inst)
Creates an InstructionHandleImpl object from an InstructionHandle.
Method Summary
booleanexecute(Frame inFrame, ArrayList execPreds, InstConstraintVisitor icv, ExecutionVisitor ev)
"Merges in" (vmspec2, page 146) the "incoming" frame situation; executes the instructions symbolically and therefore calculates the "outgoing" frame situation.
voidextendMessageWithFlow(StructuralCodeConstraintException e)
Extends the StructuralCodeConstraintException ("e") object with an at-the-end-extended message.
ExceptionHandler[]getExceptionHandlers()
Returns the exception handlers of this instruction.
StringgetExecutionChain()
Returns the control flow execution chain.
FramegetInFrame()
InstructionHandlegetInstruction()
FramegetOutFrame(ArrayList execChain)
Returns a clone of the "outgoing" frame situation with respect to the given ExecutionChain.
InstructionContext[]getSuccessors()
intgetTag()
ControlFlowGraph.InstructionContextImpllastExecutionJSR()
Returns the InstructionContextImpl with an JSR/JSR_W that was last in the ExecutionChain, without a corresponding RET, i.e. we were called by this one.
booleanmergeInFrames(Frame inFrame)
Does the actual merging (vmspec2, page 146).
voidsetTag(int tag)
StringtoString()
Returns a simple String representation of this InstructionContext.
InstructionHandle[]_getSuccessors()
A utility method that calculates the successors of a given InstructionHandle That means, a RET does have successors as defined here.

Field Detail

executionPredecessors

private ArrayList executionPredecessors
The 'execution predecessors' - a list of type InstructionContext of those instances that have been execute()d before in that order.

inFrames

private Map inFrames
The 'incoming' execution Frames.

instruction

private InstructionHandle instruction
The InstructionHandle this InstructionContext is wrapped around.

outFrames

private Map outFrames
The 'outgoing' execution Frames.

TAG

private int TAG
The TAG field is here for external temporary flagging, such as graph colouring.

See Also: getTag InstructionContextImpl

Constructor Detail

InstructionContextImpl

public InstructionContextImpl(InstructionHandle inst)
Creates an InstructionHandleImpl object from an InstructionHandle. Creation of one per InstructionHandle suffices. Don't create more.

Method Detail

execute

public boolean execute(Frame inFrame, ArrayList execPreds, InstConstraintVisitor icv, ExecutionVisitor ev)
"Merges in" (vmspec2, page 146) the "incoming" frame situation; executes the instructions symbolically and therefore calculates the "outgoing" frame situation. Returns: True iff the "incoming" frame situation changed after merging with "inFrame". The execPreds ArrayList must contain the InstructionContext objects executed so far in the correct order. This is just one execution path [out of many]. This is needed to correctly "merge" in the special case of a RET's successor. The InstConstraintVisitor and ExecutionVisitor instances must be set up correctly.

Returns: true - if and only if the "outgoing" frame situation changed from the one before execute()ing.

extendMessageWithFlow

private void extendMessageWithFlow(StructuralCodeConstraintException e)
Extends the StructuralCodeConstraintException ("e") object with an at-the-end-extended message. This extended message will then reflect the execution flow needed to get to the constraint violation that triggered the throwing of the "e" object.

getExceptionHandlers

public ExceptionHandler[] getExceptionHandlers()
Returns the exception handlers of this instruction.

getExecutionChain

private String getExecutionChain()
Returns the control flow execution chain. This is built while execute(Frame, ArrayList)-ing the code represented by the surrounding ControlFlowGraph.

getInFrame

public Frame getInFrame()

getInstruction

public InstructionHandle getInstruction()

getOutFrame

public Frame getOutFrame(ArrayList execChain)
Returns a clone of the "outgoing" frame situation with respect to the given ExecutionChain.

getSuccessors

public InstructionContext[] getSuccessors()

getTag

public int getTag()

lastExecutionJSR

private ControlFlowGraph.InstructionContextImpl lastExecutionJSR()
Returns the InstructionContextImpl with an JSR/JSR_W that was last in the ExecutionChain, without a corresponding RET, i.e. we were called by this one. Returns null if we were called from the top level.

mergeInFrames

private boolean mergeInFrames(Frame inFrame)
Does the actual merging (vmspec2, page 146). Returns true IFF this.inFrame was changed in course of merging with inFrame.

setTag

public void setTag(int tag)

toString

public String toString()
Returns a simple String representation of this InstructionContext.

_getSuccessors

private InstructionHandle[] _getSuccessors()
A utility method that calculates the successors of a given InstructionHandle That means, a RET does have successors as defined here. A JsrInstruction has its target as its successor (opposed to its physical successor) as defined here.