Class Subroutines.SubroutineImpl

  • All Implemented Interfaces:
    Subroutine
    Enclosing class:
    Subroutines

    private class Subroutines.SubroutineImpl
    extends java.lang.Object
    implements Subroutine
    This inner class implements the Subroutine interface.
    • Field Detail

      • UNSET

        private static final int UNSET
        UNSET, a symbol for an uninitialized localVariable field. This is used for the "top-level" Subroutine; i.e. no subroutine.
        See Also:
        Constant Field Values
      • localVariable

        private int localVariable
        The Local Variable slot where the first instruction of this subroutine (an ASTORE) stores the JsrInstruction's ReturnAddress in and the RET of this subroutine operates on.
      • instructions

        private final java.util.Set<InstructionHandle> instructions
        The instructions that belong to this subroutine.
      • theJSRs

        private final java.util.Set<InstructionHandle> theJSRs
        The JSR or JSR_W instructions that define this subroutine by targeting it.
      • theRET

        private InstructionHandle theRET
        The RET instruction that leaves this subroutine.
    • Constructor Detail

      • SubroutineImpl

        public SubroutineImpl()
        The default constructor.
    • Method Detail

      • addEnteringJsrInstruction

        public void addEnteringJsrInstruction​(InstructionHandle jsrInst)
        Adds a new JSR or JSR_W that has this subroutine as its target.
      • contains

        public boolean contains​(InstructionHandle inst)
        Description copied from interface: Subroutine
        Returns if the given InstructionHandle refers to an instruction that is part of this subroutine. This is a convenience method that saves iteration over the InstructionHandle objects returned by getInstructions().
        Specified by:
        contains in interface Subroutine
        Parameters:
        inst - The InstructionHandle to test.
        Returns:
        Whether the given InstructionHandle refers to an instruction that is part of this subroutine.
        See Also:
        Subroutine.getInstructions()
      • getAccessedLocalsIndices

        public int[] getAccessedLocalsIndices()
        Description copied from interface: Subroutine
        Returns an int[] containing the indices of the local variable slots accessed by this Subroutine (read-accessed, write-accessed or both); local variables referenced by subroutines of this subroutine are not included.
        Specified by:
        getAccessedLocalsIndices in interface Subroutine
        Returns:
        An int[] containing the indices of the local variable slots.
        See Also:
        Subroutine.getRecursivelyAccessedLocalsIndices()
      • getEnteringJsrInstructions

        public InstructionHandle[] getEnteringJsrInstructions()
        Description copied from interface: Subroutine
        Returns all the JsrInstructions that have the first instruction of this subroutine as their target. Must not be invoked on the 'top-level subroutine'.
        Specified by:
        getEnteringJsrInstructions in interface Subroutine
        Returns:
        The JsrInstructions that have the first instruction of this subroutine as their target.
      • getInstructions

        public InstructionHandle[] getInstructions()
        Description copied from interface: Subroutine
        Returns all instructions that together form this subroutine. Note that an instruction is part of exactly one subroutine (the top-level code is considered to be a special subroutine) - else it is not reachable at all (dead code).
        Specified by:
        getInstructions in interface Subroutine
        Returns:
        All instructions that together form this subroutine.
      • getLeavingRET

        public InstructionHandle getLeavingRET()
        Description copied from interface: Subroutine
        Returns the one and only RET that leaves the subroutine. Note that JustIce has a pretty rigid notion of a subroutine. Must not be invoked on the 'top-level subroutine'.
        Specified by:
        getLeavingRET in interface Subroutine
        Returns:
        The one and only RET that leaves the subroutine.
        See Also:
        Subroutines
      • getRecursivelyAccessedLocalsIndices

        public int[] getRecursivelyAccessedLocalsIndices()
        Description copied from interface: Subroutine
        Returns an int[] containing the indices of the local variable slots accessed by this Subroutine (read-accessed, write-accessed or both); local variables referenced by subroutines of this subroutine are included.
        Specified by:
        getRecursivelyAccessedLocalsIndices in interface Subroutine
        Returns:
        An int[] containing the indices of the local variable slots.
        See Also:
        Subroutine.getAccessedLocalsIndices()
      • getRecursivelyAccessedLocalsIndicesHelper

        private void getRecursivelyAccessedLocalsIndicesHelper​(java.util.Set<java.lang.Integer> set,
                                                               Subroutine[] subs)
        A recursive helper method for getRecursivelyAccessedLocalsIndices().
        See Also:
        getRecursivelyAccessedLocalsIndices()
      • setLeavingRET

        void setLeavingRET()
        Sets the leaving RET instruction. Must be invoked after all instructions are added. Must not be invoked for top-level 'subroutine'.
      • setLocalVariable

        void setLocalVariable​(int i)
      • subSubs

        public Subroutine[] subSubs()
        Description copied from interface: Subroutine
        Returns the subroutines that are directly called from this subroutine.
        Specified by:
        subSubs in interface Subroutine
        Returns:
        The subroutines that are directly called from this subroutine.
      • toString

        public java.lang.String toString()
        Returns a String representation of this object, merely for debugging purposes. (Internal) Warning: Verbosity on a problematic subroutine may cause stack overflow errors due to recursive subSubs() calls. Don't use this, then.
        Overrides:
        toString in class java.lang.Object