org.apache.bcel.verifier.structurals
Class ControlFlowGraph.InstructionContextImpl
java.lang.Object
org.apache.bcel.verifier.structurals.ControlFlowGraph.InstructionContextImpl
- ControlFlowGraph
- InstructionContext
private class ControlFlowGraph.InstructionContextImpl
extends java.lang.Object
Objects of this class represent a node in a ControlFlowGraph.
These nodes are instructions, not basic blocks.
private int | TAG - The TAG field is here for external temporary flagging, such
as graph colouring.
|
private ArrayList | executionPredecessors - The 'execution predecessors' - a list of type InstructionContext
of those instances that have been execute()d before in that order.
|
private Map | inFrames - The 'incoming' execution Frames.
|
private InstructionHandle | instruction - The InstructionHandle this InstructionContext is wrapped around.
|
private Map | outFrames - The 'outgoing' execution Frames.
|
private InstructionHandle[] | _getSuccessors() - A utility method that calculates the successors of a given InstructionHandle
That means, a RET does have successors as defined here.
|
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.
|
private void | extendMessageWithFlow(StructuralCodeConstraintException e) - Extends the StructuralCodeConstraintException ("e") object with an at-the-end-extended message.
|
ExceptionHandler[] | getExceptionHandlers() - Returns the exception handlers of this instruction.
|
private String | getExecutionChain() - Returns the control flow execution chain.
|
Frame | getInFrame()
|
InstructionHandle | getInstruction() - Returns the InstructionHandle this InstructionContext is wrapped around.
|
Frame | getOutFrame(ArrayList execChain) - Returns a clone of the "outgoing" frame situation with respect to the given ExecutionChain.
|
InstructionContext[] | getSuccessors() - Returns the usual control flow successors.
|
int | getTag() - The getTag and setTag methods may be used for
temporary flagging, such as graph colouring.
|
private ControlFlowGraph.InstructionContextImpl | lastExecutionJSR() - Returns the InstructionContextImpl with an JSR/JSR_W
that was last in the ExecutionChain, without
a corresponding RET, i.e.
|
private boolean | mergeInFrames(Frame inFrame) - Does the actual merging (vmspec2, page 146).
|
void | setTag(int tag) - The getTag and setTag methods may be used for
temporary flagging, such as graph colouring.
|
String | toString() - Returns a simple String representation of this InstructionContext.
|
TAG
private int TAG
The TAG field is here for external temporary flagging, such
as graph colouring.
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.
InstructionContextImpl
public InstructionContextImpl(InstructionHandle inst)
Creates an InstructionHandleImpl object from an InstructionHandle.
Creation of one per InstructionHandle suffices. Don't create more.
_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.
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.
- execute in interface InstructionContext
- 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.
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.
getOutFrame
public Frame getOutFrame(ArrayList execChain)
Returns a clone of the "outgoing" frame situation with respect to the given ExecutionChain.
- getOutFrame in interface InstructionContext
getTag
public int getTag()
The getTag and setTag methods may be used for
temporary flagging, such as graph colouring.
Nothing in the InstructionContext object depends
on the value of the tag. JustIce does not use it.
- getTag in interface InstructionContext
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)
The getTag and setTag methods may be used for
temporary flagging, such as graph colouring.
Nothing in the InstructionContext object depends
on the value of the tag. JustIce does not use it.
- setTag in interface InstructionContext
toString
public String toString()
Returns a simple String representation of this InstructionContext.