Class ControlFlowGraph.InstructionContextImpl

  • All Implemented Interfaces:
    InstructionContext
    Enclosing class:
    ControlFlowGraph

    private class ControlFlowGraph.InstructionContextImpl
    extends java.lang.Object
    implements InstructionContext
    Objects of this class represent a node in a ControlFlowGraph. These nodes are instructions, not basic blocks.
    • Field Detail

      • TAG

        private int TAG
        The TAG field is here for external temporary flagging, such as graph colouring.
        See Also:
        getTag(), setTag(int)
      • instruction

        private final InstructionHandle instruction
        The InstructionHandle this InstructionContext is wrapped around.
      • executionPredecessors

        private java.util.List<InstructionContext> executionPredecessors
        The 'execution predecessors' - a list of type InstructionContext of those instances that have been execute()d before in that order.
    • 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

      • _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,
                               java.util.ArrayList<InstructionContext> 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.
        Specified by:
        execute in interface InstructionContext
        Returns:
        true - if and only if the "outgoing" frame situation changed from the one before execute()ing.
        See Also:
        ControlFlowGraph, ExecutionVisitor, InstructionContext.getOutFrame(ArrayList)
      • 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 java.lang.String getExecutionChain()
        Returns the control flow execution chain. This is built while execute(Frame, ArrayList)-ing the code represented by the surrounding ControlFlowGraph.
      • 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)
        Description copied from interface: InstructionContext
        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.
        Specified by:
        setTag in interface InstructionContext
        See Also:
        InstructionContext.getTag()
      • toString

        public java.lang.String toString()
        Returns a simple String representation of this InstructionContext.
        Overrides:
        toString in class java.lang.Object