Class Subroutines.SubroutineImpl

java.lang.Object
org.apache.bcel.verifier.structurals.Subroutines.SubroutineImpl
All Implemented Interfaces:
Subroutine
Enclosing class:
Subroutines

private final class Subroutines.SubroutineImpl extends Object implements Subroutine
This inner class implements the Subroutine interface.
  • Field Details

    • 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:
    • EMPTY_ARRAY

      private final Subroutines.SubroutineImpl[] EMPTY_ARRAY
    • 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 Set<InstructionHandle> instructions
      The instructions that belong to this subroutine.
    • theJSRs

      private final 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 Details

    • SubroutineImpl

      public SubroutineImpl()
      The default constructor.
  • Method Details

    • addEnteringJsrInstruction

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

      void addInstruction(InstructionHandle ih)
    • 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:
    • 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:
    • 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:
    • 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:
    • getRecursivelyAccessedLocalsIndicesHelper

      private void getRecursivelyAccessedLocalsIndicesHelper(Set<Integer> set, Subroutine[] subs)
      A recursive helper method for getRecursivelyAccessedLocalsIndices().
      See Also:
    • 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 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 Object